본문은 Effective Java를 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.
선결론
- 작은 함수 객체를 구현하는 데엔 람다를 사용하라
- 익명 클래스는 (함수형 인터페이스가 아닌) 타입의 인스턴스를 만들 때만 사용하라
함수 객체
- 예전에는 자바에서 함수 타입을 표현할 때 추상 메서드를 하나만 담은 인터페이스(드물게는 추상 클래스)를 사용했다
- 이런 인터페이스의 인스턴스를 함수 객체(function object)라고 하여, 특정 함수나 동작을 나타내는 데 썼다
- 이전에는 함수 객체를 익명 클래스를 사용하여 만들었다
- 자바 8부터 함수형 인터페이스라는 개념이 등장하면서 이 인터페이스들의 인스턴스를 람다식을 사용해 만들 수 있게 되었다
람다 사용 규칙
- 타입을 명시해야 코드가 더 명확할 때를 제외하곤, 람다의 모든 매개변수 타입은 생략한다
- 코드 자체로 동작이 명확히 설명되지 않거나 코드 줄 수가 많아지면 람다를 쓰지 말아야 한다
- 람다는 이름이 없고 문서화도 못 하기 떄문이다
- 람다는 한 줄 일 때 가장 좋고 길어야 세 줄 안에 끝내는 게 좋다(세 줄을 넘어가면 가독성이 심하게 나빠진다)
- 람다는 함수형 인터페이스에서만 쓰인다
- 다음의 경우에는 익명 클래스를 사용할 수 있다
- 추상 클래스의 인스턴스를 만들 때 람다를 쓸 수 없으므로 익명 클래스를 써야 한다
- 추상 메서드가 여러 개인 인터페이스의 인스턴스를 만들 때는 익명 클래스를 쓸 수 있다
- 함수 객체가 자신을 참조해야 할 때는 반드시 익명 클래스를 써야 한다
- 람다는 자신을 참조할 수 없다
- 람다에서의 this 키워드는 바깥 인스턴스를 가리키는 반면, 익명 클래서에서의 this는 익명 클래스의 인스턴스 자신을 가릴킨다
- 람다를 직렬화하는 일은 극히 삼가야 한다(익명 클래스의 인스턴스도 마찬가지)
- 직렬화 형태가 구현별로 다를 수 있기 때문이다
- 직렬화해야만 하는 함수 객체가 있다면 private 정적 중첩 클래스(아이템 24)의 인스턴스를 사용하자
'책 > Effective Java' 카테고리의 다른 글
[이펙티브 자바] 아이템 46: 스트림에서는 부작용 없는 함수를 사용하라 (0) | 2022.06.15 |
---|---|
[이펙티브 자바] 아이템 43: 람다보다는 메서드 참조를 사용하라 (0) | 2022.06.10 |
[이펙티브 자바] 아이템 38: 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 (0) | 2022.06.03 |
[이펙티브 자바] 아이템 32: 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) | 2022.05.24 |
[이펙티브 자바] 아이템 30: 이왕이면 제네릭 메서드로 만들라 (0) | 2022.05.20 |