본문 바로가기

이펙티브자바35

[Effective Java] 아이템44 표준 함수형 인터페이스를 사용하라 ■ 표준 함수형 인터페이스 자바가 람다를 지원하면서 API를 작성하는 모범 사례도 크게 바뀌었다. 상위 클래스의 기본 메서드를 재정의해 구현하던 템플릿 메서드 패턴의 매력이 크게 줄어쏙, 이를 대체하는 현대적 해법은 함수 객체를 받는 정적 팩터리나 생성자를 제공하는 것이다. 이 내용을 일반화하면 함수 객체를 받는 생성자와 메서드를 더 많이 만들어야한다. 자바 표준 라이브러리에는 이미 정의해둔 표준 함수형 인터페이스가 담겨있다. 필요한 용도에 맞는게 있다면, 직접구현하지 말고 표준 함수형 인터페이스를 활용하라 java.util.function 패키지에는 총 43개의 인터페이스가 담겨있다. 기본 인터페이스 6개만 기억하고 나머지를 충분히 유추해서 사용할 수 있다. UnaryOperator 반환값과 인수의 타.. 2021. 6. 27.
[Effective Java] 아이템43 람다보다는 메서드 참조를 사용하라 ■ 메서드 참조 자바에는 함수 객체를 람다보다도 더 간결하게 만드는 방법이 있다. 바로 메서드 참조이다. 아래 코드는 람다를 사용하고 있는 코드이다. merge는 자바 8 때 Map 추가된 merge 메서드를 사용하여, 키값이 있을 경우 함수를 현재 값과 주어진 값에 적용하고, 키 값이 없을 경우 주어진 키와 값을 그대로 저장한다. map.merge(key, 1, (count, incr) -> count+incr); 깔끔해 보이지만 매개변수인 count와 incr은 크게 하는 일 없이 공간을 차지한다. 사실 이 람다는 두 인수의 합을 단순히 반환할 뿐이다. 자바 8이 되면서 Integer 클래스(와 모든 기본 타입의 박싱 타입)는 이 람다와 기능이 같은 정적 메서드 sum을 제공한다. 이 메서드 참조를 .. 2021. 6. 21.
[Effective Java] 아이템42 익명 클래스보다는 람다를 사용하라 ■ 익명 클래스와 람다 비교 예전에는 자바에서 함수 타입을 표현할 때 추상 메서드를 하나만 담은 인터페이스를 사용했다. 익명 클래스의 인스턴스를 함수 객체로 사용하는 것은 낡은 기법이다. 익명 클래스 방식은 코드가 너무 길기 때문에 자바는 함수형 프로그래밍에 적합하지 않았다. Collection.sort(words, new Comparator() { public int compare(String s1, String s2){ return Integer.compare(s1.length(), s2.length()); } }); 지금은 함수형 인터페이스라 부르는 이 인터페이스들의 인스턴스를 람다식을 사용해 만들 수 있게 됐다. 다음은 익명 클래스를 사용한 앞의 코드를 람다 방식으로 바꾼 모습이다. 위의 코드 보.. 2021. 6. 20.
[Effective Java] 아이템37 ordinal 인덱싱 대신 EnumMap을 사용하라 ■ ordinal 기반 인덱싱 이따금 배열이나 리스트에서 원소를 꺼낼 때 ordinal 메서드로 인덱스를 얻는 코드가 있다. 식물의 생애주기를 열거 타입으로 표현한 LifeCycle 열거 타입을 예로 보자. public class Plant { enum LifeCycle { ANNUAL, PERNNIAL, BIENNIAL} final String name; final LifeCycle lifeCycle; public Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return name; } } 이제 정원에 심은 식물들을 배열 하.. 2021. 6. 6.
[Effective Java] 아이템36 비트 필드 대신 EnumSet을 사용하라 ■ 비트 필드 열거한 값들이 집합으로 사용될 경우, 예전에는 상수에 서로 다른 2의 거듭제곱 값을 할당한 정수 열거 패턴을 사용해왔다. 아래 코드와 같이 OR 연산자를 사용하여 상수를 하나의 집합으로 모을 수 있으며 이 집합을 비트 필드라 한다. import java.util.Objects; class Text { public static final int STYLE_BOLD = 1 2021. 6. 6.
[Effective Java] 아이템35 ordinal 메서드 대신 인스턴스 필드를 사용하라 ■ enum type의 ordinal java.lang 패키지의 Enum 추상 클래스의 내부를 보면 ordinal이라는 정수형 필드가 존재한다. ordinal 필드는 열거 타입 상수가 열거 타입에서 선언된 순서를 가지고 있다. 이 ordinal 필드의 값을 얻기 위해서는 ordinal() 메서드를 호출하면 된다. public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians(){ return ordinal() + 1; } } 위의 열거 타입에서 TRIO의 ordinal 값은 선언된 순서로 결정되므로 2이다. numberOfMusicians의 호.. 2021. 6. 6.