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에서 매우 흔하게 사용하는 방식이라서 이게 과연 함수형 프로그래밍이 맞나 싶은 생각이 들기도 한다.

'TIL(사전캠프)' 카테고리의 다른 글

리액티브. (2024-07-11)  (0) 2024.07.11
리액티브. (2024-07-10)  (0) 2024.07.10
리액티브. (2024-07-09)  (0) 2024.07.09
리액티브. (2024-07-08)  (0) 2024.07.08
Java. 배운거 기록하기(2024-07-05)  (0) 2024.07.05