본문으로 바로가기

목차

    1. 함수형 인터페이스란?

    • 추상 메소드가 딱 하나인 인터페이스
    • SAM(Single Abstract Method) 인터페이스
    • @FuncationInterface 애노테이션​을 가지고 있는 인터페이스
    • 추상 메소드만 1개이면 되고 static 메소드default 메소드는 여러 개 포함할 수 있습니다.
    • 함수형 인터페이스를 이용해 람다 표현식을 구현(사용)할 수 있습니다.
    • 람다를 구현하기 위해 함수형 인터페이스를 사용한다고 볼 수 있습니다.

    2. 함수형 인터페이스 생성하기

    • 인터페이스에서 메소드의 접근 지정자를 지정하지 않을 경우 기본 값이 abstract이므로 추상메소드를 작성할 경우 abstract를 생략해도 됩니다.

    [반환 값이 없는 함수형 인터페이스]

    @FunctionalInterface
    public interface TestVoidFuncInterface {
    
        void printText();
    
        static void staticMethod() {
            System.out.println("static Method");
        }
    
        default void defaultMethod1() {
            System.out.println("default Method1");
        }
    
        default void defaultMethod2() {
            System.out.println("default Method2");
        }
    }

     

    [반환 값이 있는 함수형 인터페이스]

    @FunctionalInterface
    public interface TestReturnFuncInterface {
    
        int operation(int...num);
    
        static int addNumber(int num1, int num2) {
            return num1 + num2;
        }
    
        default int multiplyNumber(int num1, int num2) {
            return num1 * num2;
        }
    }

    3. 함수형 인터페이스 사용하기

    [반환 값이 있는 함수형 인터페이스]

    @FunctionalInterface
    public interface TestReturnFuncInterface {
    
        // 가변 매개변수
        int operation(int...num);
    
        // static 메소드
        static int addNumber(int num1, int num2) {
            return num1 + num2;
        }
    
        // default 메소드
        default int multiplyNumber(int num1, int num2) {
            return num1 * num2;
        }
    }

     

    [구현 1: 익명 내부 클래스]

    [익명 클래스 형식]

    클래스 인스턴스 = new 클래스() {

    };

    public class Exe {
    
        public static void main(String[] args) {
    
            // 익명 내부 클래스
            TestReturnFuncInterface anonymousInnerClass = new TestReturnFuncInterface() {
                @Override
                public int operation(int... num) {
                    int TempSum = 0;
    
                    for(int a : num) {
                        TempSum += a;
                    }
    
                    return TempSum;
                }
            };
    
            // 구현한 추상 메소드
            int result1 = anonymousInnerClass.operation(1,2,3,4,5,6,7,8,9,10);
            System.out.println(result1); // 55
    
            // static 메소드
            int result2 = TestReturnFuncInterface.addNumber(1,2);
            System.out.println(result2); // 3
    
            // default 메소드
            int result3 = anonymousInnerClass.multiplyNumber(10,20);
            System.out.println(result3); // 200
        }        
    }

     

    [구현 2: 람다]

    [람다 형식]

    (인자 리스트) -> {바디}

    public class Exe {
    
        public static void main(String[] args) {
    
            // 람다: 바디가 여러 줄인 경우
            TestReturnFuncInterface lambda1 = (int...num) -> {
                int TempSum = 0;
    
                for(int a : num) {
                    TempSum += a;
                }
    
                return TempSum;
            };
    
            int result1 = lambda1.operation(1,2,3,4,5,6,7,8,9,10);
            System.out.println(result1); // 55
    
            // 람다: 바디가 한 줄인 경우 {} 생략 가능
            TestReturnFuncInterface lambda2 = (int...num) -> Arrays.stream(num).sum();
    
            int result2 = lambda2.operation(1,2,3,4,5,6,7,8,9,10);
            System.out.println(result2); // 55
        }        
    }