개발/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>

해당 기본 함수형 인터페이스에 대해서 하나씩 알아보자.

반응형