Java/Effective Java
-
[Effective Java] Item 34. int 상수 대신 열거 타입을 사용하라Java/Effective Java 2020. 9. 15. 20:58
상수 열거 패턴 public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLOOD = 2; 위의 코드처럼 정수 상수를 한 묶음으로 모아서 선언해놓은 것이 정수 열거 패턴입니다. 정수 열거 패턴의 단점 정수 열거 패턴에는 타입 안전을 보장할 수 없습니다. 예를 들어 오렌지를 건네야 할 메서드에 사과를 보내고 동등 연산자(==)로..
-
[Effective Java] Item 33. 타입 안전 이종 컨테이너를 고려하라Java/Effective Java 2020. 9. 12. 13:54
제네릭은 Set, Map 등의 컬렉션과 ThreadLocal, AtomicReference 등의 단일원소 컨테이너에도 흔히 쓰입니다. 이런 모든 쓰임에서 매개변수화되는 대상은 (원소가 아닌) 컨테이너 자신입니다. 따라서 하나의 컨테이너에서 매개변수화할 수 있는 타입의 수가 제한됩니다. 이보다 유연한 수단이 필요하다면 타입 안전 이종 컨테이너를 이용하면 됩니다. 타입 안전 이종 컨테이너 패턴 (type safe heterogeneous container pattern) 컨테이너에 값을 넣거나 뺄 때 매개변수화한 키를 함께 제공합니다. 즉, 각 타입의 Class 객체를 매개변수화한 키 역할로 사용하는 것입니다. class 리터럴의 타입은 Class가 아닌 Class입니다. 예를 들어, String.class..
-
[Effective Java] Item 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라Java/Effective Java 2020. 9. 10. 23:30
가변인수 가변인수는 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해줍니다. 형태는 다음과 같습니다. public static void example(String... args) { //.... } 가변인수 메서드는 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어집니다. 하지만 내부로 감춰야 했을 이 배열이 클라이언트에 노출된다는 문제점이 있습니다. 그 결과로 varargs 매개변수에 제네릭이나 매개변수화 타입이 포함되면 컴파일 경고가 발생하게 됩니다. 제네릭과 같은 실체화 불가 타입은 런타임에는 컴파일타임보다 타입 관련 정보를 적게 담고 있습니다. 즉, 메서드를 선언할 때 실체화 불가 타입으로 varargs 매개변수를 선언하면 컴파일러가 경고를 보내게 됩니다. 가변인수 메서드를 ..