람다

김민성·2022년 7월 14일
0

Java

목록 보기
37/47
post-thumbnail

람다식 (Lambda expression)

람다식이란 메서드를 하나의 으로 표현한 것이다.

int getMaxVal(int a, int b){
    return a>b?a:b;
}

위의 메서드는 정수 두개를 받아 더 큰값을 반환하는 메서드이다.

이를 람다식으로 표현하면 아래와 같다.

(a,b) -> a>b?a:b

위처럼 반환값이 있는 메서드의 경우 식의 연산 결과가 자동으로 반환값이 된다.

이 때, 문장이 아닌 식일 때는 끝에 ; 을 붙이지 않는것을 주의하자.

// 메서드 1
void printVar(String name, int i){
    System.out.println(name + " = " + i);
}
// 람다식 1
(name, i) -> System.out.println(name + " = " + i)
    
// 메서드 2
int square(int x){
    return x*x;
}
// 람다식 2
x -> x*x	// 매개변수가 하나면 괄호 생략 가능
    
// 메서드 3
int roll(){
    return (int)(Math.random()*6);
}
// 람다식 3
() -> (int)(Math.random()*6)

// 메서드 4
int sumArr(int[] arr){
    int sum= 0;
    for(int i : arr){
        sum += i;
    }
    return sum;
}
// 람다식 4
// 식의 문장이 둘 이상일때는 {}와 ;을 쓴다. -> 즉, 한 문장 일때는 위의 예제처럼 생략 가능
(int[] arr) -> {
    int sum= 0;		
    for(int i : arr){
        sum += i;
    }
    return sum;
}

위의 람다식 예제를 보면 메서드의 이름과 반환값이 없어지는 것을 볼 수 있다.

따라서 람다식을 '익명함수 (anonymous function)' 이라고도 한다.

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

람다식은 메서드와 동등한것 같지만 사실 익명 클래스의 객체와 동일하다.

(a,b) -> a>b?a:b
new Object(){
    int max(int a, int b){
        return a>b?a:b;
    }
}

위의 람다식과 익명 클래스를 구현한 객체는 동등하다는 의미이다.

따라서 람다식을 인터페이스를 통해 다루기로 했으며, 람다식을 다루기 위한 인터페이스를 함수형 인터페이스 라고 한다.

// 함수형 인터페이스
@FunctionalInterface
interface function1{
    public abstract int max(int a, int b);
}

// 익명객체를 람다식으로 대체
function1 f = (a,b) -> a>b?a:b;
// 익명객체의 메서드 호출
int big = f.max(10,8);

위처럼 함수형 인터페이스를 정의해놓고 람다식을 통해 간단히 구현하는 것이다.

함수형 인터페이스에는 람다식과 인터페이스 메서드가 1:1로 연결되기 위해 하나의 추상 메서드만 정의되어야 한다.

@FunctionalInterface 어노테이션은 컴파일러가 함수형 인터페이스를 올바르게 정의했는지 확인하는 역할로, 꼭 붙이는게 좋다.

0개의 댓글