본문 바로가기

Computer Sience70

[Effective Java] 아이템9: try-finally 보다는 try-with-resources를 사용하라 Chapter 02: 객체 생성과 파괴객체를 만들어야 할 때와 만들지 말아야 할 때를 구분하는 법올바른 객체 생성 방법에 대한 설명 자바 라이브러리에는 close 메소드를 호출해 직접 닫아줘야 하는 자원이 많다. 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이어지기도 한다. 전통적인 수단 try-finally전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 쓰였다. public class Resource1 implements AutoCloseable{ @Override public void close() { System.out.println("Resource1 close"); throw new RuntimeException.. 2024. 10. 27.
[Effective Java] 아이템8: finalizer와 cleaner 사용을 피하라 Chapter 02: 객체 생성과 파괴객체를 만들어야 할 때와 만들지 말아야 할 때를 구분하는 법올바른 객체 생성 방법에 대한 설명Finalizer와 Cleaner자바는 2가지 소멸자를 제공한다. (Finalizer & Cleaner) Finalizer는 예측 불가능하고, 위험하며, 대부분 불필요하다. 오동작, 낮은 성능, 이식성 문제의 원인이 된다. Cleaner 또한 Finalizer 보다 덜 위험하지만, 여전히 예측할 수 없고, Finalizer 단점과 거의 비슷하다.   Finalizer 이식성 문제 자바 9에서 Finalizer를 deprecated API로 지정하고 Cleaner를 그 대안으로 소개했다.  자바에서의 자원 회수 try-with-resourcestry-finally  Finali.. 2024. 10. 27.
[Effective Java] 아이템7: 다 쓴 객체 참조를 해제하라 Chapter 02: 객체 생성과 파괴객체를 만들어야 할 때와 만들지 말아야 할 때를 구분하는 법올바른 객체 생성 방법에 대한 설명개요 C, C++ 처럼 메모리를 직접 관리해야 하는 언어를 쓰다가 자바처럼 가비지 컬렉터(GC)를 갖춘 언어로 넘어오면 프로그래머의 삶이 훨씬 평안해진다.그래서 메모리 관리에 더 이상 신경 쓰지 않아도 된다고 오해할 수 있다. 메모리 누수 예제 - Stack public class Stack { public Object [] elements; // test 위한 public private int index = 0; // size -> index private static final int DEFAULT_INITIAL_CAPACITY = 16; publi.. 2024. 10. 27.
[Effective Java] 아이템6: 불필요한 객체 생성을 피하라 Chapter 02: 객체 생성과 파괴객체를 만들어야 할 때와 만들지 말아야 할 때를 구분하는 법올바른 객체 생성 방법에 대한 설명불필요한 객체 생성을 피하라똑같은 기능의 객체를 새로 만드는 대신 개체 하나를 재사용하는 것이 대부분 적절하다. 재사용을 하면 성능적인 측면에서 더 빠르다. 특히 불변 객체는 언제든 재사용할 수 있다.문자열 객체 생성 public class StringTest { public static void main(String[] args) { String name1 = "jeu"; String name2 = "jeu"; System.out.println(name1 == name2); // true String str1 = new.. 2024. 10. 26.
[Effective Java] 아이템5: 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 Chapter 02: 객체 생성과 파괴객체를 만들어야 할 때와 만들지 말아야 할 때를 구분하는 법올바른 객체 생성 방법에 대한 설명잘못된 사례1많은 클래스는 하나 이상의 자원에 의존한다. 책에서는 예시로 맞춤법 검사기(Spell Checker)와 맞춤법 검사기가 의존하는 사전(Dictionary)을 예시로 들고 있다.  맞춤법 검사기가 정적 유틸리티 클래스 구조를 가진다면?public interface Lexicon {}public class KoreanDictionary implements Lexicon{}public class SpellChecker { private static final Lexicon dictionary = new KoreanDictionary(); private Spe.. 2024. 10. 26.
[Effective Java] 아이템4: 인스턴스화를 막으려거든 private 생성자를 사용하라 Chapter 02: 객체 생성과 파괴객체를 만들어야 할 때와 만들지 말아야 할 때를 구분하는 법올바른 객체 생성 방법에 대한 설명유틸성 클래스 단순히 정적 메소드와 정적 필드를 담은 클래스 이런 클래스는 인스턴스화를 할 필요가 없다 → 인스턴스화를 막아보자.  이런 유틸 성격을 가지는 클래스는 자바 / 스프링 쉽게 찾아볼 수 있다. java.lang.Math java.util.Arraysjava.util.Collections Collections는 특정 인터페이스의 구현하는 객체들을 생성해 주는 정적 팩토리 메소드를 모아놓았다. 사용자는 해당 구현체를 몰라도 사용할 수 있다는 관점에서 알아야 하는 개념적인 무게가 줄었다고 볼 수 있다. public final class Math { private .. 2024. 10. 26.