16. Lambda - 문법
람다의 특성
● 익명
○ 보통의 메서드와는 달리 이름이 없다.
● 함수
○ 람다는 메서드처럼 특정 클래스에 종속되지 않는다.
파라미터 리스트, 바디, 반환 형식을 포함한다.
● 전달
○ 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수
있다.
● 간결성
○ 익명 클래스처럼 많은 부가 코드를 구현할 필요가 없다.
18. Lambda - 함수형 인터페이스
● 하나의 추상 메서드를 가진 인터페이스만 람다로 사용할 수 있다.
이러한 인터페이스를 함수형 인터페이스라고 한다.
● 인터페이스 내부에 선언된 유일한 메서드에 람다의 몸체가 정의된다.
● 함수형 인터페이스에 디폴트 메서드가 여럿 있더라도,
추상 메서드가 하나라면 함수형 인터페이스이다.
● 어노테이션 @FunctionalInterface를 클래스 상단에 붙여
명시적으로 함수형 인터페이스라는 것을 표기해줄 수 있다.
19. Lambda - 함수형 인터페이스
• 람다는 결과적으로 함수형 인터페이스가 가지는 유일한 메서드가 구현되는 것이다.
(이를 바탕으로 타입 추론이 가능)
• 함수형 인터페이스를 인자로 가지는 게스트 코드 입장에서는 코드가 인스턴스화 되어
인자로 들어오므로 호스트 코드에서 보내는 인스턴스의 정체가 람다인지 익명클래스인
지는 관심이 없다.
• 람다와 익명클래스는 다르다.
– 익명클래스는 컴파일시 서브클래스로 별도의 파일로 컴파일되고 람다는 기존 클래
스에 포함된다.
– 람다는 바이트코드로 변환시 Java7에서 추가된 InvokeDynamic 명령어을 이용하
여 런타임에 코드가 생성된다.
20. Lambda - 함수형 인터페이스
• 함수형 인터페이스를 인자로 받는 메소드에만 람다식을
사용할 수 있다.
– 새로운 함수형을 추가할 경우 언어가 더 복잡해진다.
– 대부분의 자바 프로그래머가 익명클래스 문법에 익숙하다.
• 위와 같은 제약사항으로 인해 람다식의 타입 추론이 가능
해졌다.
– 함수형 인터페이스가 가지고 있는 추상 메소드가 오직 하나 밖에 없으므
로 이를 이용하여 타입 추론
– 람다식의 Prameter 추론 : 추상 메소드의 파라메터 정보
– 람다식의 Return 타입 추론 : 추상 메소드의 리턴 타입 정보
• Java8에서는 java.util.function 패키지로 다양한 함수형 인터페
이스를 제공한다.
21. 디폴트 메서드
default 키워드를 사용하면 인터페이스에 메서드를 바로 설정 가
능
기존의 구현체 구조를 변경하지 않고도 새로운 기능을 추가 할
수 있다.
<Interface>
List
ArrayList
LinkedList
Stack
ArrayList
LinkedList
Stack
23. Predicate<T> T -> boolean
• Java.util.function.Predicate<T>
– 추상메소드 test()를 람다의 바디에서 정의
– T타입을 인수로 받아 Boolean을 리턴
• 입력값 T가 어떤 조건을 충족하는지 여부를 확인하는 메서드
• 어떤것이 사실인지 아닌지를 리턴해주는 람다식이 바디로 정의
Lambda - 기본제공 함수형 인터페이스
25. Consumer<T> T -> void
• Java.util.function.Consumer<T>
– 추상메소드 accept()를 람다의 바디에서 정의
– T타입을 인수로 받고 리턴하지 않음
• 입력값 T를 받아 어떠한 동작을 수행시키는 메서드
• 람다의 바디는 특정 동작을 수행하며 반환값이 없는 형태.
Lambda - 기본제공 함수형 인터페이스
29. Supplier<T> () -> T
• Java.util.function.Supplier<T>
– 추상메소드 get()를 람다의 바디에서 정의
– 인수없이 T 객체를 리턴
• 정해진 T를 공급하는 메서드
• 입력값이 없으며 람다식에 정의된 값을 결과로 반환한다.
Lambda - 기본제공 함수형 인터페이스
31. 람다 표현식 조합
• Java.util.function 패키지에서 제공하는 함수형 인터페이
스 중 일부는 static 메소드 형태의 유틸리티 메소드를 가
지고 있다.
– Predicate
– Function
• 유틸리티 메서드를 조합해서 복잡한 로직을 보다 간결하
게 표현할 수 있다.
Lambda - 기본제공 함수형 인터페이스
43. 요약
● 람다 표현식은 익명클래스를 간결하게 표현할 수 있다.
(약간은 달라요.)
● 함수형 인터페이스는 하나의 추상 메서드만이 정의된 인터페이
스
● 자바에서는 자주 사용되는 기본적인 형태의 함수형 인터페이스
를 제공
● 기본제공되는 함수형 인터페이스는 Boxing을 피할 수 있도록
IntPredicate, IntToLongFunction과 같은 primitive타입의 인터
페이스 제공
● 메서드 레퍼런스를 이용하면 기존의 메서드 구현을 재사용 및 전
달 가능
● Comparator, Predicate, Function 같은 함수형 인터페이스는
람다 표현식을 조합할 수 있는 다양한 디폴트 메서드를 제공