sitelink1 | https://blog.naver.com/jwyoon25/221335515818 |
---|---|
sitelink2 | |
sitelink3 | |
sitelink4 | |
sitelink5 | |
sitelink6 |
자바의 람다는 javaScript의 arrow function과 유사한 개념으로, 함수형 프로그래밍 언어에 적합한 표현식이기 때문에 객체지향과는 약간 괴리가 있지만 이 익명 클래스를 통해 구현할 수 있다.
JDK 1.8이 람다식을 지원함으로써 자바 프로그램은 객체지향+함수형 프로그램이 되었다.
람다 표현식(Lambda expression)은 익명 함수(anonymous function)를 생성하기 위한 식으로, 객체 지향 언어보다는 함수형 언어의 표현식에 가깝다.
함수형 언어의 장점은 병렬처리와 이벤트 처리에 적합하다는 것이다.
자바에서 람다 표현식을 사용하면 함수형 언어의 장점을 자바로 가져오는 것과 동시에 코드가 매우 간결해진다.
또한 JCF의 요소를 필터링 하거나 매핑해서 원하는 결과를 얻는 것이 한결 쉬워지기 때문에 JCF와 연계해서도 많이 사용된다.
일반적으로 람다식의 형태는 파라미터를 가진 코드 블록이지만, 런타임 시에는 익명 구현 객체(익명 클래스)를 생성한다.
이게 무슨 말일까? 이를 이해하기 위해서 이번 포스팅에서는 다음과 같은 내용들을 다룬다.
1. 람다 표현식 기본 문법
2. 함수형 인터페이스
3. 표준 함수형 인터페이스 API
<람다 표현식 기본 문법>
(타입 파라미터1[, ...]) -> {실행문1;[...]}
(int a) -> {System.out.println(a);}
(a) -> {System.out.println(a);}
a -> System.out.println(a) // 하나의 매개변수만 있는 경우 {} 를 생략 가능, 단, 파라미터가 없다면 ()를 생략할 수 없다.
(x,y) -> {return x+y;}; // 가능
(x,y) -> x+y //이것도 가능
<함수형 인터페이스>
위에서 interface와 익명클래스를 잠시 언급했었는데, 람다식은 interface의 익명 구현 객체(익명 클래스)를 생성하기 때문에 interface와 밀접한 관련이 있다.
interface는 직접 객체화할 수 없기 때문에 구현 클래스가 필요한데, 람다식은 사용 대상 interface의 익명 구현 클래스를 생성하고 객체화한다.
즉, 람다식은 다음과 같이 사용될 수 있다.
인터페이스 변수이름 = 람다식;
이렇게 사용되는 경우 람다식은 interface 종류에 따라 작성 방법이 달라진다.
그리고 여기서 람다식이 대입될 interface를 람다식의 ‘타겟타입(target type)’ 이라고 한다.
하지만 모든 interface가 람다식의 타겟타입이 될 수 있는 것은 아니다.
람다식은 개념상 하나의 메서드만을 정의하기 때문에 두 개 이상의 추상 메서드가 선언된 interface는 람다식을 이용하여 구현 객체를 생성할 수 없다는 말이다.
다시말해, 단 하나의 추상메서드만이 선언된 interface만이 람다식의 타겟타입이 될 수 있는데, 이런 인터페이스를 함수형 인터페이스(functional interface)라고 한다.
정리하면 다음과 같다.
// 타겟타입(인터페이스)은 함수형 인터페이스(무조건 하나의 메서드만 가짐)여야 한다.
인터페이스 변수이름 = 람다식;
이처럼 람다식에 대입되는 인터페이스는 하나의 메서드만 가져야 하는데, 이를 명시하기 위한 annotation이 바로 @FunctionalInterface이다.
인터페이스의 선언부에 이 annotation을 붙여놓으면 컴파일러가 이 인터페이스에 두 개 이상의 추상메서드가 선언되지 않도록 검사한다.
<이하의 나머지 내용은 링크 참조>