주요 함수적 인터페이스 (JAVA)
안녕하세요? 코딩 중독입니다.
저번 시간에는 메소드 참조에 대해서 알아 보았습니다. 이번 시간에는 Java 표준 API에서 제공하는 함수적 인터페이스가 어떤 것이 있는지 설명하겠습니다.
표준 API에서 제공하는 함수적 인터페이스의 종류
제가 메소드 참조를 설명할 때, IntBinaryOperator나 ToIntBiFunction와 같은 함수적 인터페이스를 소개하였습니다. 이와 같이 java8부터는 빈번하게 사용되는 함수적 인터페이스는 java.util.function 표준 API 패키지로 제공합니다. 그리고 이 패키지 안에 있는 함수적 인터페이스들을 크게 Consumer, Supplier, Function, Operator, Predicate로 구분할 수 있습니다. 이번 파트는 나중에 다룰 stream에서도 자주 사용하므로 꼭 잘 익히고 가셔야 합니다.
(1) Consumer 함수적 인터페이스
위의 표에서 알 수 있듯이, Consumer 인터페이스는 특정 객체를 소비합니다. 소비한다는 것이 뭘까요? 바로, 매개 변수를 사용만 하고 리턴을 하지 않는다는 뜻입니다. 그래서 추상 메소드의 리턴 형태가 void가 됩니다. 그리고 모두 추상 메소드로 accpet()를 가지고 있기 때문에 인터페이스를 사용하기 위해서는 이를 정의해 주어야 합니다.
아래는 Consumer 인터페이스를 사용한 예시 코드입니다.
간단히 적당한 문자열을 출력하도록 설계하였습니다.
(2) Supplier 함수적 인터페이스
위의 표에서 알 수 있듯이, Supplier 인터페이스는 특정 값을 리턴합니다. 이때, 주의하실 점이 이 인터페이스는 매개변수를 갖지 않습니다. 따라서 람다 바디 내에서 변수를 정의한 후 값을 리턴하도록 설계해야합니다. 추상 메소드는 공통적으로 getXXX() 형태이며, 이를 정의해 주어야 인터페이스를 사용할 수 있습니다.
아래는 Supplier 인터페이스를 사용한 예시 코드입니다.
IntSupplier 인터페이스를 사용하기 위해서 추상 메소드인 getAsInt()를 정의하였는데, 1 ~ 6 사이의 주사위를 굴리는 코드를 작성하였습니다.
(3) Function 함수적 인터페이스
위의 표에서 알 수 있듯이, Function 함수적 인터페이스는 매개값을 리턴값으로 매핑(타입 변환)합니다. 추상 메소드는 공통적으로 applyXXX() 형태이며, 이를 정의해 주어야 인터페이스를 사용할 수 있습니다.
아래는 Function 인터페이스를 사용한 예시 코드입니다.
간단히 자료형을 다른 자료형으로 바꾸도록 설계하였습니다.
(4) Operator 함수적 인터페이스
인터페이스명 | 추상 메소드 | 설명 |
BinaryOperator<T> | T apply(T t T t) | T와 T를 연산한 후 T 리턴 |
UnaryOperator<T> | T apply(T t) | T를 연산한 후 T 리턴 |
DoubleBinaryOperator | double applyAsDouble(double, double) | 두 개의 double 연산 |
DoubleUnaryOperator | double applyAsDouble(double) | 한 개의 double 연산 |
IntBinaryOperator | int applyAsInt(int, int) | 두 개의 int 연산 |
IntUnaryOperator | int applyAsInt(int) | 한 개의 int 연산 |
LongBinaryOperator | long applyAsLong(long, long) | 두 개의 long 연산 |
LongUnaryOperator | long applyAsLong(long) | 한 개의 long 연산 |
Operator 함수적 인터페이스는 Function과 동일하게 매개 변수와 리턴값이 있는 applyXXX() 메소드를 가지고 있습니다. 하지만 이 메소드들은 매개값을 리턴값으로 매핑하는 역할보다는 매개값을 이용해서 연산을 수행한 후 동일한 타입으로 리턴값을 제공하는 역할을 합니다.
아래는 Operator 인터페이스를 사용한 예시 코드입니다.
배열 안에서 최댓값과 최솟값을 찾고, 그것들을 출력하도록 설계하였습니다.
(5) Predicate 함수적 인터페이스
인터페이스명 | 추상 메소드 | 설명 |
Predicate<T> | boolean test(T t) | 객체 T를 조사 |
BiPredicate<T, U> | boolean test(T t, U u) | 객체 T와 U를 비교 조사 |
DoublePredicate | boolean test(double value) | double 값을 조사 |
IntPredicate | boolean test(int value) | int 값을 조사 |
LongPredicate | boolean test(long value) | long 값을 조사 |
Predicate 인터페이스는 매개 변수와 boolean 리턴값이 있는 test() 추상 메소드를 가지고 있습니다. 이 메소드는 매개값을 조사해서 true 또는 false를 리턴하는 역할을 합니다.
아래는 Predicate 인터페이스를 사용한 예시 코드입니다.
아직 배우지 않은 stream 문법이 있지만, 제대로 이해하실 필요 없고 단순히 배열 안의 요소를 하나씩 순회하는 역할을 한다는 점만 알아두시면 됩니다.
위 코드는 커트라인을 90점으로 잡고, 특정 점수가 합격인지 아닌지 판단하도록 설계하였습니다. 사실, stream의 다른 메소드를 사용하면 코드를 확 줄일 수 있지만, Predicate를 강조하기 위해서 일부러 조금 비효율적인 코드를 작성하였습니다.
정리
지금까지 java 표준 API에서 제공하는 함수적 인터페이스를 알아 보았습니다. 다시 한 번 말씀드리지만, 이들은 바로 뒤에서 다룰 stream에서 그대로 쓰이기 때문에 사용하는 형태는 암기해두는 편이 좋을 듯 합니다.
참고 서적
이것이 자바다. - 저자 신용권
'프로그래밍 언어 > Java' 카테고리의 다른 글
Stream이란? - 스트림의 종류와 생성 방법 (JAVA) (0) | 2021.01.05 |
---|---|
Stream이란? - 기본 개념과 특징 (JAVA) (2) | 2021.01.05 |
람다식(Lambda Expressions)의 메소드 참조 :: (JAVA) (1) | 2021.01.03 |
람다식(Lambda Expressions)에서의 지역 변수 사용 (JAVA) (0) | 2021.01.02 |
JVM 메모리 구조란? (JAVA) (1) | 2021.01.02 |
댓글