[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 라는 상태 값을 가지게 되고 상태값에 의존하게 됩니다.
위와 같은 경우는 결과적으로는 동일한 결과 값의 출력을 기대할 수 없습니다.
'JAVA > JAVA8' 카테고리의 다른 글
[Java8] 인터페이스 default 메소드 / static 메소드 (0) | 2024.09.02 |
---|---|
[Java8] 메소드 레퍼런스 (0) | 2024.08.30 |
[Java8] 람다 표현식 : 스코프(Scope), 쉐도잉(Shadowing) (0) | 2024.08.29 |
[Java8] JAVA가 제공하는 기본 함수형 인터페이스 정리 (0) | 2024.08.25 |