안녕세계

[Java] 람다(Lambda) 본문

[Java] 람다(Lambda)

Junhong Kim 2020. 2. 10. 21:07
728x90
반응형

Java8에 추가된 람다식함수형 프로그래밍에대해 알아봅니다. 

Java8부터 람다식이 추가되면서 Java는 객체지향언어인 동시에 함수형 언어의 기능까지 갖추게 되었습니다.

 

함수형 언어라고 하면 처음엔 낯설고 어렵게 느껴질 수 있지만 조금만 살펴보면 금방 이해하실 수 있습니다 :)

그럼, 지금부터 람다와 함수형 인터페이스란 무엇인지 알아보겠습니다. ☺️

1. 람다식이란?

람다식이란 이름이 어려워 보이지만 메서드를 하나의 식(expression)으로 표현한 것을 뜻합니다.

메서드를 람다식으로 표현하면 메서드 이름과 반환값이 없어서 익명 함수라고도 합니다.

 

람다식은 (1)메서드의 매개변수로 전달될 수 있으며 (2)메서드의 결과로 반환될 수 있습니다.

이러한 람다식 특징 덕분에 메서드를 변수처럼 다루는 것이 가능해졌습니다.

2. 람다식 예제

일반적인 plus 메서드를 람다식으로 바꿔보겠습니다.

// 일반적인 더하기 메서드
int plus(int x, int y) {
	return x + y;
}

 

우선 람다식은 (1)메서드 이름 (2)반환 타입을 제거할 수 과있습니다.

또한, 반환값이 있는 경우 return 키워드 대신에 식(expression)으로 대신할 수 있습니다.

(식의 연산결과가 반환값이 되므로 세미콜론은 붙이지 않습니다.)

// 더하기 메서드를 람다식으로 변경
(int x, int y) -> x + y

 

그리고 람다식에 선언된 (3)매개변수 타입은 추론이 가능한 경우 생략할 수 있습니다.

앞서 나온 (2)에서 람다식에 반환 타입이 없는 이유는 항상 추론이 가능하기 때문입니다.

// 매개변수 타입을 추론이 가능할 경우 생략 가능
(x, y) -> x + y

3. 함수형 인터페이스

람다식은 메서드와 동등한 것처럼 설명했지만 사실 람다식은 익명 클래스의 객체와 동등합니다.

// 익명 클래스의 객체
new Object() {
	int plus(int x, int y) {
		return x + y;
	}
}

// 익명 클래스의 객체를 람다식으로 표현
(int x, int y) -> x + y

 

다음과 같은 MyFunction 인터페이스가 plus 추상메서드를 갖고 있다고 가정합니다.

interface MyFunction {
	public abstract int plus(int x, int y);
}

 

MyFunction 인터페이스는 다음과 같이 정의되어 사용될 수 있을 것입니다.

MyFunction f = new MyFunction() {
                    @Override
                    public int plus(int x, int y) {
                        return x + y;
                    }
               };

f.plus(1, 2);

 

이때, MyFunction 인터페이스에 정의된 plus 메서드를 다음과 같이 람다식으로 표현할 수 있습니다.

MyFunction f = (x, y) -> x + y;
f.plus(1, 2);

 

MyFunction 인터페이스를 구현한 익명 객체를 람다식으로 표현할 수 있는 이유는 람다식도 사실 익명 객체이고,

인터페이스를 구현한 익명 객체의 메서드 plus와 람다식의 (1)매개변수 타입 (2)개수 (3)반환값이 일치하기 때문입니다.

 

이처럼 하나의 메서드가 선언된 인터페이스를 정의해 람다식을 다루는 것이 기존 자바 규칙을 어기지 않고 자연스러워서,

인터페이스를 통해 람다식을 다루는 것이 결정되었고 람다식을 다루기 위한 인터페이스를 함수형 인터페이스라고 합니다.

// @FunctionalInterface를 붙이면 컴파일러가 함수형 인터페이스를 올바르게 정의했는지 확인합니다.
@FunctionalInterface
interface MyFunction {
	public abstract int plus(int x, int y);
}

반드시 함수형 인터페이스에는 오직 하나의 추상 메서드만 정의되어 있어야합니다.

왜냐하면 람다식과 인터페이스의 메서드가 1:1로 연결되어야 하기 때문입니다.

 

람다식을 가리키는 참조변수를 반환하거나 람다식을 직접반환할 수 있으며, 변수처럼 메서드를 주고 받는 것이 가능해졌습니다.

(사실 메서드가 아니라 객체를 주고 받는 것)

// MyFunction 람다식을 반환
MyFunction myFunction() {
    MyFunction f = () -> {};
    return f;
}

 

지금까지 람다와 함수형 인터페이스가 무엇인지에 대해 알아봤습니다.

다음 포스팅에서는 이미 정의된 함수형 인터페이스를 소개하고 사용하는 방법에 대해 알아보겠습니다.

감사합니다.

728x90
반응형
Comments