개발서적
[Effective Java] equals는 일반 규약을 지켜 재정의하라
equals의 재정의가 필요 없는 경우 다음과 같은 상황에서는 equals 메서드의 재정의가 필요하지 않다. 각 인스턴스가 본질적으로 고유하다. => 값을 표현하는 것이 아니라 동작하는 개체를 표현하는 클래스가 해당된다. => Thread가 좋은 예로 Object의 equals는 이러한 클래스에 딱 맞게 구현되어 있다. 인스턴스의 논리적 동치성을 검사할 일이 없다. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없다. 다음과 같이 equals가 실수로 호출되는 것을 막을 수 있다. @Override public boolean equals(Object o) { throw new Asser..
[Effective Java] try-finally보다는 try-with-resources를 사용하라
close() 메서드 호출의 필요성 자바 라이브러리에는 InputStream, OutputStream처럼 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이어진다. 이를 막이 위해, 이런 자원 중 상당수가 finalizr를 활용하고 있지만 finalizer는 자원의 반환을 보장하지는 않는다. try-finally-catch 전통적으로 자원이 제대로 닫힘을 보장하기 위해 try-finally가 사용되었다. 하지만 이 방식은 중첩 try-catch문이 생기면 코드가 지저분해지는 문제가 있다. 심지어 try-finally 문을 제대로 작성한 다음 코드에도 문제가 있다. static String firstLineOfFile(Stri..
[Effective Java] finalizer와 cleaner 사용을 피하라
두 가지 객체 소멸자 자바는 두 가지 객체 소멸자를 제공한다. 첫 번째는 finalizer이고, 두 번째는 cleaner이다. 기본적으로 이 두가지 객체 소멸자는 가능한 사용을 지양해야 한다. 그 이유는 다음과 같다. JVM 알고리즘에 따라 실행이 언제되는지 알 수 없다. 수행 여부조차 보장하지 않는다. finalizer 동작 중 발생한 예외는 무시되며, 처리할 작업이 남아있어도 바로 종료된다. => fianlizer 공격에 노출되어 심각한 보안 문제를 일으키기도 한다. => 예를 들어 생성자나 직렬화 과정에서 예외가 발생하면, 불안정하게 생성된 객체에서 악의적인 하위 클래스의 finalizer가 수행될 수 있게 된다. 자바 9부터는 finalizer는 사용 자제 API로 지정하고 그 대안으로 clean..
[Effective Java] 다 쓴 객체 참조를 해제하라
메모리 관리 메모리를 직접 관리하는 언어인 C, C++과는 달리 자바는 가비지 컬렉터가 다 쓴 객체를 알아서 회수해준다. 하지만 가비지 컬렉터가 다 쓴 객체를 인식 못하는 경우도 있다. 메모리 누수 - Stack 다음은 스택을 간단한 코드이다. 여기서 메모리 누수가 일어나는 부분을 찾아보자. import java.util.EmptyStackException; public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITAL_CAPACITY]; } publ..
[Effective Java] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
싱글턴과 정적 유틸리티 클래스를 잘못 사용한 예 많은 클래스가 하나 이상의 자원에 의존하고 있는데, 사용하는 자원에 따라 동작이 달라지는 클래스에는 싱글턴과 정적 유틸리티 클래스 사용은 지양해야 한다. 예를 들어 사전에 의존하는 맞춤법 검사기를 예로 들어보자. 1. 정적 유틸리티를 잘못 사용한 예 public class SpellCheckerStatic { private static final Dictionary dictionary = new Dictionary(); private SpellCheckerStatic() {} ... } 2. 싱글톤을 잘못 사용한 예 public class SpellCheckerSingleton { private static final Dictionary dictionary..