개발/Java
Java 기초부터 다시 - @FunctionalInterface
삽쟁이
2024. 1. 29. 14:49
반응형
FunctionalInterface란?
함수형인터페이스(Functional Interface)는 단 하나의 추상 메소드만 가지는 인터페이스를 말한다. 다른 말로 SAM 인터페이스(Single Abstract Method Interface)라고도 한다.
예시
@FunctionalInterface
public interface RunSomething {
void doIt();
//이렇게 추상 메소드가 2개 있으면 안됨. 오류 발생
//void doItAgain();
}
그래서... 이게 다인가? 왜쓰는거임?
여러 가지 이유가 있겠지만... 이유는 단하나 Lamda(함수형 프로그래밍)을 위해서 라고 생각한다.
예제를 보며 한번 확인해보자.
//기존에 쓰던 방식
RunSomething runSomething = new RunSomething() {
@Override
public void doIt() {
System.out.println("ki hy");
}
};
// 람다 방식1 한줄일 경우 이렇게 쓸수 있음.
RunSomething runSomething2 = () -> System.out.println("ki hy");
// 람다 방식2 한줄 넘을 경우 저렇게 중괄호로 묶어 줌.
RunSomething runSomething3 = () -> {
System.out.println("ki hy");
System.out.println("ki hy2");
};
runSomething.doIt();
runSomething2.doIt();
runSomething3.doIt();
위 코드 처럼 정의된 함수형 인터페이스는 이렇게 람다식으로 표현이 가능 하다.
만약 인자(Arguments)가 있는 경우라면?
@FunctionalInterface
public interface RunSomeThingArguments<T,R> {
R doSomething(T a, T b);
}
RunSomeThingArguments<Integer,String> runSomeThingArguments = new RunSomeThingArguments<Integer, String>() {
@Override
public String doSomething(Integer a, Integer b) {
return Integer.toString(a+b);
}
} ;
RunSomeThingArguments<Integer,String> runSomeThingArguments2 = (a, b) -> Integer.toString(a+b);
RunSomeThingArguments<Integer,String> runSomeThingArguments3 = (a, b) -> {
//각 인자에 2배를 곱해서 더하는 경우.
a = a * 2;
b = b * 2;
return Integer.toString(a + b);
};
runSomeThingArguments.doSomething(1,3); // result : String type "4"
runSomeThingArguments2.doSomething(1,3); // result : String type "4"
runSomeThingArguments3.doSomething(1,3); // result : String type "12"
이런식으로 사용할 수 있겠다.
사실 개념 자체는 간단하지만... 글쓴이도 처음 배웠을때 왜 쓰는지 언제 써야할지에 대해서 감이 안잡혔다.
결국 이러한 개념은 Java8 이후 도입된 기본 함수형 인터페이스를 사용하기 위함이라는 것을 깨달았다.
기본 함수형 인터페이스
public interface Function<T, R>
public interface Consumer<T>
public interface Supplier<T>
public interface Predicate<T>
해당 기본 함수형 인터페이스에 대해서 하나씩 알아보자.
반응형