함수형 인터페이스

정다운·2025년 5월 4일

고급자바

목록 보기
3/7

함수형 인터페이스와 제네릭

  • 제네릭을 사용해야 하는 이유 :
    제네릭을 도입하면 코드 재사용성과 타입 안정성을 동시에 확보할 수 있다.
    제네릭을 사용하면 다양한 데이터 타입을 처리할 수 있으면서, 컴파일 시점에 타입을 체크하여 런타임 오류를 방지할 수 있다.
  • 예시 : 문자 타입과 숫자 타입을 처리하는 두 개의 함수형 인터페이스를 사용하여 각각 다른 타입을 처리할 수 있도록 하고, 제네릭을 도입하여 코드의 중복을 줄인다.

람다와 타겟 타입

  • 람다 표현식 :
    람다 표현식은 자체적으로 타입을 가지고 있지 않으며, 타겟 타입에 따라 타입이 결정된다.
    예를 들어 Function<Integer, String> 에 람다식을 대입하면 그 타입은 Function<Integer, String>으로 결정된다.
  • 타겟 타입 :
    람다는 대입되는 함수형 인터페이스의 타입에 맞춰 타입이 정해지므로, 같은 람다라도 서로 다른 함수형 인터페이스에 대입될 수 있다.

자바가 제공하는 기본 함수형 인터페이스

Function<T, R>

  • 하나의 입력 T를 받아 결과 R을 반환하는 함수형 인터페이스로, 데이터를 변환하는 데 사용된다.

Consumer< T>

  • 하나의 입력 T를 받아 결과 없이 처리하는 함수형 인터페이스로, 주로 로그 출력, 데이터 저장 등의 작업에서 사용된다.

Supplier< T>

  • 매개변수 없이 결과만 반환하는 함수형 인터페이스로, 값을 생성하거나 지연 초기화할 때 사용된다.

Runnable

  • 매개변수와 반환값이 모두 없는 함수형 인터페이스로, 주로 멀티스레딩 작업에서 사용된다.

특화 함수형 인터페이스

Predivate< T>

  • 주어진 입력을 받아 boolean을 반환하여 조건 검사나 필터링에 사용된다.
  • 예를 들어, 짝수 여부를 판단할 때 사용된다.

UnaryOperator< T>

  • 입력과 반환 타입이 동일한 단항 연산을 수행하는 함수형 인터페이스로, 숫자 제곱이나 문자열 대문자 변환 등에 사용된다.

BinaryOperator< T>

  • 두 개의 입력을 받아 같은 타입의 출력을 반환하는 함수형 인터페이스로, 두 수의 덧셈이나 곱셈과 같은 연산에 사용된다.

입력값이 여러 개인 경우

BiFunction

  • 두 개의 입력을 받아 하나의 결과를 반환하는 함수형 인터페이스이다.

TriFunction

  • 기본적으로 제공되지 않지만, 세 개 이상의 입력을 처리할 필요가 있을 때 커스텀 인터페이스로 정의하여 사용할 수 있다.

기본형 지원 함수형 인터페이스

  • 자바의 제네릭은 기본형 타입을 직접 다룰 수 없기 때문에, IntFunction, ToIntFunction, IntUnaryOperator와 같은 기본형 전용 함수형 인터페이스를 제공한다.

  • 예시:
    IntFunction은 매개변수로 int 타입을 받고, ToIntFunction은 반환값으로 int 타입을 반환한다.

자주 사용되는 함수형 인터페이스의 예시

  • filter:
    조건에 맞는 요소만 뽑아내는 함수로, Predicate를 사용하여 조건을 검사한다.

  • map:
    리스트의 각 요소를 변환하는 함수로, UnaryOperatorFunction을 사용하여 변환 작업을 수행한다.

  • reduce:
    리스트 요소를 하나로 축약하는 함수로, BinaryOperator를 사용하여 요소를 결합하거나 연산을 수행한다.

결론

  • 함수형 인터페이스와 람다를 사용하면 코드가 더 간결해지고 유연해진다.
  • 제네릭을 활용하면 코드 재사용성을 높이고 타입 안정성을 보장할 수 있다.
  • 자바에서 제공하는 다양한 기본 함수형 인터페이스를 사용하면, 불필요한 인터페이스를 만들지 않아도 되고, 코드의 유지보수성도 향상된다.
  • 각 함수형 인터페이스는 그 사용 의도를 명확히 나타내기 때문에, 코드를 이해하기 쉽고 유지보수가 용이해진다.

0개의 댓글