16.1 람다식이란?

함수형 프로그래밍이란 함수를 정의하고 이 함수를 데이터 처리부로 보내 데이터를 처리하는 기법임. 데이터 처리부는 데이터만 가지고 있을 뿐, 처리 방법이 정해져 있지 않아 외부에서 제공된 함수에 의존함.

image.png

데이터 처리부는 제공된 함수의 입력값으로 데이터를 넣고 함수에 정의된 처리 내용을 실행함. 동일한 데이터라도 함수A를 제공해서 처리하는 결과와 함수B를 제공해서 처리하는 결과는 다를 수 있음. 이것이 함수형 프로그래밍의 특징으로, 데이터 처리의 다형성이라고도 볼 수 있음.

자바는 함수형 프로그래밍을 위해 Java 8부터 람다식을 지원함. 람다식은 위 그림과 같이 데이터 처리부에 제공되는 함수 역할을 하는 매개변수를 가진 중괄호 블록임. 데이터 처리부는 람다식을 받아 매개변수에 데이터를 대입하고 중괄호를 실행시켜 처리함.

람다식: {매개변수, ...} -> { 처리 내용 }

자바는 람다식을 익명 구현 객체로 변환함. 익명 구현 객체란 9장에서 설명한 것과 같이 이름이 없는 인터페이스 구현 객체를 말함.

public interface Calculable
	//추상 메소드
	void calculate(int x, int y);
}

Calculable 인터페이스의 익명 구현 객체는 다음과 같이 생성할 수 있음.

new Calculable() {
	@Override
	public void calculate(int x, int y) { 처리내용 }
};

이것을 람다식으로 표현하면 다음과 같음. 추상 메소드인 Ccalculate()는 두 개의 매개변수를 가지므로 (x, y)로 표현되었고, 화살표 → 뒤에 calculate()의 실행 블록이 옴.

(x, y) -> { 처리내용 };

람다식은 인터페이스의 익명 구현 객체이므로 인터페이스 타입의 매개변수에 대입될 수 있음.

public void action(Calculable calculable) {
	int x = 10;
	int y = 4;
	calculable.calculate(x, y); //데이터를 제공하고 추상 메소드를 호출
}

action() 메소드를 호출할 때 매개값으로 다음과 같이 람다식을 제공할 수 있음. action() 메소드에서 calculable,calculate(x,y)를 실행하면 람다식의 중괄호 블록이 실행되면서 데이터가 처리됨. 여기서 action() 메소드는 제공된 람다식을 이용햇서 내부 데이터를 처리하는 처리부 역할을 함.

action( (x, y) => {
	int result = x + y;
	System.out.println(result);
}); 

image.png

인터페이스의 익명 구현 객체를 람다식으로 표현하려면 인터페이스가 단 하나의 추상 메소드만 가져야 함. 따라서 다음과 같이 두 개 이상의 추상 메소드를 가진 RemoteControl 인터페이스는 람다식으로 표현할 수 없음.

public interface RemoteContro; {
	void turnOn();
	void turnOff();
}

인터페이스가 단 하나의 추상 메소드를 가질 때, 이를 함수형 인터페이스라고 함.