TIL(사전캠프)

리액티브. (2024-07-12)

note994 2024. 7. 12. 23:14

1. 함수형 인터페이스

Java에서 인터페이스는 명세 또는 사양이라고 표현할 수 있다. 리액티브 스트림즈에서 정의해 놓은 네 개의 인터페이스처럼, Java의 인터페이스는 몸체가 없는 추상 메서드로만 이루어져 있다.

 

물론 Java 8부터 지원하는 default 메서드는 예외이다. 아무튼 이 인터페이스를 사용하기 위해서는 해당 인터페이스에 정의된 메서드들을 구현하는 구현 클래스가 필요하다.

 

그렇다면 Java 8부터 지원하는 함수형 인터페이스는 무엇일까?

 

함수형 인터페이스 역시 인터페이스다. 다만 기존 인터페이스에 비해 함수형 인터페이스는 단 하나의 추상 메서드만 정의되어 있다. 그렇다면 왜 그냥 인터페이스라고 부르지 않고 굳이 함수형 인터페이스라고 부를까?

 

함수형 프로그래밍 세계에서는 함수를 일급 시민으로 취급한다. 여기서 말하는 일급 시민이란 함수를 값으로 취급한다는 의미이다. 함수를 값으로 취급하기 때문에 어떤 함수를 호출할 때 함수 자체를 파라미터로 전달할 수 있다.

 

Java에서도 함수를 값으로 취급할 수 있는 기능이 Java 8부터 추가되었는데, 그것이 바로 함수형 인터페이스이다. 그런데 사실 Java 8 이전 버전에서도 단 하나의 추상 메서드만 있는 인터페이스는 존재했기 때문에 함수형 인터페이스를 사용한 것이나 마찬가지이다.

 

대표적인 예로 Comparator 인터페이스를 들 수 있는데, 예제 코드에서 간단하게 살펴보겠다.

 

코드4-1 기존에 사용되던 단 하나의 추상 메서드를 가지는 인터페이스 예제(Example4_1.java)

 

코드 4-1은 Java 8 이전부터 존재했던 단 하나의 추상 메서드를 가지는 인터페이스를 사용하는 예제이다.

 

먼저 암호 화폐의 이름과 화폐 단위를 멤버 변수로 가지는 CryptoCurrency 객체들을 List에 추가했다.

 

그리고 이 List를 화폐 단위 기준으로 오름차순 정렬을 한 후, 화면에 출력하도록 했다.

 

Java의 List에 포함된 원소들을 정렬할 때 일반적으로 Collections.sort()를 이용하는데, 여기서는 CryptoCurrency 객체를 화폐 단위의 오름차순으로 정렬하기 위해 추가적으로 Comparator 인터페이스를 사용했다. (5 ~ 10번라인)

 

Comparator 인터페이스는 Java 1.2 버전부터 많이 사용해 오던 인터페이스인데, 이 Comparator 인터페이스가 바로 compare()라는 단 하나의 추상 메서드를 가지는 인터페이스, 바로 함수형 인터페이스가 되는 것이다.

 

실행결과

 

코드4-2 Comparator 인터페이스 코드의 내부

 

코드4-2는 Java에서 지원하는 Comparator 인터페이스의 내부 모습이다.

 

Comparator 내부에는 compare()라는 단 하나의 추상 메서드가 정의된 것이 보인다. 외에 reversed(), thenComparing()같은 메서드들이 보이는데 이 메서드들은 Java 8부터 지원하는 이미 구현된 default 메서드이기 때문에, 추상 메서드는 하나만 정의되어 있으므로 함수형 인터페이스가 맞다.

 

@FunctionalInterface 애너테이션을 추가해서 이 인터페이스는 함수형 인터페이스라고 아예 명시적으로 지정해 둔 것을 볼 수 있다.

 

아무튼 코드 4-1에서는 Comparator 인터페이스를 익명 구현 객체의 형태로 Collections.sort()의 파라미터로 전달하는데, 사실 객체를 메서드의 파라미터로 전달하는 것은 Java에서 매우 흔하게 사용하는 방식이라서 이게 과연 함수형 프로그래밍이 맞나 싶은 생각이 들기도 한다.