공부하는 스누피
[Java] 람다식 Lambda 본문
람다란?
람다식(또는 람다)은 추상 메서드를 하나만 가진 인터페이스의 인스턴스이다. 자바 8부터 등장했으며, 기존 익명 클래스와 비슷한 역할(함수형 프로그래밍)을 하지만 훨씬 간결하다.
// 익명 클래스
Collection.sort(arr, new Comparator<T>(){ ... });
// 람다식
Collection.sort(arr, (o1, o2)->{...});
익명클래스 vs 람다
람다 | 익명 클래스 | |
인스턴스에 접근할 수 있는가? | X | O |
this 키워드 | 바깥 인스턴스 | 익명클래스 인스턴스 자신 |
=> 따라서 익명 클래스는 함수형 인터페이스가 아닌 타입의 인스턴스를 만들 때 사용하는 것이 좋다.
주의할 점
- 타입을 쓰지 않았을 때 IDE에서 에러가 났을 때를 제외하고, 람다의 모든 매개변수 타입은 생략한다.
- 매개변수 타입을 생략하기 때문에 제네릭을 사용하지 못한다.
- 람다는 문서화하지 못한다. 코드 자체로 동작이 명확하게 설명되지 않으면 쓰지 말아야 한다.
- 세 줄 안에 끝나야 한다.
메서드 참조 표현식 (method reference expression)
- 람다식에서 파라미터를 중복해서 사용할 때 쓸 수 있다.
- 더 간결한 코드를 짤 수 있다.
- 람다와 달리 제네릭 함수 타입을 구현할 수 있다.
- [인스턴스]::[메소드명]으로 쓸 수 있다.
참조 유형
1. 정적 메서드를 가리키는 메서드 참조
2. 한정적 인스턴스 메서드 참조: 참조 대상을 특정한다. (인수 일치)
3. 비한정적 인스턴스 메서드 참조: 참조 대상을 특정하지 않는다. (스트림에 쓰인다)
4. 클래스 생성자를 가리키는 메서드 참조
5. 배열 생성자를 가리키는 메서드 참조
(참고)
Effective Java 3/E (2018). Joshua B(이복연 옮김). 프로그래밍 인사이트
'Languages > Java' 카테고리의 다른 글
[Java] 와일드 카드 (Wildcards) (0) | 2021.03.14 |
---|---|
[Java] 멤버 클래스 / 중첩 클래스 (nested class) (0) | 2021.03.06 |
[Java] equals()와 hashCode() (0) | 2021.02.27 |
[디자인 패턴] 자바의 싱글턴(Singleton) (0) | 2021.02.16 |
[디자인 패턴] 정적 팩터리 메서드 (static factory method) (0) | 2021.02.15 |
Comments