[아이템 42] 익명 클래스보다는 람다를 사용하라. 자바 8부터는 함수형 프로그래밍을 지원합니다. 추상 메서드가 하나인(Single Abstract Method)인터페이스를 함수형 인터페이스라고 부르며 람다식을 사용해 만들 수 있습니다. 람다는 익명클래스에 비해 코드가 간결하고 가독성이 좋다는 장점이 있습니다. 1 2 3 4 5 6 7 // 익명 클래스 방식 Collections.sort(words, new Comparator<String>() { @Override public int compare(String s1, String s2) { return Interget.compare(s1.length(), s2.length()); } }); 1 2 3 // 람다 활용 Collections....
Java
[아이템 34] int 상수 대신 열거 타입을 사용하라
[아이템 34] int 상수 대신 열거 타입을 사용하라. 열거 타입이란 일정 개수의 상수 값을 정의하고 그 이외 값들은 허용하지 않는 타입입니다. 대표적으로 사계절, 요일, 태양계의 행성 등이 있습니다. 열거 타입을 지원하기 전 코드 1 2 3 4 5 // 정수 열거 패턴 - 상당히 취약하다. public static final int EAST = 0; public static final int WEST = 1; public static final int SOUTH = 2; public static final int NORTH = 3; 이 코드는 타입의 안전성을 보장할 수 없고 표현력도 좋지 않습니다....
[아이템 33] 타입 안전 이종 컨테이너를 고려하라
[아이템 33] 타입 안전 이종 컨테이너를 고려하라. 타입 안전 이종 컨테이너 패턴이란 키를 매개변수화한 다음, 컨테이너에 값을 넣거나 뺄 때 매개변수화한 키를 함께 제공하는 방식입니다. 1 2 3 4 5 // 타입 안전 이종 컨테이너 패턴 - API public class Favorites { public <T> void putFavorite(Class<T> type, T instance); public <T> getFavorite(Class<T> type); } 다음은 Favorite 클래스를 사용하는 예시입니다. 1 2 3 4 5 6 7 8 9 10 // 타입 안전 이종 컨태이너 패턴 - 클라이언트 Favorites f = new Favorites(); f....
[아이템 32] 제네릭과 가변인수를 함께 쓸 때는 신중하라
[아이템 32] 제네릭과 가변인수를 함께 쓸 때는 신중하라. 가변인수와 제네릭은 자바 5에 함께 추가되었는데 이 둘은 서로 어울리지 않습니다. 가변인수(varargs)란 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해주는 것입니다. 구현 방식에 허점이 있습나다. 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어집니다. 그런데 내부로 감춰야 했을 이 배열을 그만 클라이언트에 노출하는 문제가 생겼습니다. 그 결과 verargs 매개변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고가 발생합니다. 실체화 불가 타입은 런타임에 컴파일보다 타입 관련 정보를 적게 담고 있습니다....
[아이템 31] 한정적 와일드카드를 사용해 API 유연성을 높여라
[아이템 31] 한정적 와일드카드를 사용해 API 유연성을 높여라. 때론 불공변 방식보다 유연한 무언가가 필요할 때가 있습니다. 아이템29의 Stack 클래스를 떠올려보면 1 2 3 4 5 6 public class Stack<T> { public Stack(); public void push (E e); public E pop(); public boolean isEmpty(); } 여기서 일련의 원소를 스택에 넣는 메서드를 추가한다고 하면 1 2 3 4 5 public void pushAll(Iterable<E> src) { for (E e : src) { push(e); } } Iterable src의 원소 타입의 스택의 원소 타입과 일치하면 잘 작동합니다....