개발 일지/Java

[Java] 람다식(Lambda Expression)

미숫가루설탕많이 2023. 1. 6. 13:28

 람다식(Lambda Expression)은 함수형 프로그래밍 기법을 지원하는 자바의 문법 요소이다. 간단히 말해서 메서드를 하나의 식으로 표현한 것이며, 코드를 매우 간결하면서 명확하게 표현할 수 있다는 장점이 있다.

 

 다음은 람다식을 이용해서 표현한 식이다.

//기존 메서드 표현 방식
int sum(int num1, int num2) {
	return num1 + num2;
}

//위의 코드를 람다식으로 표현한 식
(int num1, int num2) -> {
	return num1 + num2;
}

 

 이렇게 람다식은 반환타입과 메서드명을 생략해서 표현할 수 있다. 따라서 익명 함수(anonymous function)라고 부르기도 한다.

 

 이 외에도 특정 조건이 충족된다면 람다식을 더 축약해서 표현할 수 있다. 예를 들어, 메서드 바디에 실행문이 하나만 존재할 때는 중괄호와 return 문을 생략할 수도 있다. 또한, 매개변수 타입을 함수형 인터페이스를 통해 유추할 수 있는 경우에는 매개변수의 타입도 생략할 수 있다.

// 기존 메서드 표현 방식
int sum(int num1, int num2) {
	return num1 + num2;
}

// 위 코드를 람다식으로 표현한 식
(int num1, int num2) -> {
	return num1 + num2;
}

// 중괄호 생략
(int num1, int num2) -> num1 + num2

// 매개변수 타입 생략
(num1, num2) -> num1 + num2

 

 

 

 

함수형 인터페이스(Functional Interface)


 함수형 인터페이스란 한 개의 추상 메서드를 갖는 인터페이스이다.

 

 여기서 람다식은 객체이며, 정확히는 익명 객체라고 할 수 있다. 익명 객체는 익명 클래스를 통해 만들 수 있는데, 익명 클래스란 객체의 선언과 생성을 동시에 하여 하나의 객체를 생성하고 단 한번만 사용되는 일회용 클래스이다.

new Object() {
	int sum(int num1, int num2) {
		return num1 + num1;
	}
}

 

 따라서 람다식에는 객체에 접근하고 사용하기 위한 참조변수가 필요하다.

 

 하지만 위 코드를 보면 객체를 생성할 때 만들었던 Object 클래스에는 sum이라는 메서드가 없어서 Object 타입의 참조변수에 담는다고 해도 sum 메서드를 사용할 수 없다.

 

 이러한 문제를 해결해주는 자바의 문법 요소가 '함수형 인터페이스'이다.

 

 자바에서 함수형 프로그래밍을 하기 위한 새로운 문법 요소를 도입하는 대신에 기존의 인터페이스 문법을 활용해서 람다식을 다루는 것이다. 참조변수의 타입으로 함수형 인터페이스를 사용하면 원하는 메서드에 접근할 수 있다.

'개발 일지 > Java' 카테고리의 다른 글

[Java] 스레드(thread)  (0) 2023.01.10
[Java] 스트림(Stream)  (0) 2023.01.06
[Java] 애너테이션(Annotation)  (0) 2023.01.06
[Java] 반복자(Iterator)  (0) 2023.01.04
[Java] Map<K, V>  (1) 2023.01.04