람다식이란?
- 람다식은 익명 함수(anonymous function)를 생성하기 위한 식으로 객체 지향 언어보다는 함수 지향 언어에 가깝다.
- 객체 지향 프로그래밍에 익숙한 개발자들은 혼란스러울 수 있지만, 자바에서 람다식을 수용한 이유는 자바 코드가 매우 간결해지고, Collection의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있기 때문이다.
- 람다식의 형태는 매개 변수를 가진 코드 블록이지만, 런타임 시에는 익명 구현 객체를 생성한다.
람다식 -> 매개 변수를 가진 코드 블록 -> 익명 구현 객체
예를 들어 Runnable 인터페이스의 익명 구현 객체를 생성하는 전형적인 코드는 다음과 같다.
위 코드에서 익명 구현 객체를 람다식으로 표현하면 다음과 같다.
- 람다식은 "(매개변수) -> {실행코드}" 형태로 작성되는데, 마치 함수 정의 형태를 띠고 있지만 런타임 시에 인터페이스의 익명 구현 객체로 생성된다.
- 어떤 인터페이스를 구현할 것인가는 대입되는 인터페이스가 무엇이냐에 달려있다.
람다식의 기본 문법
- (타입 매개변수, ...)는 오른쪽 중괄호 {} 블록을 실행하기 위해 필요한 값을 제공하는 역할을 한다.
- 매개 변수의 이름은 개발자가 자유롭게 줄 수 있다.
- '->' 기호는 매개 변수를 이용해서 중괄호를 {}를 실행한다는 뜻이다.
타겟 타입과 함수적 인터페이스
- 람다식의 형태는 매개 변수를 가진 코드 블록이기 때문에 마치 JAVA의 메소드를 선언하는 것처럼 보여진다.
- JAVA는 메소드를 단독으로 선언할 수 없고 항상 클래스의 구성 멤버로 선언하기 때문에 람다식은 단순히 메소드를 선언하는 것이 아니라 이 메소드를 가지고 있는 객체를 생성해 낸다.
- 람다식은 인터페이스 변수에 대입된다.
- 람다식은 인터페이스의 익명 구현 객체를 생성한다는 뜻이다.
- 인터페이스는 직접 객체화할 수 없기 때문에 구현 클래스가 필요한데, 람다식은 익명 구현 클래스를 생성하고 객체화한다.
- 람다식은 대입될 인터페이스의 종류에 따라 작성 방법이 달라지기 때문에 람다식이 대입될 인터페이스를 람다식의 타겟 타입(target type)이라고 한다.
1) 함수적 인터페이스(@FunctionallInterface)
- 모든 인터페이스를 람다식의 타겟 타입으로는 사용할 수는 없다.
- 람다식이 하나의 메소드를 정의하기 때문에 2개 이상의 추상 메소드가 선언된 인터페이스는 람다식을 이용해서 구현 객체를 생성할 수 없다.
- 하나의 추상 메소드가 선언된 인터페이스만이 람다식의 타겟 타입이 될 수 있는데, 이러한 인터페이스를 함수적 인터페이스(functional interface)라고 한다.
- 함수적 인터페이스를 작성할 때 2개 이상의 추상 메소드가 선언되지 않도록 컴파일러가 체킹해주는 기능이 있는데, 인터페이스 선언시 @functionalInterface 어노테이션을 붙이면 된다. 이 어노테이션은 2개 이상의 추상 메소드가 선언되면 컴파일 오류를 발생시킨다.
- @FunctionalInterface 어노테이션은 선택사항이다.
- @FunctionalInterface 어노테이션이 없더라도 하나의 추상 메소드만 있다면 모두 함수적 인터페이스지만, 실수로 2개 이상의 추상 메소드를 선언하는 것을 방지하고 싶다면 붙여주는 것이 좋다.
- 람다식은 타겟 타입인 함수적 인터페이스가 가지고 있는 추상 메소드의 선언 형태에 따라서 작성 방법이 달라진다.
~작성중~
'Java > Basic' 카테고리의 다른 글
[Java] 변수(Variable) (0) | 2020.03.14 |
---|---|
[Java] 클래스(Class)와 객체(Object) (0) | 2020.03.10 |
[Java] JVM(Java Virtual Machine) (0) | 2020.03.08 |
[Java] 제네릭(Generic) (0) | 2020.01.19 |
[Java] 멀티스레드(Multi Thread) (1) | 2020.01.06 |