본문 바로가기

Java/Java8

(JAVA8) 함수형 인터페이스와 람다 표현식 (1)

함수형 인터페이스 (Functional Interface)

  • 추상 메서드를 딱 하나만 가지고 있는 인터페이스
  • SAM (Single Abstract Method) 인터페이스
  • @FunctionalInterface 어노테이션을 가지고 있는 인터페이스

기본 형식 - 만약 여기에 추상 메서드가 하나 추가된다면 함수형 인터페이스가 아니다.

@FunctionalInterface
public interface RunSomething {
    
    int doIt(int number);
    
}

디폴트 메서드 혹은 static 메서드는 함수형 인터페이스가 맞다.

@FunctionalInterface
public interface RunSomething {
    
    int doIt(int number);

    static void printName() {
        System.out.println("Junwoo");
    }

    default void printAge() {
        System.out.println("30");
    }

}

람다 표현식 (Lambda Expressions)

익명 내부 클래스로부터 람다식으로 변형시킴으로써 코드 라인을 줄일 수 있다.

 

익명 내부 클래스

RunSomething runSomething2 = new RunSomething() {
    @Override
    public int doIt(int number) {
        return 0;
    }
};

람다식 변형

RunSomething runSomething2 = () -> {
    System.out.println("Hello!");
    System.out.println("Lamda");
};

RunSomething runSomething3 = (number) -> {
    return number+10;
};
  • 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다.
  • 코드를 줄일 수 있다.
  • 메서드 매개변수, 리턴 타입, 변수로 만들어 사용할 수도 있다.

자바에서 함수형 프로그래밍

  • 함수를 First class object로 사용할 수 있다.
  • 순수 함수 (Pure function)
    • 사이드 이팩트가 없다. - 입력받은 값이 같은 경우 결과는 항상 같아야 한다.
//결과는 무조건 같아야 한다.
System.out.println(runSomething3.doIt(5));
System.out.println(runSomething3.doIt(5));
System.out.println(runSomething3.doIt(5));
System.out.println(runSomething3.doIt(5));

만약 위의 결과를 보장하지 못한다면 함수형 프로그래밍이라고 볼 수 없다.

    • 상태가 없다. (함수 밖에 있는 값을 사용하지 않는다.)

하나 익명 내부 클래스의 변수는 final이라고 가정을 하기 때문에 변경이 불가하다.

 

  • 고차 함수 (Higher-Order Function) 
    • 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다.
  • 불변성

Code Link

https://github.com/mike6321/PURE_JAVA/tree/master/java8to11/src/main

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com