본문 바로가기

Reading

(65)
[Effective-Java] Item 9. try-finally보다는 try-with-resources를 사용하라 자바 라이브러리에는 close() 메소드를 호출해 직접 닫아줘야 하는 자원이 많다. InputStream, OutputStream, java.sql.Connection 등이 예시다. 자원 닫기는 클라이언트가 놓치기 쉬워 성능 문제로 이어지기도 하는데, finalizer는 믿을 수 없으니 try-finally가 쓰였다. try-finally try-finally는 두가지 단점을 가진다. 1. 마지막에 나온 예외가 앞의 예외들을 집어삼킨다. 만약 물리적 이슈로 readLine 메소드가 예외를 던지고, 같은 이유로 close() 메소드도 실패를 하며 예외를 던진다면 close()에서 발생한 예외가 br.readLine()에 대한 예외를 집어 삼킨다. 즉, 첫번째 예외에 관한 정보가 남지 않아 실제 시스템에서 ..
[Effective-Java] Item 8. finalizer와 cleaner 사용을 피하라 자바의 두 가지 객체 소멸자 finalizer: 예측할 수 없고 상황에 따라 위험할 수 있어 일반적으로 불필요하다. 오동작, 낮은 성능(finalize 메소드 실행하기에), 이식성(이식성의 문제는 deprecated 되어서?) 문제의 원인이 되기도 한다. cleaner: 자바 9로오며 finalizer가 deprecated API로 지정되고 그 대안으로 소개되었는데, 별도의 쓰레드를 사용해 finalizer보다는 덜 위험하지만 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다. public class FinalizerExample { // 어떤 클래스라도 오버라이딩해서 만들 수 있다. GC가 될때 이 메소드가 호출되는데, 언제 될지 예측할 수 없다. // GC대상이 된다고 해서 바로 호출되는게 아니..
[Effective-Java] Item 7. 다 쓴 객체 참조를 해제하라 (+Java Reference와 GC) 자바에 가비지 콜렉터가 있어서 메모리 관리에 더 이상 신경쓰지 않아도 된다고 생각하는데, 이는 아니다. 다 쓴 객체는 GC가 회수할 수 있게 null 처리하자 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { this.elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { this.ensureCapacity(); this.elements[size++] = e; } public Object pop() { if (siz..
[Effective-Java] Item 6. 불필요한 객체 생성을 피하라 문자열 객체 재사용과 정적 팩토리 메소드 똑같은 기능의 객체를 매번 생성하기 보다는 객체 하나를 재사용하는 게 대부분 적절하고, 불변 객체는 언제든 재사용할 수 있다. @Test @DisplayName("리터럴과 새로운 인스턴스") public void instanceTest() throws Exception { // 매번 새로운 인스턴스를 만든다. 사용X String s = new String("k____tae"); Boolean b = new Boolean("true"); // 매번 같은 인스턴스를 반환하는게 보장. 리터럴과 정적 팩토리 메소드 String s2 = "k____tae"; Boolean b2 = Boolean.valueOf("true"); assertNotSame(s,s2); asser..