본문 바로가기

자바☕

함수형 인터페이스와 람다 표현식

728x90

1. 함수형 인터페이스

- 추상메서드를 하나만 가지고 있는 인터페이스

- @FunctionalInterface 어노테이션을 인터페이스에 선언하면 컴파일 시점에서 추상메서드가 하나만 있는지 체크

- 부작용을 최대한 배제하는, 함수형 프로그래밍의 일환

2. 람다 표현식

메서드를 하나의 식으로 표현 : 메서드 이름과 리턴값의 표시가 없어지기 때문에 익명 함수라고도 한다.

익명 클래스의 객체와 동등하다

interface Calculator {
    int sum(int a, int b);
}

class MyCalculator implements Calculator {
    public int sum(int a, int b) {
        return a+b;
    }
}

public class Sample {
    public static void main(String[] args) {
        MyCalculator mc = new MyCalculator();
        int result = mc.sum(3, 4);
        System.out.println(result);  // 7 출력
    }
}

람다로 표현

interface Calculator {
    int sum(int a, int b);
}

public class Sample {
    public static void main(String[] args) {
        Calculator mc = (int a, int b) -> a +b; // 매개변수 -> 리턴(수행코드 블럭)
        // 인터페이스를 구현하는 클래스 없이도 인터페이스의 객체를 만들어 그 속성을 사용할 수 있다
        int result = mc.sum(3, 4);
        System.out.println(result);
    }
}

**람다함수로 사용하는 인터페이스는 추상메서드를 하나만 가지고 있어야 한다!

(두 개 이상 시 -> 컴파일 에러 발생)

+ 이펙티브 자바 : 람다식에서, 타입을 명시해야 코드가 더 명확할 때를 제외하고, 람다의 모든 매개변수 타입은 생략하자

+ 점프 투 자바 : 인터페이스에 이미 입출력에 대한 타입이 정의되어 있기 때문에, 입력값의 타입은 생략 가능(생략 하자)

* 더욱 축약 => 클래스 :: 메서드 ex) Integer::sum == Integer.sum(int a, int b) == (a, b) -> a+ b;

 

+ Bifunction 인터페이스 : Bifunction<T, U, R> ~ 매개변수 2, 리턴 1. 호출 시 apply 메서드를 호출해야 한다.

+ BinaryOperator : Bifunction의 세 타입이 모두 동일한 경우 사용 가능

import java.util.function.BiFunction;

public class Sample {
    public static void main(String[] args) {
        BiFunction<Integer, Integer, Integer> mc = (a, b) -> a + b;
        int result = mc.apply(3, 4);  // sum이 아닌 apply 메서드를 사용해야 한다.
        System.out.println(result);  // 7 출력
    }
}

public class Sample {
    public static void main(String[] args) {
        BinaryOperator<Integer> mc = (a, b) -> a + b; // 타입이 모두 같은 경우
        int result = mc.apply(3, 4);
        System.out.println(result);  // 7 출력
    }
}
728x90

'자바☕' 카테고리의 다른 글

자바 옵셔널(Optional<T>)  (0) 2022.12.11
스트림 API  (0) 2022.12.11
Lombok  (0) 2022.12.06
자바 표준 Annotation  (0) 2022.12.06
Dynamic Dispatch : 다형성의 일부  (0) 2022.12.02