함수형 인터페이스
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)); // 8Functional 인터페이스에는 여전히 default 메서드와 static 메서드가 포함될 수 있습니다. 이러한 메서드는 단일 abstract 메서드 규칙에 포함되지 않기 때문입니다. Java의 java.util.function 패키지는 Predicate, Function, Consumer와 같은 다양한 내장 Functional 인터페이스를 제공하며, 스트림과 컬렉션을 사용할 때 자주 접하게 됩니다.
챌린지
쉬움functional interface와 lambda expression을 사용하여 문자열 변환 시스템을 만들어 봅시다. 하나의 functional interface를 기반으로 문자열에 다양한 변환을 적용할 수 있는 유연한 텍스트 processor를 만들게 됩니다.
코드를 세 개의 파일로 구성합니다:
StringTransformer.java: 모든 문자열 변환 operation을 나타내는 functional interface를 Define합니다. functional 상태를 유지하도록@FunctionalInterfaceannotation을 사용해 표시합니다. 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]"
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조6인터페이스와 추상 클래스
인터페이스 소개인터페이스 구현하기다중 인터페이스 구현인터페이스의 Default 및 Static 메서드추상 클래스 vs 인터페이스함수형 인터페이스복습 - 결제 시스템직접 연습해 보세요: 온라인 Java 컴파일러