Menu
Coddy logo textTech

함수형 인터페이스

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 39번째.

functional 인터페이스는 정확히 하나의 abstract method를 포함하는 인터페이스입니다. 이 단일 method 제약으로 인해 functional 인터페이스는 특별해집니다. lambda expression을 사용하여 구현할 수 있으므로 더 간결한 코딩 스타일을 가능하게 합니다.

Java는 인터페이스를 functional로 명시적으로 표시하기 위해 @FunctionalInterface annotation을 제공합니다. 선택 사항이지만, 이 annotation은 실수로 두 번째 abstract method를 추가했을 때 컴파일러가 오류를 감지하는 데 도움이 됩니다:

@FunctionalInterface
public interface Calculator {
    int calculate(int a, int b);
}

functional interface는 class를 사용한 전통적인 방식으로 구현하거나, 더 간결하게 lambda expression으로 구현할 수 있습니다:

// 전통적인 구현
Calculator adder = new Calculator() {
    @Override
    public int calculate(int a, int b) {
        return a + b;
    }
};

// Lambda expression (much shorter!)
Calculator adder = (a, b) -> a + b;

System.out.println(adder.calculate(5, 3));  // 8

Functional 인터페이스에는 여전히 default 메서드와 static 메서드가 포함될 수 있습니다. 이러한 메서드는 단일 abstract 메서드 규칙에 포함되지 않기 때문입니다. Java의 java.util.function 패키지는 Predicate, Function, Consumer와 같은 다양한 내장 Functional 인터페이스를 제공하며, 스트림과 컬렉션을 사용할 때 자주 접하게 됩니다.

challenge icon

챌린지

쉬움

functional interface와 lambda expression을 사용하여 문자열 변환 시스템을 만들어 봅시다. 하나의 functional interface를 기반으로 문자열에 다양한 변환을 적용할 수 있는 유연한 텍스트 processor를 만들게 됩니다.

코드를 세 개의 파일로 구성합니다:

  • StringTransformer.java: 모든 문자열 변환 operation을 나타내는 functional interface를 Define합니다. functional 상태를 유지하도록 @FunctionalInterface annotation을 사용해 표시합니다. interface에는 String을 받아 String을 반환하는 transform이라는 하나의 abstract method를 Declare해야 합니다.
  • TextProcessor.java: functional interface를 사용하여 텍스트를 process하는 class를 Create합니다. StringTransformer를 hold할 field와 이를 초기화할 constructor가 있어야 합니다. 주어진 텍스트에 transformer를 적용하고 Result를 반환하는 process(String text)라는 method를 포함합니다. 이 설계를 사용하면 constructor를 통해 어떤 변환 동작이든 주입할 수 있습니다.
  • Main.java: lambda expression을 사용하여 다양한 변환을 Create함으로써 모든 요소를 결합합니다. 두 개의 input을 받습니다. 텍스트 문자열과 operation type(upper, lower 또는 reverse)입니다.

    operation type에 Based하여 appropriate한 lambda를 사용하는 TextProcessor를 Create합니다:

    • upper: 텍스트를 대문자로 변환합니다
    • lower: 텍스트를 소문자로 변환합니다
    • reverse: 텍스트를 뒤집습니다(hint: StringBuilder를 사용하세요).

    그런 다음 input 텍스트와 함께 process()를 Call하고 다음 format으로 Result를 print합니다: Result: [transformed text]

변환할 텍스트(String)와 operation type(String)이라는 두 개의 input을 받습니다.

전달하는 lambda에 따라 동일한 TextProcessor class가 완전히 다른 operation을 수행할 수 있다는 점에 주목하세요. 이것이 functional interface의 강력함입니다!

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String text = scanner.nextLine();
        String operation = scanner.nextLine();
        
        TextProcessor processor;
        
        // TODO: 작업 유형에 따라 적절한 람다로 TextProcessor를 생성하세요:
        // - "upper": 텍스트를 대문자로 변환합니다
        // - "lower": 텍스트를 소문자로 변환합니다
        // - "reverse": 텍스트를 뒤집습니다 (힌트: StringBuilder 사용)
        
        // TODO: 입력 텍스트로 process()를 호출하고 결과를 출력하세요
        // 출력 형식: "Result: [transformed text]"
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Java 컴파일러