티스토리 뷰

Java/이론

함수형 인터페이스 (JAVA)

0bliviat3 2023. 11. 17. 12:44

정의 (depth - 0)

 

함수형 인터페이스는 단 하나의 추상메소드를 갖는 인터페이스를 말한다.

여러개의 디폴트 메소드와 상관없이 하나의 추상메소드를 갖는다면 함수형 인터페이스이다.

JAVA 8 부터 지원되는 람다는 함수형 인터페이스의 활용으로만 사용이 가능하다.

즉 파라미터로 메소드를 넘기고 싶을때 함수형 인터페이스의 활용으로 충분히 가능하다.

이는 같은 구조를 갖는 여러매소드를 하나로 만들어 좀 더 객체 지향적인 설계가 가능하게끔 만들어준다.

 

 

종류 (depth - 1)

 

이런 함수형 인터페이스는 직접 만들어 사용해도 무방하지만,

사실 이미 JAVA에서 지원해주는 기본 함수형 인터페이스를 활용해도 어지간한 상황은 다 해결이 가능하다.

 

기본적으로 제공되는 함수형 인터페이스는 하단의 공식문서를 참조하도록 하자

 

https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

 

java.util.function (Java Platform SE 8 )

Interface Summary  Interface Description BiConsumer Represents an operation that accepts two input arguments and returns no result. BiFunction Represents a function that accepts two arguments and produces a result. BinaryOperator Represents an operation u

docs.oracle.com

 

이 중에서도 많이 사용되는 몇가지만 정리하자면 다음 표와 같다.

 

함수형 인터페이스 추상 메소드 활용
Consumer<T> accept(T t) 파라미터로 받는 값을 소비하고
리턴값은 없는 형태
Function<T,R> apply(T t) 파라미터로 받는 T타입 값을 소비하고
R타입의 값을 리턴하는 형태
Predicate<T> test(T t) 파라미터로 받는 T타입 값을 소비하고
boolean 타입의 값을 리턴하는 형태
Supplier<T> get() 파라미터는 없이 T타입의 값을
리턴하는 형태
Runnable run() 파라미터도 리턴값도 없는 형태

 

 

 

활용 예시 (depth - 2)

 

 

우아한 프리코스에서 진행했던 미션인 로또미션에서 요구사항을보면

 

 

 

라고 되어있다.

 

즉, 여러번의 입력을 받아야하는 상황에서 모든 입력에 대한 예외처리가 필요한 상황인것이다.

 

바로 이 때 함수형 인터페이스를 활용한다면 같은 구조를 같는 모든 메소드를 하나의 메소드로

표현이 가능하고 소스의 재사용성을 높일수 있게되는것이다.

 

다음과 같이 로또를 구매하는 금액의 입력에 대핸 예외처리, 당첨번호에 대한 예외처리, 보너스 번호에 대한

예외처리 모두 동일한 구조를 같은 메소드 형태임을 알수 있다.

 

    public void inputPayment() {
        System.out.println(DEPOSIT.getMessage());
        try {
            gameController.lottoAdd(validatePayUnit(validateInteger(Console.readLine())));
        } catch (IllegalArgumentException e) {
            printErrorMessage(e);
            inputPayment();
        }
    }

    public void inputWinNumber() {
        System.out.println(WIN_NUMBER.getMessage());
        try {
            String[] winNumbers = Console.readLine().split(SPRIT_REGEX);
            gameController.winningLottoAdd(new Lotto(makeWinNumber(winNumbers)));
        } catch (IllegalArgumentException e) {
            printErrorMessage(e);
            inputWinNumber();
        }
    }

    public void inputBonusNumber() {
        System.out.println(BONUS_NUMBER.getMessage());
        try {
            gameController.bonusLottoAdd(validateRange(validateInteger(Console.readLine())));
        } catch (IllegalArgumentException e) {
            printErrorMessage(e);
            inputBonusNumber();
        }
    }

 

 

이런 동일한 구조를 같는 메소드를  함수형 인터페이스를 활용한다면 어떤 모습을 갖도록 할수 있는가..

 

다음과 같이 Consumer 인터페이스를 활용한다면 받는 입력을 파라미터로 받아 처리하는 메소드의

형태로 만들어 줄수 있을것이다. 

 

    private void validateInput(OutputMessage outputMessage, Consumer<String> consumer) {
        System.out.println(outputMessage.getMessage());
        try {
            consumer.accept(Console.readLine());
        } catch (IllegalArgumentException exception) {
            printErrorMessage(exception);
            validateInput(outputMessage, consumer);
        }
    }

 

 

이제 이 메소드 호출을 위해 파라미터로 넘겨줄 메소드만 다시 작성해주도록 하겠다.

 

 

    private void inputLotto(String input) {
        gameController.lottoAdd(validatePayUnit(validateInteger(input)));
    }

    private void inputWinNumber(String input) {
        String[] winNumbers = input.split(SPRIT_REGEX);
        gameController.winningLottoAdd(new Lotto(makeWinNumber(winNumbers)));
    }

    private void inputBonusNumber(String input) {
        gameController.bonusLottoAdd(validateRange(validateInteger(input)));
    }

 

 

 

그리고 하나의 메소드로 묶어서 아까 만들어준 메소드에 인자로 넣어준다면,

같은 구조를 같는 메소드를 묶어서 처리해주는것이 가능하다.

 

    public void read() {
        validateInput(DEPOSIT, this::inputLotto);
        validateInput(WIN_NUMBER, this::inputWinNumber);
        validateInput(BONUS_NUMBER, this::inputBonusNumber);
    }

 

 

또 훨씬 더 깔끔해진 모습을 볼 수있다.

 

 

 

'Java > 이론' 카테고리의 다른 글

일급컬렉션  (1) 2023.11.26
Enum  (0) 2023.11.24
제네릭(Generic)  (1) 2023.10.04
연산자 (Operator)  (0) 2023.09.20
형 변환(casting)  (0) 2023.09.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함