본문 바로가기

Java/Basic

[Java] 람다식(Lambda Expressions)

람다식이란?

- 람다식은 익명 함수(anonymous function)를 생성하기 위한 식으로 객체 지향 언어보다는 함수 지향 언어에 가깝다.

- 객체 지향 프로그래밍에 익숙한 개발자들은 혼란스러울 수 있지만, 자바에서 람다식을 수용한 이유는 자바 코드가 매우 간결해지고, Collection의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있기 때문이다.

- 람다식의 형태는 매개 변수를 가진 코드 블록이지만, 런타임 시에는 익명 구현 객체를 생성한다.

람다식 -> 매개 변수를 가진 코드 블록 -> 익명 구현 객체

 

예를 들어 Runnable 인터페이스의 익명 구현 객체를 생성하는 전형적인 코드는 다음과 같다.

익명 구현 객체

위 코드에서 익명 구현 객체를 람다식으로 표현하면 다음과 같다.

- 람다식은 "(매개변수) -> {실행코드}" 형태로 작성되는데, 마치 함수 정의 형태를 띠고 있지만 런타임 시에 인터페이스의 익명 구현 객체로 생성된다.

- 어떤 인터페이스를 구현할 것인가는 대입되는 인터페이스가 무엇이냐에 달려있다.

 


람다식의 기본 문법

함수적 스타일의 람다식을 작성하는 방법

- (타입 매개변수, ...)는 오른쪽 중괄호 {} 블록을 실행하기 위해 필요한 값을 제공하는 역할을 한다.

- 매개 변수의 이름은 개발자가 자유롭게 줄 수 있다.

- '->' 기호는 매개 변수를 이용해서 중괄호를 {}를 실행한다는 뜻이다.

 

int 매개변수 a의 값을 콘솔에 출력하기 위한 람다식

 

매개 변수 타입은 런타임 시에 대입되는 값에 따라 자동으로 인식될 수 있기 때문에 타입을 일반적으로 언급하지 않는다.

 

하나의 매개 변수만 있다면 괄호()를 생략할 수 있고, 하나의 실행문만 있다면 중괄호{}도 생략이 가능하다.

 

 

 중괄호{}를 실행하고 결과값을 리턴해야 한다면 return문으로 결과값을 지정할 수 있다.
중괄호{}에 return문만 있을 경우, 람다식에는 return문을 사용하지 않고 다음과 같이 작성하는 것이 정석이다.

 


타겟 타입과 함수적 인터페이스

- 람다식의 형태는 매개 변수를 가진 코드 블록이기 때문에 마치 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