함수형 인터페이스란, abstract method 가 하나인 인터페이스를 의미한다.
그래서 Single Abstract Method (SAM) 이라고 불리기도 한다.
코드를 통해 함수형 인터페이스의 생김새를 알아보도록 하자
위와 같이 추상메서드가 하나인 인터페이스 형태이다.
(참고 - 인터페이스의 경우 abstract 키워드를 생략해도 된다.)
그렇다면, 다음 인터페이스는 함수형 인터페이스일까?
아니다. 추상메서드가 2개 이상인 인터페이스는 함수형 인터페이스라고 할 수 없다.
그렇다면, 다음 인터페이스는 함수형 인터페이스일까?
맞다. 함수형 인터페이스는 '추상 메서드'가 하나이면 조건을 만족한다. static 메서드나 default 메서드가 추가적으로 있어도 추상 메서드가 하나라면, 함수형 인터페이스라고 할 수 있다.
(참고 - 자바8부터 인터페이스에 static method, default method 를 사용할 수 있다.)
함수형 인터페이스를 사용할 때, 자바8 이전에는 anonymous innerclass (익명 내부클래스)를 활용해 사용하였다. 코드를 통해 살펴보자.
위와 같은 코드 형태로, 함수형 인터페이스를 사용하였는데 이 모습을 통해서 함수형 이고 뭐고 자바는 객체지향적인 언어임을 다시 한 번 느낄 수 있다.
여하튼, 위와 같은 코드를 람다식으로 작성하면 훨씬 짧고 간편하게 작성할 수 있다. 코드를 통해 살펴보자
이처럼 람다식을 사용하면 단 한줄의 코드로 함수형 인터페이스를 사용할 수 있음으로, 코드 수를 줄일 수 있고 따라서 가독성이 높아질 수 있다.
함수형 인터페이스를 사용할 때 java.lang 이 지원하는 @FunctionalInterface 어노테이션을 활용할 수 있다. 래퍼런스를 읽어보면 이 어노테이션을 활용하면 함수형 인터페이스 가 아닌 경우, 컴파일 에러를 발생 시켜준다고 되어있는데 이를 통해, 조금 더 안전한 코딩을 할 수 있다.
함수형 인터페이스를 사용한다고 함수형 프로그래밍을 하는 것은 아니다.
함수형 프로그래밍의 핵심은 Pure function(순수함수) 이어야 한다는 것이다. 순수함수라 함은, 동일한 입력을 받았을 때 항상 동일한 출력을 해야하고 side-effect 를 발생시키지 않아야한다.
참고 : 더 자바, Java8 강의