본문 바로가기

Java/Effective Java 3E61

[이펙티브자바 3판] ITEM39. 명명 패턴보다 애너테이션을 사용하라 이번장의 핵심은... 애너테이션으로 할 수 있는 일을 명명 패턴으로 처리할 이유는 없다 도구 제작자 제외하곤 일반 프로그래머가 애너테이션 타입을 직접 정의할 일은 거의 없지만, 자바 프로그래머라면 예외 없이 자바가 제공하는 애너테이션 타입들은 사용해야 한다 명명 패턴의 단점 ex) junit3 : 테스트 메서드의 시작을 test로 시작하게 하였다. 1. 오타가 나면 안됨 테스트 메서드 이름에 오타가 난다면 JUnit 3은 이 메소드를 그냥 지나쳐버림 2. 올바른 프로그램 요소에서만 사용되리라 보증할 방법이 없음 3. 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없다 예외를 던져야 성공하는 테스트 : 방법이 없다 → 애너테이션은 이 모든 문제를 해결해준다 애너테이션 @Retention(Retention.. 2020. 11. 18.
[이펙티브자바 3판] ITEM38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 이번장의 핵심은... 열거 타입 자체는 확장할 수 없지만, 인터페이스와 그 인터페이스를 구현하는 기본 열거 타입을 함께 사용해 같은 효과를 낼 수 있다 열거 타입은 확장할 수 없다 타입 안전 열거 패턴은 열거한 값들에 값을 더 추가하여 다른 목적으로 사용할 수 있지만, 열거 타입은 불가능 확장할 수 있는 방법? 열거 타입이 인터페이스를 구현할 수 있다는 아이디어를 이용 연산 코드용 인터페이스를 정의하고 열거 타입이 이를 구현하도록 함 public interface Operation { double apply(double x, double y); } // 인터페이스를 이용해 확장 가능 열거 타입을 흉내 public enum BasicOperation implements Operation { PLUS("+".. 2020. 11. 18.
[이펙티브자바 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.