0Pricing
Java Academy · 강의

사용자 정의 함수형 인터페이스

@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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Function과 BiFunction
  2. Supplier와 Consumer
  3. Predicate와 조합
  4. 사용자 정의 함수형 인터페이스
← Java Academy(으)로 돌아가기