Reference/Effective-Java

    [Effective-Java] Chapter6 #34. int 상수 대신 열거 타입을 사용하라

    필요한 원소를 컴파일타임에 다시 알 수 있는 상수 집합이라면 항상 열거 타입을 사용하라. 열거 타입에 정의된 상수 개수가 영원히 고정 불변일 필요는 없다. 📌 정수 열거 패턴 (int enum pattern)과 문자열 열거 패턴 (string enum pattern) 정수 열거 패턴 기법에는 단점이 많다. 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 stat..

    [Effective-Java] Chapter5 #33. 타입 안전 이종 컨테이너를 고려하라

    용어 정리 제대로 안하고 뒤로 넘어가다가 죽는 줄 알았다. 📌 타입 안전 이종 컨테이너 타입 안전 이종 컨테이너가 영어로 type safe heterogeneous container인데, heterogeneous가 "여러 다른 종류들로 이뤄진"이라는 뜻이다. 처음에 이종이라길래 '이중' 내지 '두 가지 종류' 정도로 이해하고 읽다가 이해하는 데 한참 걸렸다. (이래서 원문으로 읽어야..) container는 값을 저장할 수 있는 객체를 말한다. 즉, 타입 안전 이종 컨테이너란 여러 다른 종류들로 이루어진 값을 저장하는 타입 안전한 객체를 의미한다. 📌 사용 목적 학번을 저장하는 Set Integer 타입 값만을 저장할 수 있다. 이름과 나이를 저장하는 Map String 타입 key와 Integer 타입..

    [Effective-Java] Chapter5 #32. 제네릭과 가변인수를 함께 쓸 때는 신중하라

    varargs 매개변수를 사용하고자 한다면, 메서드의 type-safe를 확인하고 @SafeVarargs 어노테이션을 달아라 📌 가변인수 (varargs) 가변인수 메서드(Item 53)와 제네릭은 자바 5 때 함께 추가되었으나, 서로 잘 어우러지지는 못 했다. 가변인수는 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해준다. public void print(String ... args){ for (String arg : args) { System.out.println(arg); } } 그런데 내부로 감췄야 했을 이 배열을 클라이언트에 노출하는 문제가 생겼다. 그 결과 varargs 매개변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고가 발생한다. 📌 가변인수와 제네릭 혼..

    [Effective-Java] Chapter5 #31. 한정적 와일드카드를 사용해 API 유연성을 높이라

    💡 유연성을 극대화하려면 원소의 생산자나 소비자용 입력 매개변수에 와일드카드 타입을 사용하라. 한편, 입력 매개변수가 생산자와 소비자 역할을 동시에 한다면 타입을 정확히 지정해주어야 하므로 와일드 카드 타입을 쓰지 말아야 한다. ✒️ 펙스(PECS) 공식 : producer-extends, consumer-super 1. 변성 (variance) 1. 공변성 (covariant) : A가 B의 하위타입일 때, List가 List의 하위타입인 경우 2. 반공변성 (contravariant) : A가 B의 상위타입일 때, List가 List의 상위타입인 경우 3. 무변성 (invariant) : A가 B의 타입이지만 List와 List가 아무 관계가 없는 경우 자바의 제네릭, 즉 매개변수화 타입(Item 2..