개발서적/Effective Java
[Effective Java] @Override 애너테이션을 일관되게 사용하라
@Override를 사용하지 않았을 때 버그의 발생 import java.util.HashSet; public class Bigram { private final char first; private final char second; public boolean equals(Biagram b) { ... } public int hashCode() { return ...; } public static void main(String[] args) { Set s = new HashSet(); for(int i = 0; i < 10; i++) { for(char ch = 'a'; ch
[Effective Java] 명명 패턴보다 애너테이션을 사용하라
명명 패턴 특별히 다뤄야 할 프로그램 요소에는 구분되는 명명패턴을 이용했다. 예를 들어 JUnit은 테스트 메서드 이름이 test로 시작하게끔 했었다. 이런 명명 패턴은 다음과 같은 문제가 있다. 타입 세이프 하지 않다. tsetSaftey라고 적으면 JUnit은 이를 인지하지 못한다. 올바른 프로그램 요소에서만 사용된다는 보장이 없다. -> 클래스의 이름에 test를 붙여도 클래스에는 적용되지 않는다. 프로그램 요소를 매개변수로 전달할 방법이 없다. -> 예외 테스트가 힘들다. 애너테이션 @Retention가 @Target이라는 메타 어노테이션을 이용해 애너테이션의 라이프사이클을 지정하고 사용자가 올바른 프로그램 요소에 사용할 수 있도록 도와준다. 이러한 마커 애너테이션은 잘못 사용하면 컴파일 타임에 ..
[Effective Java] 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라
확장할 수 없는 열거 타입 열거 타입은 확장할 수 없다. 이유는 다음과 같다. 확장한 타입의 원소는 기반 타입의 원소로 취급하지만, 그 반대는 성립하지 않는다는 어딘가 조금 이상하다. 기반 타입과 확장된 타입들의 원소 모두를 순회할 방법도 마땅치 않다. 화작성을 높이려면 고려할 요소가 늘어나 설계와 구현이 더 복잡해진다. 그럼에도 불구하고 확장할 수 있는 열거 타입이 필요할 때가 있다. 이때는 인터페이스를 이용하면 된다. 인터페이스를 이용한 확장 열거 타입이 임의의 인터페이스를 구현할 수 있기 때문에 꼭 정의해야 하는 메서드를 정의한 부모 인터페이스를 정의하고 이를 열거 타입에서 구현할 수 있다. public interface Operation { double apply(double x, double y..
[Effective Java] ordinal 인덱싱 대신 EnumMap을 사용하라
ordinal의 잘못된 사용 이따금 배열이나 리스트에서 원소를 꺼낼 때 ordinal 메서드로 인덱스를 얻는 코드가 있다. public class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } final String name; final LifeCycle lifeCycle; public Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return name; } } public class Client { public static void main(String[] args) { S..
[Effective Java] 비트 필드 대신 EnumSet을 사용하라
비트 필드 비트 필드는 비트 연산을 통해 합집합과 교집합 같은 연산을 효율적으로 할 수 있도록 도와준다. 예를 들어 다음 코드를 보자. public class Text { public static final int STYLE_BOLD = 0; public static final int STYLE_ITALIC = 1; public static final int STYLE_UNDERLINE = 4; public static final int STYLE_STRIKETHROUGH = 8; ... } 각각을 비트 필드로 표현해보면 다음과 같다. 비트 필드의 문제는 다음과 같다. 비트 필드의 값이 그대로 출력되면 단순한 정수 열거 상수를 출력할 때보다 해석하기가 어렵다. 비트 필드 : { 0101 }, { STYL..