본문 바로가기

자바

함수형 인터페이스

람다식 편을 보고 왔다면 자연스럽게 함수형 인터페이스를 공부하게 된다.

자바에서 결국 람다식은 컴파일러가 익명클래스라고 인식을 하고 람다식을 해석하게 된다.

 

 

결국 익명 클래스 라는 거는 조상클래스의 이름이나 인터페이스의 이름 을 가지고 생성한다.

왜냐? 이름이 없는 익명이기 때문에 

 

 

익명 클래스가 무엇인지 모르겠다면 익명 클래스를 알아보고 오자!!!!

 

 

 결국 람다식도 익명 클래스 안에 있는 메소드이다.  

 

자바가 함수형 프로그래밍(람다식)을 어떻게 지원을 하는가?

 

자바에서는 함수가 메소드 개념인데 결국은 메소드는 클래스안에 종속되어져 있기 때문에

익명 클래스안에서 메소드를 작성하는 방식으로 지원한다.

이 부분을 간단하게 작성하면 람다식이 되는 것 이다!!

 

 

자바에서는 클래스의 메소드를 사용하기 위해서는 해당 클래스의 참조변수에서 메소드를 호출해서 사용한다.

 

다시 본론으로 돌아와서

 

그렇다는 함수형 인터페이스는 무엇인가?

함수형 인터페이스는 단 하나의 추상 메소드를 갖는 인터페이스 이다.

@FunctionalInterface는 함수형 인터페이스라는 어노테이션이다 

이 키워드가 붙는다면 추상 메소드 하나만 구현이 가능하다.

(붙이고 메소드 2개이상 구현하면 문법 오류를 뱉는다)

이걸 가지고 람다식과 어떤 연관이 있는가?

 

일단 익명 클래스로 저 인터페이스를 구현 해보자

 

해당 함수형 인터페이스를 가지고 익명클래스를 생성하였다.

아까 결국 람다식은 익명클래스의 익명 객체인데

그렇다면!!?

 

익명 객체를 람다식으로 표현했을 떄 이런식으로 표현이 된다.

 

결국은 함수형 인터페이스는 람다식을 구현하기 위해 나온 인터페이스라고 생각하면 된다.

람다식을 구현할 때도 함수형 인터페이스의 추상 메서드의 매개변수 타입과 리턴 타입이 맞아야한다!!

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

보통 개발을 하다보면 매개변수로 함수형 인터페이스가 들어가 있는 경우가 있다 .

그럴 때마다 정확히 이해하지 않았다.  

구글링을 통해 사용하기 바빴다.

 

위는 자바 스트림의 최종연산인 forEach이다

여기서 Consumer이라는 함수형 인터페이스로 람다식을 인자로 받고 있다.

Cunsumer은 무엇일까? 

이는 자바에서 지원하는 함수형 인터페이스 모음 패키지인 function패키지를 알아보자!

 

여러가지 함수형 인터페이스가 있지만 Consumer을 보면 accept라는 추상메소드를 가지고 있다.

forEach에 우리가 원하는 람다식을 넘기는데 

 이런식으로 람다식을 넘기면  forEach내부적으로 accept를 실행하면서 람다식을 실행한다.