Menu
Coddy logo textTech

함수형 인터페이스

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

함수형 인터페이스(functional interface)는 정확히 하나의 추상 메서드를 포함하는 인터페이스입니다. 이러한 단일 메서드 제약 조건은 함수형 인터페이스를 특별하게 만드는데, 람다 표현식(lambda expressions)을 사용하여 구현할 수 있어 더욱 간결한 코딩 스타일을 가능하게 하기 때문입니다.

Java는 인터페이스를 함수형으로 명시적으로 표시하기 위해 @FunctionalInterface 어노테이션을 제공합니다. 선택 사항이지만, 이 어노테이션은 실수로 두 번째 추상 메서드를 추가할 경우 컴파일러가 오류를 포착하는 데 도움을 줍니다:

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

함수형 인터페이스를 클래스를 사용하는 전통적인 방식이나, 람다 표현식을 사용하는 더 간결한 방식으로 구현할 수 있습니다:

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

// 람다 표현식 (훨씬 더 짧습니다!)
Calculator adder = (a, b) -> a + b;

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

함수형 인터페이스는 단일 추상 메서드 규칙에 해당하지 않으므로 여전히 디폴트 메서드와 정적 메서드를 가질 수 있습니다. 자바의 java.util.function 패키지는 스트림과 컬렉션을 다룰 때 자주 접하게 될 Predicate, Function, Consumer와 같은 다양한 내장 함수형 인터페이스를 제공합니다.

challenge icon

챌린지

쉬움

함수형 인터페이스와 람다 표현식을 사용하여 문자열 변환 시스템을 구축해 보겠습니다. 단일 함수형 인터페이스를 통해 문자열에 다양한 변환을 적용할 수 있는 유연한 텍스트 프로세서를 만들 것입니다.

코드는 다음 세 개의 파일로 구성됩니다:

  • StringTransformer.java: 모든 문자열 변환 작업을 나타내는 함수형 인터페이스를 정의합니다. 함수형 인터페이스로 유지되도록 @FunctionalInterface 어노테이션을 추가하세요. 인터페이스에는 String을 매개변수로 받아 String을 반환하는 transform이라는 단일 추상 메서드를 선언해야 합니다.
  • TextProcessor.java: 함수형 인터페이스를 사용하여 텍스트를 처리하는 클래스를 만듭니다. StringTransformer를 저장할 필드와 이를 초기화하는 생성자가 있어야 합니다. 주어진 텍스트에 변환기를 적용하고 결과를 반환하는 process(String text) 메서드를 포함하세요. 이 설계를 통해 생성자를 통해 어떤 변환 동작이든 주입할 수 있습니다.
  • Main.java: 람다 표현식을 사용하여 다양한 변환을 생성함으로써 모든 요소를 하나로 합칩니다. 두 개의 입력, 즉 텍스트 문자열과 작업 유형(upper, lower, 또는 reverse)을 받게 됩니다.

    작업 유형에 따라 적절한 람다를 사용하여 TextProcessor를 생성하세요:

    • upper: 텍스트를 대문자로 변환
    • lower: 텍스트를 소문자로 변환
    • reverse: 텍스트를 뒤집음 (힌트: StringBuilder 사용)

    그런 다음 입력 텍스트와 함께 process()를 호출하고 결과를 Result: [transformed text] 형식으로 출력하세요.

변환할 텍스트(String)와 작업 유형(String)의 두 가지 입력을 받게 됩니다.

어떤 람다를 전달하느냐에 따라 동일한 TextProcessor 클래스가 완전히 다른 작업을 수행할 수 있는 방식에 주목하세요. 이것이 바로 함수형 인터페이스의 강력함입니다!

치트 시트

함수형 인터페이스(functional interface)는 정확히 하나의 추상 메서드를 가진 인터페이스입니다. 간결한 코드를 위해 람다 표현식을 사용하여 구현할 수 있습니다.

@FunctionalInterface 어노테이션을 사용하여 인터페이스를 함수형으로 표시하십시오 (선택 사항이지만 권장됨):

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

함수형 인터페이스는 전통적인 방식이나 람다 표현식으로 구현할 수 있습니다:

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

// 람다 표현식
Calculator adder = (a, b) -> a + b;

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

함수형 인터페이스는 단일 추상 메서드 규칙을 위반하지 않고 디폴트 및 정적 메서드를 가질 수 있습니다.

Java의 java.util.function 패키지는 Predicate, Function, 그리고 Consumer와 같은 내장 함수형 인터페이스를 제공합니다.

직접 해보기

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: operation 유형에 따라 적절한 람다를 사용하여 TextProcessor를 생성하세요:
        // - "upper": 텍스트를 대문자로 변환합니다
        // - "lower": 텍스트를 소문자로 변환합니다
        // - "reverse": 텍스트를 뒤집습니다 (힌트: StringBuilder를 사용하세요)
        
        // TODO: 입력 텍스트와 함께 process()를 호출하고 결과를 출력하세요
        // 출력 형식: "Result: [transformed text]"
    }
}
quiz icon실력 점검

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

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