이펙티브 자바
이펙티브 자바, 쉽게 정리하기 - item9. try-finally보다는 try-with-resources를 사용하라
try-finally보다는 try-with-resources를 사용하라 자바 라이브러리 내부의 close() 메서드 자바에서는 종종 .close() 메서드를 통해 자원을 닫아줘야 하는 경우가 있다. 주로 외부의 리소스를 사용했을 때이다. 외부의 리소스는 로컬 PC 환경에 존재하는 리소스일 수도 있고, 네트워크로 연결된 다른 컴퓨터에 존재하는 리소스(Connection)일 수도 있다. finalizer를 안전망으로 활용하긴 하지만, item8에서 배웠듯 딱히 믿을만하진 않다. try-finally를 이용하여 리소스 닫기 예제 1 - 반환할 자원이 1개일 때 static String firstLineOfFile(String path) throws IOException { BufferedReader br = ..
이펙티브 자바, 쉽게 정리하기 - item8. finalizer와 cleaner 사용을 피하라
finalizer와 cleaner의 사용을 피하라 자바가 제공하는 객체 소멸자 자바에서는 2가지 객체 소멸자를 제공한다. finalizer와 cleaner이다. 그러나, 이 두 소멸자는 기본적으로 쓰지 말아야 한다. 이후에 나오지만 try-catch-with-resources 방식이 권장된다. finalizer와 cleaner를 지양해야 하는 이유 가비지 컬렉터에 의해 실행이 결정되며, 즉시 실행된다는 보장은 없다. 객체에 접근하지 못하게 된 뒤로 finalizer나 cleaner가 실행되는데 얼마나 소요되는지 알 수 없다. finalizer와 cleaner가 즉시 실행된다는 보장이 없을 때 생기는 문제 ex) 시스템이 동시에 열 수 있는 파일의 갯수는 한정되어 있다. 열었던 파일을 닫아주지 않으면, 더..
이펙티브 자바, 쉽게 정리하기 - item7. 다 쓴 객체 참조를 해제하라
다 쓴 객체 참조를 해제하라 Stack 코드의 예제 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) { throw new EmptyStackException(); } return elements[--size]; } pri..
이펙티브 자바, 쉽게 정리하기 - item6. 불필요한 객체 생성을 피하라
불필요한 객체 생성을 피하라 객체 생성의 비용 객체를 매번 생성하고 지우는 것은 반복적으로 발생했을 때 큰 비용이 될 수 있다. 물론 현대 컴퓨터의 성능이 많이 좋아서 작은 객체는 큰 부담이 되지 않을 수도 있다. 계속 같은 내용의 객체를 사용할 것이라면 불변 객체를 만들어놓고 재사용하는 것이 좋다. 불필요한 객체 생성의 예 String 객체의 예 String s = new String("bikini"); 위 코드는 안티패턴이다. 결국 bikini라는 문자열을 사용하고 싶은 건데, 굳이 JVM 문자열 풀에서 가져오지 않을 이유가 없다. String s = "bikini"; 더 간결하면서도 더 옳은 코드이다. Boolean 객체의 예 Boolean boolean = new Boolean(true); 과연 ..
이펙티브 자바, 쉽게 정리하기 - item5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 정적 유틸리티 클래스와 싱글턴 클래스의 남용 문제 정적 유틸리티 클래스로 구현한 맞춤법 검사기 살펴보기 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // 인스턴스 생성 방지 public static boolean isValid(String word) { ... } public static String suggestions(String typo) { ... } } 이전에 우리는 정적 유틸리티 클래스를 배웠다. 위의 코드는 정적 유틸리티 클래스를 활용한 맞춤법 검사기의 예이다. 싱글턴 클래스로 구현한 맞춤법 검사기 살펴보..
이펙티브 자바, 쉽게 정리하기 - item3. private 생성자나 열거 타입으로 싱글턴임을 보증하라
private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴 패턴의 쓰임새 무상태 객체 (오직 메서드 실행을 위해 쓰이는 객체 등) 설계상 유일해야 하는 시스템 컴포넌트 싱글턴 패턴의 단점 싱글턴 객체를 사용하는 클라이언트의 테스트가 어려워짐 mock이 어려워진다. 싱글턴 구현법 생성자를 private으로 숨긴다. 인스턴스를 public static final 멤버에 생성해놓고 불러 쓴다. 인스턴스는 private static final 멤버에 넣어놓고, 공개된 public static 메서드로 불러 쓴다. INSTANCE 자체를 public으로 공개하기 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elv..