반응형

함수형 인터페이스

  • 함수형 인터페이스 - 단 하나의 추상 메서드만 선언된 인터페이스

함수형 인터페이스는 단 하나의 추상 메서드만 선언된 인터페이스를 말한다.

예를 들어 이러한 인터페이스를 함수형 인터페이스라고 한다.

함수형 인터페이스에는 "@FunctionalInterface" 애노테이션을 작성해준다.
해당 애토테이션을 작성하지 않아도 에러가 나진 않지만, 해당 애노테이션을 작성해주면, 이 함수형 인터페이스를 올바르게 작성했는지 컴파일러가 체크해준다. 그래서 붙여주는 것이 좋다.

MyFunction이라는 함수형 인터페이스는 max()라는 메서드를 하나 가지고 있고,
이것을 구현하면, 이렇게 된다.
익명 클래스의 선언, 객체 생성을 동시에 한 것이다. new 조상이름(이때 조상이름은 클래스 or 인터페이스) 그리고 {}에 멤버를 넣으면 된다.

이전시간에는 new Object() {} 이렇게 했었는데, 이제는 함수형 인터페이스를 만들어서 Object대신에 이것을 사용하는 것이다.

이전시간처럼 Object일 때는, obj.max(3, 5)를 호출하는 것은 에러였다. 왜냐하면 Object타입의 참조변수에는 max라는 메서드가 없기 때문이다.
그런데, 함수형 인터페이스 f에는 max가 있다. 그래서 f.max(3,5)가 OK이다.

 

  • 함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있음.
    (단, 함수형 인터페이스의 메서드와 람다식의 매개변수 개수와 반환타입이 일치해야 한다.)

위에서 본 것(좌측)은 익명클래스로 작성한 것이고, 우측은 람다식으로 작성한 것이다. 둘이 비교해보면 된다.

람다식을 다룰 때는,  함수형 인터페이스를 선언하고, 이 함수형 인터페이스 타입의 참조변수를 가지고 람다식을 다루면 된다.

즉, 함수형 인터페이스는 람다식을 다루기 위해서 사용한다.

[Ex14_0]

 

 


 

함수형 인터페이스 - example

  • 익명 객체를 람다식으로 대체

예전에는 Arrays를 정렬할 때, new Comparator를 넣어줘야 했다.
문자열 비교를하도록 작성했는데, 너무길다.

Comparator는 compare라는 추상메서드 하나만 가지고 있는데, 
이 Comparator인터페이스에도 @FunctionalInterface 애너테이션이 붙었다.
그리고, 위의 코드를 아래코드처럼 람다식을 사용할 수 있게 되었다.

반환타입과 메서드 이름을 지우고, 매개변수 타입을 지우고, 그러면 (s1, s2)만 남고,  -> 넣고  s2.compareTo(s1)
이렇게 쓸 수 있게 되었다.

예전에 비해 훨씬 간단해졌다.
sort는 list와 new Comparator()을 매개변수로 받는데, 여기에  람다식을 넣게 된 것이다.

Comparator c = (s1, s2) -> s2.compareTo(s1);
이때, Comparator는 함수형 인터페이스다.
이렇게 간단히 사용할 수 있게 되었다.

 


 

함수형 인터페이스 타입의 매개변수, 반환타입

  • 함수형 인터페이스 타입의 매개변수

메서드의 매개변수로 함수형인터페이스를 받을 수 있는데 이것이 무슨 의미냐면,
메서드의 매개변수로 람다식을 받겠다는 뜻이다.

myMethod가 선언되있는 MyFunction이라는 함수형 인터페이스가 선언되어 있을 때,
매개변수로 MyFunction을 받으면, f.Method()를 호출할 수 있을 것이다.

즉, 람다식에 myMethod()라고 이름을 붙여주고, 그것을 호출한 것이다.

즉 aMethod라는 메서드를 호출하는 코드는 다음과 같다.

람다식 "myMethod()" 라는 글자를 출력해주는 람다식을 f에 저장하고 aMethod에 넣어주는 것이다.
그러면aMethod(f); 안에서 람다식을 호출하는 것이다.

아니면 이 두문장을 한줄로 합치면 아래와 같다.

람다식을 직접 집어넣을 수 있는데, 람다식을 참조변수에 담고, 이 참조변수를 aMethod에 넣어줬는데,
여기서는 f에 람다식을 담는대신에 람다식을 aMethod에 직접 집어넣는 것이다.

 

  • 함수형 인터페이스 타입의 반환타입

그리고 반환타입으로도 함수형 인터페이스를 사용할 수 있다.
이것이 무슨 의미냐면, 해당 메서드는 람다식을 반환한다는 의미이다.

이것도 줄여서 두줄을 한줄로 사용할 수 있다.

이처럼 함수형 인터페이스를 이용해서 메서드의 매개변수로 람다식을 받을 수 있고,
메서드 반환타입으로 함수형 인터페이스를 적어줘서 람다식을 반환할 수도 있다.

[Ex14_1]

 

반응형

'JAVA' 카테고리의 다른 글

Predicate의 결합, 컬렉션 프레임웍과 함수형 인터페이스  (0) 2022.08.04
java.util.function 패키지  (0) 2022.08.01
람다식, 람다식 작성하기  (0) 2022.07.28
wait()과 notify()  (0) 2022.07.27
쓰레드의 동기화  (0) 2022.07.09