[Java8] 함수형 인터페이스, 람다식 변경 방법

 

 

[Java8] 함수형 인터페이스, 람다식 변경 방법

 

 

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

하나의 추상 메서드만을 가지는 인터페이스를 말합니다. SAM (Single Abstract Method) 인터페이스 입니다.

이 추상 메서드는 인터페이스가 어떤 동작을 수행할지 정의하며, 함수형 프로그래밍 스타일을 지원하기 위해 사용됩니다.

 

 


 

함수형 인터페이스 예시

 

 

함수형 인터페이스 예시

 

return 없을 때

@FunctionalInterface
public interface RunSomething {
    //추상 메소드
    void doIt();

    //static 메서드
    static void printName(){
        System.out.println("RunSomething interface");
    }

    //default 메서드
    default void printAge() {
        System.out.println("100");
    }
}

함수형 인터페이스에는 @FunctionalInterface 어노테이션을 달아서 사용합니다.

추상메소드는 1개의 추상메소드만 선언어하여 사용할 수 있습니다.

void doIt(); 앞에는  abstract가 생략된 형태입니다.

static void printName() 앞에는 public이 생략된 형태입니다.

 

return 있을 때

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

return이 존재하는 형태는 위와 같이 쓸 수 있습니다.

 

 


 

 

함수형 인터페이스 사용 방법

 

함수형 인터페이스 사용 방법

 

return 없을 때

RunSomething runSomething = new RunSomething() {
    @Override
    public void doIt() {
        System.out.println("Hello");
    }
};

과거 사용 방법은 위와 같이 사용하였습니다.

RunSomething runSomething = () -> System.out.println("Hello");
runSomething.doIt();

Java8 부터는 람다식으로 변경하여 사용 가능합니다.

 

 

return 있을 때

RunSomething2 runSomething2 = new RunSomething2() {
    @Override
    public int doIt(int number) {
        return number + 10;
    }
};

return값이 있을 때는 위와 같이 사용할 수 있습니다.

RunSomething2 runSomething2 = number -> number + 10;

//1을 넣으면 계속 11이 나와야함
System.out.println(runSomething2.doIt(1));
System.out.println(runSomething2.doIt(1));
System.out.println(runSomething2.doIt(1));
//2를 넣으면 계속 12가 나와야 함
System.out.println(runSomething2.doIt(2));
System.out.println(runSomething2.doIt(2));
System.out.println(runSomething2.doIt(2));

함수형 인터페이스는 동일한 출력값이 출력되어야 순수한 함수형 인터페이스라고 할 수 있습니다.

 

 


 

 

동일한 결과 값이 보장 안되는 경우

 

 

 

동일한 결과값이 보장 안되는 경우

동일한 결과값을 보장할 수 없다면 함수형 인터페이스 프로그래밍이라 볼 수 없습니다.

 

 

함수 밖의 변수를 참조할 경우

int baseNumber = 10;
baseNumber++;

RunSomething2 runSomething2 = new RunSomething2() {
    @Override
    public int doIt(int number) {
        return number + baseNumber;
    }
};

baseNumber 값을 RunSomething2 밖에 선언 한 경우 basenumber를 final 변수로 가정합니다.

 

doIt 외부에서 baseNumber 값을 변경은 가능하지만 baseNumber 변경하여 내부에서 사용하는 것이 불가능 합니다.( 문법오류 )
doIt 내부에서 baseNumber 값을 변경하는 것은 불가능합니다.( 문법오류 )

 

 

함수 안의 변수를 참조할 경우

RunSomething2 runSomething2 = new RunSomething2() {
    int baseNumber = 10;
    @Override
    public int doIt(int number) {
    	baseNumber++;
        return number + baseNumber;
    }
};

doIt  내부에서 baseNumber 값을 변경하는 것은 가능하지만 동일한 결과 값을 보장하지 못합니다. ( 문법가능 )

doIt 외부에서 baseNumber 값을 변경하는 것은 불가능 합니다. ( 문법 오류 )

 

위의 경우들 처럼 baseNumber를 선언하여 사용할 경우 baseNumber 라는 상태 값을 가지게 되고 상태값에 의존하게 됩니다.

위와 같은 경우는 결과적으로는 동일한 결과 값의 출력을 기대할 수 없습니다.