사용자 정의 함수형 인터페이스
@FunctionalInterface로 직접 정의합니다
사용자 정의 함수형 인터페이스은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
인터페이스를 함수형으로 만드는 요소
함수형 인터페이스에는 정확히 하나의 추상 메서드(SAM)가 있습니다. 람다가 구현하는 것이 바로 이 메서드입니다.
- 기본 메서드와 정적 메서드는 이 제한의 개수에 포함되지 않습니다.
interface Greeter {
String greet(String name);
}
public class Main {
public static void main(String[] args) {
Greeter g = name -> "Hello, " + name;
System.out.println(g.greet("Ada"));
}
}@FunctionalInterface 어노테이션
@FunctionalInterface는 컴파일러가 단일 추상 메서드 규칙을 적용하도록 지시합니다. 실수로 두 번째 추상 메서드를 추가하면 컴파일이 실패합니다.
@FunctionalInterface
interface Calculator {
int compute(int a, int b);
}
public class Main {
public static void main(String[] args) {
Calculator add = (a, b) -> a + b;
System.out.println(add.compute(3, 4));
}
}어노테이션이 도움이 되는 이유
이 어노테이션은 의도를 문서화하고 계약을 보호합니다. 이 어노테이션이 없어도 인터페이스는 함수형으로 작동하지만, 팀원이 다른 추상 메서드를 추가하여 이를 깨뜨릴 수 있습니다.
@FunctionalInterface
interface Transformer {
String apply(String input);
}
public class Main {
public static void main(String[] args) {
Transformer reverse = s -> new StringBuilder(s).reverse().toString();
System.out.println(reverse.apply("abc"));
}
}제네릭을 사용하는 사용자 정의 인터페이스
기본 제공 인터페이스와 마찬가지로 인터페이스를 제네릭으로 만들 수 있습니다.
@FunctionalInterface
interface Converter<S, T> {
T convert(S source);
}
public class Main {
public static void main(String[] args) {
Converter<String, Integer> toInt = Integer::parseInt;
System.out.println(toInt.convert("123") + 1);
}
}기본 메서드는 허용됩니다
함수형 인터페이스에는 default 메서드가 있을 수 있습니다. 기본 메서드는 단일 추상 메서드 규칙을 깨뜨리지 않고 동작을 추가합니다.
@FunctionalInterface
interface Operation {
int apply(int x);
default Operation then(Operation next) {
return x -> next.apply(this.apply(x));
}
}
public class Main {
public static void main(String[] args) {
Operation inc = x -> x + 1;
Operation dbl = x -> x * 2;
System.out.println(inc.then(dbl).apply(5));
}
}정적 메서드도 허용됩니다
정적 메서드는 Function.identity()와 비슷하게 팩터리 역할을 할 수 있습니다.
@FunctionalInterface
interface Mapper {
int map(int x);
static Mapper identity() {
return x -> x;
}
}
public class Main {
public static void main(String[] args) {
System.out.println(Mapper.identity().map(99));
}
}검사 예외 던지기
추상 메서드가 검사 예외를 선언하면 람다에서 해당 예외를 던질 수 있습니다. 기본 제공 Function으로는 이 작업을 할 수 없으며, 이것이 직접 정의한 인터페이스가 필요한 이유 중 하나입니다.
@FunctionalInterface
interface RiskyParser {
int parse(String s) throws NumberFormatException;
}
public class Main {
public static void main(String[] args) {
RiskyParser p = Integer::parseInt;
System.out.println(p.parse("77"));
}
}메서드에 사용자 정의 인터페이스 전달하기
인터페이스를 매개변수 타입으로 사용할 수 있으므로 호출자가 람다를 통해 동작을 제공할 수 있습니다.
@FunctionalInterface
interface IntCombiner {
int combine(int a, int b);
}
public class Main {
static int reduce(int[] arr, IntCombiner c) {
int acc = arr[0];
for (int i = 1; i < arr.length; i++) acc = c.combine(acc, arr[i]);
return acc;
}
public static void main(String[] args) {
int[] data = {1, 2, 3, 4};
System.out.println(reduce(data, (a, b) -> a + b));
}
}세 인수 인터페이스
JDK는 단일 인수 및 두 인수 인터페이스만 제공합니다. 인수가 세 개 이상이면 직접 정의하십시오.
@FunctionalInterface
interface TriFunction<A, B, C, R> {
R apply(A a, B b, C c);
}
public class Main {
public static void main(String[] args) {
TriFunction<Integer, Integer, Integer, Integer> sum3 = (a, b, c) -> a + b + c;
System.out.println(sum3.apply(1, 2, 3));
}
}사용자 정의 인터페이스에 맞는 메서드 참조
SAM의 시그니처와 일치하는 메서드는 무엇이든 메서드 참조로 전달할 수 있습니다.
@FunctionalInterface
interface StringTest {
boolean check(String s);
}
public class Main {
public static void main(String[] args) {
StringTest blank = String::isBlank;
System.out.println(blank.check(" "));
}
}익명 클래스와 람다 비교
람다는 함수형 인터페이스를 구현하는 익명 클래스를 간결하게 대체합니다. 두 방식은 동일한 동작을 생성합니다.
@FunctionalInterface
interface Action {
void run();
}
public class Main {
public static void main(String[] args) {
Action old = new Action() {
public void run() { System.out.println("anonymous"); }
};
Action neo = () -> System.out.println("lambda");
old.run();
neo.run();
}
}빠른 확인
@FunctionalInterface는 무엇을 보장합니까?
복습
사용자 정의 함수형 인터페이스를 정의했습니다:
- 함수형 인터페이스에는 정확히 하나의 추상 메서드(SAM)가 있습니다.
@FunctionalInterface는 컴파일 시점에 이 규칙을 적용합니다.- 기본 메서드와 정적 메서드, 제네릭, 검사 예외를 모두 사용할 수 있습니다.
- 사용자 정의 인터페이스는 세 인수 함수나 검사 예외를 던지는 람다처럼 JDK가 다루지 않는 부분을 보완합니다.
자주 묻는 질문
“사용자 정의 함수형 인터페이스” 강의는 무료인가요?
네 — “사용자 정의 함수형 인터페이스” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“사용자 정의 함수형 인터페이스”에서 뭘 배우나요?
@FunctionalInterface로 직접 정의합니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“사용자 정의 함수형 인터페이스” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Function과 BiFunction
- Supplier와 Consumer
- Predicate와 조합
- 사용자 정의 함수형 인터페이스