Home
Dohyun's Blog
Cancel

Item37 (ordinal 인덱싱 대신 EnumMap을 사용하라)

ordinal 인덱싱 대신 EnumMap을 사용하라 배열이나 리스트에서 원소를 꺼낼 때 ordinal 메서드로 인덱스를 얻는 코드가 존재한다. public enum Color { RED, GREEN, BLUE, YELLOW, ORANGE } public enum Palette { PRIMARY, SECONDARY, NEUTRAL } Set...

Item36 (비트 필드 대신 EnumSet을 사용하라)

비트 필드 대신 EnumSet을 사용하라 열거한 값들이 주로 집합으로 사용될 경우, 예전에는 각 상수에 서로 다른 2의 거듭제곱 값을 할당한 정수 열거 패턴을 사용해왔다. public class Text { public static final int STYLE_BOLD = 1 << 0; public static final int ST...

Item35 (ordinal 메서드 대신 인스턴스 필드를 사용하라)

ordinal 메서드 대신 인스턴스 필드를 사용하라 대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응된다. 그리고 모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal() 이라는 메서드를 제공한다. public enum Ensemble { SOLO, DUET, TRIO, QUARTET, ... , D...

Item34 (int 상수 대신 열거 타입을 사용하라)

이번 아이템부터는 클래스의 일종인 Enum 열거 타입과, 인터페이스의 일종인 애노테이션에 대해 다룬다. 내용을 훑어 보았을 때 단순히 Enum을 어떻게 사용하는 지, 주의해야할 점은 무엇인지에 더해 Enum 타입의 다양한 활용성에 대해 고민해볼 수 있는 장인 것 같다. int 상수 대신 열거 타입을 사용하라 열거 타입은 일정 개수의 상수 값을 정...

Item33 (타입 안전 이종 컨테이너를 고려하라)

타입 안전 이종 컨테이너를 고려하라 제네릭은 컬렉션과 단일 원소 컨테이너(AtomicReference.. ) 등등에 흔히 쓰인다. 이 때 매개변수화되는 대상은 원소가 아닌 컨테이너 자신이다. 따라서 하나의 컨테이너에서 매개변수화할 수 있는 타입의 수가 제한된다. 예를 들면 Set에는 원소의 타입을 뜻하는 단 하나의 타입 매개변수만 있으면 되고 M...

Item32 (제네릭과 가변인수를 함께 쓸 때는 신중하라)

제네릭과 가변인수를 함께 쓸 때는 신중하라 가변인수 메서드는 제네릭과 같이 자바 5때 함께 추가되었다. 그래서 서로 잘 어우러질 것이라 생각할 수 있지만 그렇지 않다. public static void printNumbers(int... numbers) { ... } 이러한 가변 인수 메서드가 호출되면 가변 인수를 담기 위해 배열이 자동으...

Item31 (한정적 와일드카드를 사용해 API 유연성을 높이라)

한정적 와일드카드를 사용해 API 유연성을 높이라 아이템 28에서 매개변수화 타입(제네릭)은 불공변이라고 했다. 공변은 런타임에 잘못된 원소를 넣는 오류를 잡아내는 것에 반해 불공변 특성으로 컴파일 타임에 잡아냈었다. List<String>은 List<Object>의 하위 타입이 아니고, 그 반대도 상위 타입이 아니다. ...

Item30 (이왕이면 제네릭 메서드로 만들라)

이왕이면 제네릭 메서드로 만들라 클래스처럼 메서드도 제네릭으로 만들 수 있다. 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭으로 만들어진다. public static <E extends Enum<E>> EnumSet<E> of(E e) { EnumSet<E> result = none...

Item29 (이왕이면 제네릭 타입으로 만들라)

이왕이면 제네릭 타입으로 만들라 제공되는 제네릭 타입과 메서드를 사용하는 일은 쉽다. 하지만 제네릭 타입을 새로 만드는 일은 쉽지만은 않다. public class Stack { private Object[] elements; //문제! private int size = 0; private static final int DEFAULT_INIT...

Item28 (배열보다는 리스트를 사용하라)

배열보다는 리스트를 사용하라 왜 배열보다는 리스트를 사용하라는걸까? 리스트에는 사용할 수 있는 API가 많아서? 리스트는 가변 길이로 사용할 수 있어서? 결론부터 말하자면 이유는 리스트와 배열 간의 관계가 아닌 배열과 제네릭 타입에 중요한 차이들이 있기 때문이다. 그 차이들을 알아보자. 공변(covariant)과 불공변(invariant) ...