-
람다 표현식(lamda expression)이란?
메소드를 하나의 식으로 표현한 것을 말한다. 메소드를 람다 표현식으로 표현하면, 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있다. 람다 표현식은 메소드의 매개변수로 전달될 수도 있고, 메소드의 결과값으로 반환될 수도 있다.
메소드
int max(int x, int y) {
return x > y ? x : y;
}람다 표현식
(x, y) -> x > y ? x : y;
장점
1. 코드의 간결성 - 람다를 사용하면 불필요한 반복문의 삭제가 가능하며 복잡한 식을 단순하게 표현할 수 있다.
2. 지연연산 수행 - 람다는 지연연상을 수행함으로써 불필요한 연산을 최소화 할 수 있다.
3. 병렬처리 가능 - 멀티쓰레디를 활용하여 병렬처리를 사용 할 수 있다.
단점
1. 람다식의 호출이 까다롭다.
2. 람다 stream 사용 시 단순 for문 혹은 while문 사용 시 성능이 떨어진다.
3. 불필요하게 너무 사용하게 되면 오히려 가독성을 떨어뜨릴 수 있다.
람다 표현식 작성
1. 자바에서는 화살표(->) 기호를 사용하여 람다 표현식을 작성할 수 있다.
(매개변수목록) -> { 함수몸체 }
2. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다.
(int x, int y) -> x+y
(x, y) -> x+y // type 생략3. 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있다.
(int x) -> x+1
(x) -> x+1 // type 생략
x -> x+1 // 괄호 생략4. 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있다. (이때 세미콜론(;)은 붙이지 않음.)
(int x, int y) -> { x+y }
(x, y) -> x+y // type, {} 생략5. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없다.
(int x, int y) -> x+y // {} 생략
(x, y) -> x+y // type, {} 생략
(x, y) -> { return x+y; } // type 생략, return문으로 이루어져 {} 생략불가6. return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 된다. (이때 세미콜론(;)은 붙이지 않음)
예제
[기존]
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("study lamda expression");
}
}).start();
[람다 표현식]
new Thread(()->{
System.out.println("study lamda expression");
}).start();함수형 인터페이스(functional interface)
람다 표현식을 사용할 때는 람다 표현식을 저장하기 위한 참조 변수의 타입을 결정해야 한다.
참조변수의타입 참조변수의이름 = 람다 표현식
위 문법처럼 람다 표현식을 하나의 변수에 대입할 때 사용하는 참조 변수의 타입을 함수형 인터페이스라고 부른다. @FunctionalInterface 어노테이션을 사용해서 함수형 인터페이스임을 명시할 수 있고, 어노테이션을 인터페이스의 선언 앞에 붙이면, 컴파일러는 해당 인터페이스를 함수형 인터페이스로 인식한다. 함수형 인터페이스는 추상 클래스와는 달리 단 하나의 추상 메소드만을 가져야 하고, 두 개 이상의 메소드가 선언되면 오류를 발생시킨다.
@FunctionalInterface
public interface Calc{
public int cal(int first, int second);
}
//메소드가 두개이므로 오류가 발생한다.
@FunctionalInterface
public interface Calc{
public int min(int first, int second);
public int max(int first, int second);
}예제
@FunctionalInterface
interface Calc { // 함수형 인터페이스의 선언
public int cal(int x, int y);
}
public class Lambda1 {
public static void main(String[] args){
Calc maxNum = (x, y) -> x > y ? x : y; // 추상 메소드의 구현
System.out.println(maxNum.cal(5, 15)); // 함수형 인터페이스의 사용
}
}
[결과] : 15
public class Lambda2 {
public static void main(String[] args){
Calc minNum = (x, y) -> x < y ? x : y; // 추상 메소드의 구현
System.out.println(minNum.cal(5, 15)); // 함수형 인터페이스의 사용
}
}
[결과] : 5'STUDY > 백엔드' 카테고리의 다른 글
Java Bean Validation (0) 2021.05.07 @Transactional (0) 2021.05.07 Optional (0) 2021.05.06 Stream (0) 2021.04.28 Spring Batch (0) 2021.03.03