※ 다음은 공식문서, 남궁성 님의 자바의 정석 등 다양한 자료를 참고해 기초적인 개인 공부를 위해 작성한 글로, 비판적 읽기를 권장합니다.
람다식 (Lambda Expression) 이란
람다식은 메서드를 하나의 식(Expression)으로 표현한 것으로, 람다식을 사용하면 익명함수(Anonymous function) 객체를 보다 간결하게 표현할 수 있다. 코딩테스트 문제를 제공하는 사이트에서 한 두줄로 간결하게 작성하기 위해 람다식으로 쓰인 풀이들을 꽤 확인할 수 있다. 자바 튜토리얼 문서에서는 람다식은 메서드 선언과 비슷하여 이름이 없는 익명 메서드로 간주하며 사용할 수 있다고 말한다. 그러나 남궁성 님의 자바의 정석에서는 람다식은 엄밀히 말하면 클래스 내에 포함되어야 하는 method가 아니라 익명 클래스 객체와 동등하다고 설명한다. 즉, 그 자체로 메서드의 역할을 하는 익명 객체 람다는 마치 변수값과 같이 메서드의 인자로서 넘겨질 수 있고, 메서드의 리턴값으로 반환될 수도 있다.
One issue with anonymous classes is that if the implementation of your anonymous class is very simple, such as an interface that contains only one method, then the syntax of anonymous classes may seem unwieldy and unclear.
" 익명 클래스의 한 가지 문제는, 하나의 메소드만 포함하는 인터페이스와 같이 그 구현이 매우 간단한 경우 익명 클래스의 문법이 (불필요하게) 다루기 어렵고 불명확하게 보일 수 있다는 것"
···
Lambda expressions let you express instances of single-method classes more compactly.
" 람다식은 하나의 추상 메서드를 가진 클래스의 인스턴스를 보다 간결하게 표현하게 해줌 "
위 설명을 보면 알 수 있듯, 코드 가독성을 위해 도입된 익명 클래스 인스턴스를 더욱 더 간결하고 명확하게 표현할 수 있도록 하는 것이 바로 람다식이라고 보면 된다.
함수형 프로그래밍과 람다식
수학에서의 람다 대수, 람다 계산법에 근간을 두는 람다식은 Java 8 버전에서 함수형(Functional) 프로그래밍을 지원하기 위하여 도입되었다.
전통적인 명령형 프로그래밍에서는 모든 함수에 이름을 붙여 변수를 선언해 할당하고 값을 대입한다. 따라서 참조 투명성이 없다. 함수형 프로그래밍은 함수에 불필요한 명명을 하지 않는다. 값의 대입을 멀리하고 불변 데이터를 유지해 참조 투명성을 갖는다. 참조 투명성이란 쉽게 말해 동일한 인자에는 투명하게 동일한 결과를 반환하는 것을 의미한다. 함수형 프로그래밍에서 핵심이 되는 것은 순수 함수(Pure function)로, 외부에 영향을 끼치지도 받지도 않는 독립적인 함수이기에 병렬 처리에 유리하다.
람다식 기본 작성 문법
메서드에서 이름과 반환 타입을 제거하고 매개변수(parameter) 선언부와 { } 사이에 '->'를 추가한다.
(매개변수) -> {실행문;}
// 익명함수
int sum (int a, int b) {
return a + b;
}
// 람다식
(int a, int b) -> {
return a + b;
}
- 매개변수 타입을 생략할 수 있다. (추론 가능한)
- 매개변수가 하나만 있을 경우 괄호( )를 생략할 수 있다.
- 타입을 명시할 경우 매개변수가 하나여도 괄호를 생략할 수 없다.
(a) -> a + a;
a -> a + a; // 생략(O)
(int a) -> a + a; // (O)
int a -> a + a; // error(X) (타입 명시)
- 중괄호{ }에 하나의 실행문만 있을 경우 중괄호{ }를 생략할 수 있다.
- 중괄호{ }에 하나의 return문이 존재할 경우에는 중괄호를 생략할 수 없다.
- 그러나 return과 중괄호 { }를 모두 생략하는 것은 가능하다.
- 중괄호{ } 생략 시 세미콜론(;)도 사용하지 않아야 함에 주의한다.
// 람다식
(int a, int b) -> {
return a + b;
}
// 매개변수 타입 자동 추론, { }생략, return 생략, ;생략
(a, b) -> a + b
다음 글에서 본격적인 람다식 활용을 위한 함수형 인터페이스에 대해 알아볼 것이다.
'TIL > JAVA' 카테고리의 다른 글
| [java] 문자열 반복해서 출력하는 방법 - repeat(), StringBuilder.append() (0) | 2023.12.27 |
|---|---|
| [Java] 제곱과 루트 구하기 : Math.pow() / Math.sqrt() (0) | 2023.12.23 |
| 객체 지향 프로그래밍 - 클래스와 객체 (0) | 2022.07.20 |
| Java 기초 - 반복문, 분기문 (0) | 2022.07.19 |
| Java 기초 - 조건문 (0) | 2022.06.20 |