아이템 44. 표준 함수형 인터페이스를 사용하라. 자바는 람다식 등장 이후 템플릿 메서드 패턴보다 함수형 인터페이스를 생성자 / 팩토리 메서드에 전달되는 방식이 많이 사용됨. 함수형 인터페이스는 기본 제공되는 것을 우선적으로 사용해야 함. API에 대해서 학습해야 할 부분이 적어서 잘 습득할 수 있기 때문임. 커스텀 함수형 인터페이스를 구현할 때는 다음 경우 중 하나를 만족할 때임. 필요한 동작을 함수형 인터페이스에서 구현할 수 없을 때 (값을 받아서 에러를 던지는 것 같은 작업들) 함수형 인터페이스의 이름이 클래스의 의미를 명확하게 설명할 때. 함수형 인터페이스의 이름 / 메서드 명을 통해서 규약이 정의될 때 함수형 인터페이스가 적절한 default 메서드를 제공할 때. @FunctionalInterf..
아이템 43. 람다보다는 메서드 참조를 사용하라. 람다가 메서드 참조보다 가독성이 좋은 경우를 제외하면, 메서드 참조를 사용하라. 람다가 가독성이 더 좋으면 람다를 사용하라. 람다를 메서드 참조로 바꿔서 사용하는 경우 다음 장점 존재 람다는 이름이 없으나 메서드는 이름이 가짐. → 가독성 증가 가능. 람다는 문서화 불가능 → 메서드 참조의 메서드는 문서화 가능 람다에 이름을 붙여서 메서드를 만들면 됨. 메서드 참조는 5가지 타입이 존재함. 정적 메서드 참조 한정적 메서드 참조(인스턴스) 비한정적 메서드 참조(인스턴스) 클래스 생성자 메서드 참조 배열 생성자 메서드 참조 람다보다 메서드 참조를 사용해라 익명 클래스보다 람다는 간결해서 많이 쓰인다. 람다보다 더 간결한 것은 메서드 참조다. 따라서 간결함을 ..
아이템 42. 익명 클래스보다는 람다를 사용하라 - 핵심정리 함수 객체를 표현하기 위해 추상 메서드 하나만 가진 추상 클래스를 익명 클래스로 구현해, 익명 클래스 객체를 함수 객체로 표현함 추상 메서드 하나만 가진 인터페이스는 함수형 인터페이스로 특별 대우를 받게 되었으며, 함수형 인터페이스는 람다식을 통해서도 구현할 수 있다. 익명 클래스 객체처럼 람다식은 '함수형 인터페이스'를 구현한 객체로 생성됨. 이 객체가 함수 객체로 표현됨. 람다식은 컴파일 타임에 제네릭을 이용해 타입을 추론함. 람다식에는 타입을 명시해야 코드가 명확할 때를 제외하고는 타입을 명시하지 않음. 컴파일러가 타입을 알 수 없다고 에러를 내는 경우에만 타입을 명시해야함. 익명 클래스 vs 람다식 익명 클래스의 this는 익명 클래스 ..
아이템 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라. 핵심 요약을 하면 다음과 같다. 마커 인터페이스는 특정 기능이 추가되는 것은 아니고, 타입 정의를 목표로 함. 마커 인터페이스는 컴파일 시점에 타입 에러를 확인할 수 있음. 마커 어노테이션은 컴파일 시점에 에러 확인이 불가능함. 마커 인터페이스는 클래스, 인터페이스에만 사용 가능. 그 외에는 마커 어노테이션을 사용함. 메서드의 매개변수로 받는 타입이라면 마커 인터페이스를 사용해야함. (마커 어노테이션은 타입을 보장할 수 없음) 마커 인터페이스란? 마커 인터페이스는 다음 특징을 가지는 인터페이스를 의미한다. 인터페이스 내부에 어떠한 메서드도 담지 않는다. 즉, 인터페이스를 구현하는 클래스가 구현해야 할 것이 없다. 이 인터페이스를 구현하..
아이템 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 요약하면 다음과 같다. 인터페이스를 이용해 열거 타입을 확장하는 효과를 가져올 수 있음. (대부분 필요없음) 효과를 보려면, 인터페이스 타입을 매개변수로 가지는 곳이 많아야 함. 이렇게 확장하는 경우 열거 타입의 한계로 인해 공통된 메서드가 반복될 수 있음. 이는 인터페이스의 default 메서드나 유틸 클래스로 분리할 수 있음. 대부분의 상황에서 열거 타입을 확장하는 건 좋지 않은 상황이다. 다음 세 가지 이유가 존재하기 때문이다. 확장한 타입의 원소는 기반 타입의 원소로 취급하지만, 그 반대는 성립하지 않기 때문이다. 기반 타입 / 확장된 타입들의 원소 모두를 순회할 방법도 마땅하지 않음. 이렇게 확장성을 높이려면 설계와 구현이..