Java는 Java 8부터 본격적으로 함수형 프로그래밍을 지원하기 시작했으며, Java 9에서는 이를 더욱 편리하게 활용할 수 있도록 IntUnaryOperator 인터페이스가 도입되었습니다. 이 인터페이스는 하나의 int 값을 입력받아 연산을 수행한 뒤 int 결과를 반환하는 단일 항 연산(unary operation)을 표현하는 데 사용됩니다.
주요 메서드 살펴보기
- identity(): 입력값을 그대로 반환하는 항등 연산자를 생성합니다.
- applyAsInt(int): 정의된 연산을 실제로 적용하고 결과를 반환합니다.
- andThen(): 먼저 자신의 연산을 수행한 뒤, 이어서 전달된 연산을 적용합니다.
- compose(): 전달된 연산을 먼저 수행한 뒤, 자신의 연산을 적용합니다.
각 메서드가 어떻게 동작하는지 아래 예제 코드를 통해 확인해 보겠습니다.
예제 코드
import java.util.function.IntUnaryOperator;
public class Demo{
public static void main(String args[]){
IntUnaryOperator op_1 = IntUnaryOperator.identity();
System.out.println("The identity function :");
System.out.println(op_1.applyAsInt(56));
IntUnaryOperator op_2 = a -> 3 * a;
System.out.println("The applyAsInt function :");
System.out.println(op_2.applyAsInt(56));
IntUnaryOperator op_3 = a -> 3 * a;
System.out.println("The andThen function :");
op_3 = op_3.andThen(a -> 5 * a);
System.out.println(op_3.applyAsInt(56));
IntUnaryOperator op_4 = a -> a / 6;
System.out.println("The compose function :");
op_4 = op_4.compose(a -> a * 9);
System.out.println(op_4.applyAsInt(56));
}
}실행 결과
The identity function : 56 The applyAsInt function : 168 The andThen function : 840 The compose function : 84
코드 설명
위 예제에는 'Demo'라는 클래스가 있으며, 이 클래스 안에 main 메서드가 포함되어 있습니다. 각 부분의 동작은 다음과 같습니다.
1. identity() 메서드: 'IntUnaryOperator'의 인스턴스에 'identity' 메서드를 호출하면 입력값을 변경 없이 그대로 반환하는 항등 연산자가 만들어집니다. 따라서 값 56을 넣으면 그대로 56이 출력됩니다.
2. applyAsInt() 메서드: 람다식 a -> 3 * a를 통해 세 배를 곱하는 연산을 정의했습니다. applyAsInt(56)을 호출하면 56 × 3 = 168이 계산되어 출력됩니다.
3. andThen() 메서드: 기존의 세 배 곱셈 연산에 a -> 5 * a 연산을 이어 붙였습니다. 연산 순서는 왼쪽에서 오른쪽으로 진행되므로, 먼저 56 × 3 = 168이 되고, 이어서 168 × 5 = 840이 최종 결과로 출력됩니다.
4. compose() 메서드: 'andThen'과 달리 전달된 연산이 먼저 실행됩니다. 56에 대해 먼저 × 9 = 504가 계산된 뒤, 이후 ÷ 6 연산이 적용되어 84가 출력됩니다.
모든 함수 호출의 결과는 위 실행 결과에서 볼 수 있듯이 콘솔에 순차적으로 출력됩니다.
정리
IntUnaryOperator는 int 타입 데이터에 대한 반복적인 변환 작업을 람다식과 함께 깔끔하게 표현할 수 있게 해주는 강력한 도구입니다. 특히 'andThen'과 'compose'를 활용하면 여러 연산을 체인(chain) 형태로 조합하여 가독성 좋은 코드를 작성할 수 있습니다. 스트림 API의 map 연산 등과 함께 사용하면 그 활용 범위가 더욱 넓어집니다.