[Java8] 함수형 인터페이스 정의와 람다식 구현 방법, 순수함수

    함수형 인터페이스 정의

    //추상메서드가 하나만 있으면 함수형 인터페이스다.
    //@FunctionalInterface 애노테이션을 붙여서 함수형 인터페이스를 정의 할 수 있다.
    public interface RunSomethinig {
        //인터페이스는 필드 앞에 abstract 생략 가능
        void doIt();
    
        //void doAgain(); @FuctionalInterface 애노테이션이 있으면 에러 발생
    
        //다른 형태의 메서드가 있어도 함수형 인터페이스 이다.
        static void printName() {
            System.out.println("kang");
        }
    
        default void printAge() {
            System.out.println("31");
        }
    }
    
    • 함수형 인터페이스는 추상메서드가 하나만 있는 인터페이스 이다.
    • 인터페이스는 필드 앞에 abstract 생략할 수 있다.
    • 다른 형태의 메서드가 있어도 추상메서드가 하나만 있다면 함수형 인터페이스다.
    • 스프링에서는 @FunctionalInterface 를 붙여서 함수형 인터페이스를 정의 할 수 있다.
    • @FuctionalInterface가 있다면 2개 이상의 필드를 선언할수 없다. 컴파일시 에러 난다.

    자바8 이전에는 익명 내부 클래스를 사용해서 인터페스를 구현 하였다.

    //자바8 이전에는 익명 내부 클래스를 사용해서 인터페이스 구현
    RunSomethinig runSomethinig = new RunSomethinig() {
        @Override
        public void doIt() {
            System.out.println("Hello");
        }
    };
    

    하지만 자바8부터는 아래처럼 람다식으로 함수형 인터페이스를 구현 할 수 있다. 2줄 이상이면 {}로 묶어서 람다식을 구현한다.

    //자바8 이후에는 람다식으로 함수형 인터페이스 구현 가능
    //한줄일 경우에만 {} 필요없이 아래처럼 사용가능
    RunSomethinig runSomethinig = () -> System.out.println("Hello");
    
    //두줄 이상이상이면 경우에만 {} 괄호 묶어서 람다식 구현
    RunSomethinig runSomethinig = () -> {
        System.out.println("Hello");
        System.out.println("good");
    };
    //만든 함수 실행
    runSomethinig.doIt();
    

    람다식으로 쓰면 함수처럼 보이지만 자바에서는 함수형 인터페이스를 구현한 특수한 형태의 객체라고 볼 수 있다.

    그래서 () → System.out.prinln("Hello") 이 자체를 리턴하는것도 가능하다.

    또 함수가 함수를 리턴하거나 매개변수로 받을수 있다. 이것을 고차함수라 한다.

    매개변수가 있는 함수형 인터페이스 람다식으로 구현

    public interface RunSomethinig {
        int doIt(int number);
    }
    
    RunSomethinig runSomethinig = (number) -> {
        return number + 10;
    };
    

    순수함수

    //순수 함수(pure function) 함수 밖에있는 값을 참조하거나 변경하지 않는 함수, 함수는 전달받은 값만을 사용해야 한다.
    int baseNumber = 10; //이값을 사용할때 순수 함수라 볼수 없고 선택값에 의존한다. 만약 Final 이면 찮다.
    
    RunSomethinig runSomethinig1 = new RunSomethinig() {
        int baseNumber = 10;// 여기도 함수 밖
    
        @Override
        public int doIt(int number) {
            baseNumber++; //함수 밖에있는 값을 변경하려고 할때 순수함수라 볼수 없다.
            return number + baseNumber;
        }
    };
    

    수학적으로 함수는 전달받은 값이 같으면 항상 같은 결과값이 나와야 한다. 이것을 순수함수(pure function)라고 한다. 순수함수로 볼수 없는 경우는 함수 밖에 있는 값을 변경하려고 하거나 사용하려고 할때 문법적으로 오류는 없지만 순수함수로 볼 수 없다. 코딩할때 순수함수를 달성하기 위해 주의해야 한다.

    순수함수를 달성하기 위해선 오로지 함수내부에서 쓰는 값 함수가 전달받은 파라미터 값만을 사용해야 한다.

     

     

    백기선 더 자바, Java 8 : https://www.inflearn.com/course/the-java-java8/dashboard

    댓글

    Designed by JB FACTORY