반응형 Java76 [이펙티브자바 3판] ITEM37. Ordinal 인덱싱 대신 EnumMap을 사용하라 이번장의 핵심은... 배열의 인덱스를 얻기 위해 ordinal을 쓰는 것은 일반적으로 좋지 않으니, 대신 EnumMap을 사용하라. 몇몇 예를 통해 알아보자 Ex) 정원에 심은 식물들을 배열 하나로 관리하고, 생애주기(한해살이, 여러해살이, 두해살이)별로 묶어보자 class Plant { enum LifeCycle{ ANNUAL, PERENNIAL, BIENNIAL } final String name; final LifeCycle lifeCycle; public Plants(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return na.. 2020. 11. 14. [이펙티브자바 3판] ITEM36. 비트 필드 대신 EnumSet을 사용하라 이번장의 핵심은... 열거할 수 있는 타입을 한데 모아 집합 형태로 사용한다고 해도 비트 필드를 사용할 이유는 없다 EnumSet 클래스가 비트 필드 수준의 명료함과 성능을 제공하고 아이템 34에서 설명한 열거 타입의 장점까지 선사하기 때문이다 EnumSet의 유일한 단점이라면 불변 EnumSet을 만들 수 없다는 것다 그래도 향후 릴리스에서는 수정되리라 본다 그때까지는 Collections.unmodifiableSet으로 EnumSet을 감싸 사용할 수 있다 비트필드 // 비트 필드 열거 상수 - 구닥다리 기법 public class Text { public static final int STYLE_BOLD = 1 2020. 11. 8. [이펙티브자바 3판] ITEM35. ordinal 메서드 대신 인스턴스 필드를 사용하라 이번장의 핵심은... Enum API 문서를 보면 ordinal에 대해 이렇게 쓰여 있음 '대부분 프로그래머는 이 메서드를 쓸 일이 없다' 이 메서드는 EnumSet과 EnumMap 같이 열거 타입 기반의 범용 자료구조에 쓸 목적으로 설계되었다 따라서 이런 용도가 아니면 ordinal 메서드는 절대 사용하지 말자 Ordinal() 메서드 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 메서드 // ordinal 잘못 사용한 예 - 따라 하지 말것 public enum Ensemble { SOLO, DUET, TRIO, QUARTER ... public int numberOfMusicians() { return ordinal()+1; } } 동작은 하지만 유지보수가 끔찍한 코드임 상수 선언 순서.. 2020. 11. 1. [이펙티브자바 3판] ITEM34. int 상수 대신 열거 타입을 사용하라 이번장의 핵심은... 열거 타입은 확실히 정수 상수보다 뛰어나다 더 읽기 쉽고 안전하고 강력하다 대다수 열거 타입이 명시적 생성자나 메서드 없이 쓰이지만, 각 상수를 특정 데이터와 연결짓거나 상수마다 다르게 동작하게 할 때는 필요하다 드물게는 하나의 메서드가 상수별로 다르게 동작해야 할 때도 있다 이런 열거 타입에서는 switch 문 대신 상수별 메서드 구현을 사용하자 열거 타입 상수 일부가 같은 동작을 공유한다면 전략 열거 타입 패턴을 사용하자 정수 열거 패턴 자바에서 열거 타입을 지원하기 전에는 정수 상수를 한 묶음 선언해서 사용 public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static .. 2020. 10. 28. [이펙티브자바 3판] ITEM33. 타입 안전 이종 컨테이너를 고려하라 이번장의 핵심은... 컬렉션 API로 대표되는 일반적인 제네릭 형태에서는 한 컨테이너가 다룰 수 있는 타입 매개변수의 수가 고정 하지만, 컨테이너 자체가 아닌 키를 타입 매개변수로 바꾸면 이런 제약이 없는 타입 안전 이종 컨테이너를 만들 수 있음 타입 안전 이종 컨테이너는 Class를 키로 쓰며, 이런 Class 객체를 타입 토큰이라 한다 또한, 직접 구현한 키 타입도 쓸 수 있다 예) db 행(컨테이너)을 표현한 DatabaseRow 타입에는 제네릭 타입인 Column를 키로 사용할 수 있다 타입 안전 이종 컨테이너 패턴 컨테이너 대신 키를 매개변수화한 다음, 컨테이너 값을 넣거나 뺄 때 매개변수화한 키를 함께 제공하는 방법 → 제네릭 타입 시스템이 값의 타입이 키와 같음을 보장 예) 타입별로 즐겨 찾.. 2020. 10. 25. [이펙티브자바 3판] ITEM32. 제네릭과 가변인수를 함께 쓸 때는 신중하라 이번장의 핵심은... 가변 인수와 제네릭은 궁합이 좋지 않다 가변 인수 기능은 배열을 노출하여 추상화가 완벽하지 못하고, 배열과 제네릭의 타입 규칙이 서로 다르기 때문이다 제네릭 varargs 매개변수는 타입 안전하지는 않지만 허용된다 메서드에 제네릭 varargs 매개변수를 사용하고자 한다면, 먼저 그 메서드가 타입 안전한지 확인한 다음 @Safevarargs 애너테이션을 달아 사용하는 데 불편함이 없게끔 하자. 타입 안정성이 깨지니 제네릭 varargs 배열 매개변수에 값을 저장하는 것은 안전하지 않다 // 제네릭과 varargs(가변인수)를 혼용하면 타입 안정성이 깨진다 static void dangerous(List ... stringLists) { List inList = List.of(42);.. 2020. 10. 23. [이펙티브자바 3판] ITEM31. 한정적 와일드카드를 사용해 API 유연성을 높이라 이번장의 핵심은... 조금 복잡하더라도 와일드카드 타입을 적용하면 API가 훨씬 유연해진다 그러니 널리 쓰일 라이브러리를 작성한다면 반드시 와일드카드 타입을 적절히 사용해줘야 한다 PECS 공식을 기억하자 즉, 생산자(producer)는 extends를 소비자(consumer)는 super를 사용한다 Comparable과 Comparator는 모두 소비자라는 사실도 잊지 말자 매개변수화 타입은 불공변 즉, 서로 다른 타입 Type1, Type2가 있을 때, List은 List의 상위 타입도 하위 타입도 아니다 때론 불공변 방식보다 유연한 무언가가 필요하다 public class Stack { public Stack(); public void push(E e); public E pop(); public b.. 2020. 10. 18. 이전 1 ··· 3 4 5 6 7 8 9 ··· 11 다음 반응형