-
자바 람다식이란(Lambda expression)JAVA/람다식(Lambda expression) 2022. 2. 7. 22:53반응형
JDK1.8부터 추가된 람다식(Lambda expression)은 간단히 말해서 메서드를 하나의 식(expression)으로 표현한 것입니다.
람다식의 도입으로 인해, 자바는 객체지향 언어인 동시에 함수형 언어가 되었습니다.
또한, 람다식은 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해줍니다.
이러한 람다식은 메서드의 이름과 반환 값이 없어지므로, '익명 함수(anonymous function)'라고도 합니다.익명 함수란? 말그대로 함수의 이름이 없는 함수입니다. 익명 함수들은 모두 일급객체 입니다.
더보기일급 객체가 되기 위한 조건 3가지 : 1. 함수/메서드의 매개변수(parameter)로서 전달할 수 있는가
2. 함수/메서드의 반환 값(return)이 될 수 있는가
3. 변수에 담을 수 있는가
람다식 형태(매개변수,...) -> {실행문}
(매개변수,...)는 오른쪽 중괄호 {실행문} 블록을 실행하기 위해 필요한 값을 제공하는 역할을 합니다.
매개 변수의 이름은 자유롭게 줄 수 있고, '->' 기호는 매개 변수를 이용해서 중괄호{}를 실행한다는 뜻으로 해석하면 됩니다.이를 토대로 두 정수를 입력받아 합을 구해주는 sum() 메서드를 만들어 보겠습니다.
먼저 public int sum(int a, int b){
return a + b;
}
이와 같은 메서드는 클래스에 포함되어야 하므로 클래스도 새로 만들어야 하고, 객체도 생성해야만 비로소 이 메서드를 호출할 수 있습니다.
그러나, 람다식은 이 모든 과정 없이 오직 람다식 자체만으로도 이 메서드의 역할을 대신할 수 있습니다.
앞에서 본 sum() 메서드를 람다식으로 변환하면
(int a, int b) -> { return a+b; };이처럼, 함수를 간략하면서도 명확한 식으로 표현할 수 있습니다.
그리고 이와 같이 (int a, int b) -> { return a+b; };
중괄호{ }에 하나의 return문만 있을 경우, 람다식에서는 return문과 중괄호를 생략할 수 있습니다. (이때는 식 끝에 ; (세미콜론)을 붙이지 않습니다.)
① (int a, int b) -> a+b;
더 해서, 람다식에 선언된 매개변수의 타입은 추론이 가능한 경우에는 생략을 할 수 있습니다.
② (a, b) -> a+b;
다른 예로, (int a) -> { System.out.pritnln(a); }; 라는 람다식이 있으면
앞서 본 ②처럼 매개변수 타입을 생략할 수 있고, (a) -> { System.out.println(a); };
지금처럼 하나의 매개 변수만 있다면 괄호()를 생략할 수 있고, 하나의 실행문만 존재하므로 중괄호{ }도 생략 할 수 있습니다.
a -> System.out.println(a);주의점
지금처럼 선언된 매개변수가 하나뿐인 경우에는 괄호()를 생략 할수 있지만
a -> System.out.pritnln(a); (o)
매개변수의 타입을 생략하지 않은 경우는 괄호()를 생략할 수 없다.
int a -> System.out.pritnln(a); (x)
만약 매개 변수가 없다면 람다식에서 매개 변수가 자리가 없어지므로 다음과 같이 빈 괄호()를 반드시 사용해야 한다. ( ) -> { 실행문; }
괄호 {} 안의 문장이 하나일 때만 괄호{}를 생략할 수 있고 문장의 끝에 ; (세미콜론)을 붙이지 않아야 한다.메서드와 람다식 비교 정리해보기
메서드 람다식 int max(int a, int b) { return a > b ? a: b; } (int a, int b) -> {return a > b ? a : b;}; (int a, int b) -> a > b ? a : b; (a,b) -> a > b ? a : b; int dice() { return (int) (Math.random() *6 ) +1 ; } ( ) -> { return (int) (Math.random() * 6)+1 ; }; ( ) -> (int) (Math.random() * 6) + 1;
int multiply(int [] num){
int x = 1;
for(int i : num) {
x *=i;
}
return x;
}(int [] num) -> {
int x = 1;
for(int i : num) {
x *=i;
}
return x;
}감사합니다. 지금까지 람다식의 대하여 알아보았습니다.
다음 글에는 람다식을 이용해서 익명 구현 객체로 표현이 가능한
함수형 인터페이스(Functional Interface)에 대하여 정리해보겠습니다.
참고 : https://cafe.naver.com/javachobostudy.cafe(자바의정석) 남궁성 님반응형