[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