Functional Interfaces
- 람다식을 이해하기 전 우리는 functional interface를 알아야합니다. 람다식은 functional interface를 빠르게 구현하기 위한 하나의 방법 중 하나입니다.
- functional interface는 새로운 개념이 아니라 하나의 abstract method만을 가지고 있는 interface를 칭하는 말입니다.
- 이렇게 칭하는 이유는 본래 interface의 목적처럼 구현하기 위한 Class의 뼈대나 구성요소를 담아두는 것이 아니라 단지 method를 구현하여 function의 역할만 하기 위해 만들어졌기 때문입니다.
Example
interface Comparator<T>
{
int compare(T o1, To2);
}
class LengthComparator implements Comparator<String>
{
public int comapre(String first, String second)
{
return first.length() - second.length();
}
}
...
String[] list = new String[5];
...
Arrays.sort(list, new LengthComparator());
- 해석
- Comparator 인터페이스는 원래 정의되어 있는 인터페이스 라이브러리 중 하나입니다. 주로 비교할 때 사용합니다.
- LengthComparator 클래스는 함수적인 역할만을 위해 정의해 놓은 클래스입니다. 두 개의 문자열을 받아서 서로 비교하고, 그 결과를 int형으로 반환해줍니다.
- 정의한 클래스는 Arrays.sort()에서 비교할 때 사용하기 위해 하나의 파라미터로 객체를 전달 받습니다.
- 결론적으로 위 코드에서는 list에 있는 문자열을 문자열의 길이로 정렬하는 기능을 수행합니다.
Function Interface을 이렇게 구현하는 이유
- 이 예시에서 볼 수 있듯이 LengthComparator클래스는 단지 함수적인 기능을 위해 작성되었음을 알 수 있습니다.
- 자바에서 이렇게 구현하는 이유는 자바가 함수형 프로그래밍 언어가 아니라 객체지향 프로그래밍 언어이기 때문입니다.
- 객체지향 언어이기 때문에 파라미터로 단순한 코드 블럭을 넘길 수 없고, 객체의 형태로 전달해야했고, 자바8까지는 이러한 방법으로만 functional interface를 구현해야했다고 합니다.
Lambda Expressions
- 일반적으로
- 파라미터와 함께 있는 코드블럭, 즉 이름이 없는 함수입니다.
- 이 함수는 변수로 저장되거나, 어떤 함수에 파라미터로 전달되거나 실행되기도 합니다.
- 이러한 역할을 하는 객체를 first-class objects라고 합니다.
- 자바에서는
- functional interface의 intance로 됩니다.
- functional interface를 구현하는 simple한 방법이다.
- functional interface 객체가 있어야할 곳에는 lambda expression이 사용될 수 있다.
Example
Arrays.sort(words, (first, second) -> first.length() - second.length());
(String first, String second) ->
{
if(first.length() < second.length()) return -1;
else if(first.length() > second.length()) return 1;
else return 0;
}
() -> Toolkit.getDefaultTookit().beep();
Comparator<String> comp = (first, second) -> first.legth() - second.length();
ActionListener listener = event -> Toolkit.getDefaultToolkit().beep();
Lambda Expressions 실행과정
Arrays.sort(words, (first, second) -> first.length() - second.length());
- 컴파일러는 sort() 메소드에 타입을 추론하면서 매치시킵니다.
sort(String[] a, Comparator<string> c)
- 프로그램을 실행시키게 되면 람다식은 sort()의 Parameter c에 전달됩니다.
- Sort()는 String Array인 words의 두 요소를 비교하기 위해 람다식을 실행시킵니다.
c.compile(a[i], a[j])