티스토리 뷰

반응형

메소드를 람다식으로 변경하는 방법에 대해서는 이전 포스팅을 참고 해주시기 바랍니다. ☞ 자바의 람다식(Lambda) - 1. 람다식으로 표현하기


람다식 사용하기 - 함수형 인터페이스

람다식으로 바뀐 메소드를 사용하기 위해서는 함수형 인터페이스를 선언해야 합니다. 인터페이스를 함수형 인터페이스로 선언하기 위해서는 '단 하나의 추상메소드'만이 선언 되어 있어야 합니다. 

interface MyInterface{
    abstract int myMethod(int a);
}

위와 같이 선언된 인터페이스를 함수형 인터페이스라고 합니다. (인터페이스명 위에 @FunctionalInterface라고 선언하면 '단 하나의 추상메소드가 있는지' 조건을 검사해줍니다.)

추상메소드에서 유심히 봐야 할 것은, 인자의 갯수와 타입 그리고 반환 타입입니다. 만약 위와 같은 함수형 인터페이스를 사용한다는 것은 int형의 인자 한개를 받고, 반환값이 int인 메소드를 람다식으로 만든다는 뜻입니다. 인터페이스를 이용해서 직접 람다식을 선언하고 사용해보겠습니다.

public static void main(String[] args) {
    MyInterface mi = a -> a*a;

    int i1 = mi.myMethod(3);
    int i2 = mi.myMethod(4);

    System.out.println(i1); //출력 결과 9
    System.out.println(i2); //출력 결과 16
}

함수형 프로그래밍 인터페이스를 타입으로해서 람다식을 선언했습니다. 인터페이스의 (추상)메소드는 단 한개뿐이고, 그 메소드의 인자의 갯수와 타입 그리고 반환타입이 무엇인지 알 수 있기 때문에 컴파일 하는데 아무런 문제가 없습니다.

그러므로 하나의 함수형 인터페이스의 선언된 (추상)메소드의 형식만 맞는다면 다른 방식으로 로직을 선언할 수 있습니다.

public static void main(String[] args) {
    //MyInterface mi = a -> a*a; 
    MyInterface mi = a -> a+a; //다른 람다식 선언

    int i1 = mi.myMethod(3);
    int i2 = mi.myMethod(4);

    System.out.println(i1); //출력 결과 6
    System.out.println(i2); //출력 결과 8
}

람다식 변수(값)처럼 사용하기

1) 메서드 호출 인자로 람다 사용

람다를 쓰는 목적은 결국 어떠한 로직을 변수(값)처럼 사용하기 위함입니다. 위의 사용 예제에서 mi라는 변수에 람다식이 담겨 있습니다. 어렵게 생각하지 말고 자연스럽게 변수를 사용해보도록 하겠습니다.

public static void main(String[] args) {
    MyInterface mi = a -> a*a;
    useLambda(mi); //변수처럼 사용
}

static void useLambda(MyInterface mi) {
    int i1 = mi.myMethod(3);
    int i2 = mi.myMethod(4);

    System.out.println(i1); //출력 결과 9
    System.out.println(i2); //출력 결과 16
}

2) 메서드 반환값으로 람다 사용

변수로 사용이 가능하니 메소드의 반환값으로도 사용이 가능합니다.

public static void main(String[] args) {
    MyInterface mi = getLambda(); //변수처럼 사용
    useLambda(mi);
}

static MyInterface getLambda() {
    return a -> a * a;
}

static void useLambda(MyInterface mi) {
    int i1 = mi.myMethod(3);
    int i2 = mi.myMethod(4);

    System.out.println(i1); //출력 결과 9
    System.out.println(i2); //출력 결과 16
}

기본적으로 제공되는 함수형 인터페이스

일반적 상황에서 많이 사용되는 함수형 인터페이스는 자바8에서 43개나 제공하고 있습니다. 하지만 람다와 친하지 않은 개발자가 43개의 인터페이스를 보게 된다면 쏟아지는 API 설명 앞에서 압도 당할 수 있습니다. 제 생각에는 먼저 람다의 기본적인 원리를 배우고 직접 선언해본 다음에 자주 사용된다고 느껴지는 함수형 인터페이스가 있다면, 기본적으로 제공되는 함수형 인터페이스가 없는지 찾아보는게 좋은 순서 인 것 같습니다.

반응형
댓글