함수형 인터페이스
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와 같은 다양한 내장 함수형 인터페이스를 제공합니다.
챌린지
쉬움함수형 인터페이스와 람다 표현식을 사용하여 문자열 변환 시스템을 구축해 보겠습니다. 단일 함수형 인터페이스를 통해 문자열에 다양한 변환을 적용할 수 있는 유연한 텍스트 프로세서를 만들 것입니다.
코드는 다음 세 개의 파일로 구성됩니다:
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]"
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조6인터페이스와 추상 클래스
인터페이스 소개인터페이스 구현하기다중 인터페이스 구현인터페이스의 Default 및 Static 메서드추상 클래스 vs 인터페이스함수형 인터페이스복습 - 결제 시스템