본문 바로가기
DEV/Java

[자바] 함수형 인터페이스(Functional Interface)

by 어쩌다개발 2023. 2. 22.
반응형

자바에서 모든 메서드는 클래스 내에 포함되어야 하는데, 람다식은 메서드가 하나의 독릭접인 기능을 하기 때문에 함수라는 용어를 사용한다고 했다. 사실 람다식은 익명 클래스의 객체와 동등하다.

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

위 코드에서 max는 임의로 이름을 붙인것일뿐 의미는 없다.

람다식으로 정의된 익명 객체의 메서드를 어떻게 호출할 수 있을까?

객체의 메서드를 호출하려면 참조변수가 있어야 한다.

타입 f = (int a, int b) -> a > b ? a : b;

이 경우 참조변수 f의 타입은 어떤 걸로 해야 될까? 참조형이므로 클래스 또는 인터페이스를 사용할 수 있다.

그리고 람다식과 동등한 메서드가 정의되어 있어야 한다. 그래야만 참조변수로 익명 객체(람다식)의 메서드를 호출 할 수 있기 때문이다.

interface MyFunction {
	public abstract int max(int a, int b);
}

위와 같은 MyFunction 인터페이스가 정의되어 있다는 가정하에 아래와 같이 익명 클래스의 객체를 생성할 수 있다.

MyFunction f = new MyFunction() {
    public int max(int a, int b) {
    	return a > b ? a : b;
    }
}

int big = f.max(5, 3);

MyFunction 인터페이스에 정의된 max() 람다식 (int a, int b) -> a > b ? a : b 와 메서드의 선언부가 일치한다. 그래서 위 코드의 익명 객체를 람다식으로 아래와 같이 대체할 수 있다.

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

MyFunction 인터페이스를 구현한 익명 객체를 람다식으로 대체가 가능한 이유는 람다식도 실제로는 익명 객체이고, MyFunction 인테피이스를 구현한 익명 객체의 메서드 max()와 람다식의 매개변수의 타입과 개수 그리고 반환값이 일치하기 때문이다.

인터페이스를 통해 람다식을 다루기로 결정되었고, 람다식을 다루기 위한 인터페이스를 '함수형 인터페이스(functional interface)'라고 부른다.

@FunctionalInterface
Interface MyFunction { //함수형 인터페이스 MyFunction을 정의
    public abstract int max(int a, int b);
}

단, 함수형 인터페이스에는 오직 하나의 추상 메서드만 정의되어 있어야 한다는 제약이 있다. 그래야 람다식과 인터페이스의 메서드가 1:1로 연결될 수 있기 때문이다. 반면에 static과 default 메서드의 개수에는 제약이 없다.

List<String> list = Arrays.asList("abc", "aaa");

Collections.sort(list, new Comparator<String>() {
    public int compare(String s1, String s2) {
    	return s2.compareTo(s1);
    }
}

위와 같이 인터페이스의 메서드 하나를 구현하는데도 복잡하게 했어야 했지만, 람다식으로 아래와 같이 간결하게 처리할 수 있다.

List<String> list = Arrays.asList("abc", "aaa");
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));

 

참고: 자바의 정석

 

반응형

'DEV > Java' 카테고리의 다른 글

[자바] 제네릭 Parameter Type - Naming Conventions  (8) 2023.02.24
[자바] 메소드 참조  (2) 2023.02.23
[자바] 람다식(Lambda expression)  (1) 2023.02.22
[자바] 제네릭 와일드 카드  (9) 2023.02.16
[자바] Properties  (8) 2023.02.16

댓글