프로그래밍/Java

[Java] 람다(Lamda)식과 함수형 인터페이스 (Functional Interface)

Jay Tech 2018. 11. 19. 20:29
반응형

람다식 (Lamda Expression)

JDK 1.8 부터 추가된 람다 식은 많은 변화를 가져다 주었다.


람다식이란 메서드를 하나의 식으로 표현해주는 간편한 기능이다. 예를들어,


1
2
3
4
5
6
7
8
9
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
cs


위의 max함수를 람다식으로 표현하면 밑에 3가지가 될 수 있다. 람다식에 선언된 매개변수는 추론이 가능한 경우 생략할 수 있다고 한다. 람다식은 런타임 때 익명 객체를 생성하기 때문에 대입 되는 값에 따라 자동인식이 되기 때문이다. 그리고 함수 몸체 {} 괄호안에 한 문장일 경우 괄호 또한 생략할 수 있다. 그 때 세미콜론은 쓰지 않는다.


자바는 객체 지향언어인데 람다식을 익명함수를 만드는 식이기 때문에 함수 지향적이게 된다. 하지만 간결하게 되므로 객체지향언에서도 수용하게 되었다. 


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

함수형 인터페이스란 람다식을 다루기 위한 인터페이스이다. 
위에서 봤던 max함수에 대한 참조 변수를 만들려면 인터페이스가 필요하다.

1
2
3
public interface MyFunction {
    public abstract max(int a, int b);
}
cs


이러한 인터페이스로 참조형을 생성할 수 있다.


1
2
3
4
5
6
7
Myfunction f = new MyFunction() {
    public int max(int a, int b) {
        return a > b ? a : b;
    }
}
 
MyFunction f = (int a, int b) -> a > b ? a : b;
cs



이렇게 함수형 인터페이스는 오직 하나의 추상 메서드만 정의할 수 있다. 람다식과 인터페이스의 메소드가 일 대 일로 연결되어야 하기 때문이다.


1
2
3
4
5
6
@FunctinalInterface
Myfunction f = new MyFunction() {
    public int max(int a, int b) {
        return a > b ? a : b;
    }
}
cs


이제 이런식으로 정의할 수 있다.


1
2
3
4
5
 Collections.sort(list, new Comparator<String>() {
    public int compare(String s1, String s2) {
        return s2.compare(s1);
    }
});
cs


문자열 비교하는 비교 함수를 정의 할 때 Comparator를 구현했었다. 하지만 람다식을 쓰게 되면 훨씬 간결해진다.


1
Collections.sort(list, (s1, s2) -> s2.compare(s1));
cs



내용 출처 - Java의 정석

반응형