티스토리 뷰
람다식 Lambda Expression
자바 8에 추가된 가장 큰 특징으로 "함수형" 프로그래밍 형태를 받아들인 결과
추상메서드가 한 개뿐인 인터페이스를 생성할 때 간편하게 쓰는 문법
함수형 프로그래밍? (함수형 vs 객체지향)
함수형 프로그래밍 | 객체지향 프로그래밍 |
기능 위주의 프로그래밍 기법 기능 즉, 함수가 따로 존재 원시함수로 작성하는 기법 |
클래스에 속성과 기능을 정의 |
1950년대 | 1990년대 |
< 기본 문법 >
(데이터타입 매개변수, ...) -> { 실행문, 실행문, ...}
1. 기본형
(int x) -> { System.out.println(x); }
2. 매개변수의 타입을 추론할 수 있는 경우에는 타입 생략 가능
(x) -> { System.out.println(x); }
3. 매개변수나 실행문이 하나라면 소괄호( )와 중괄호{ }를 생략할 수 있다(이때, 세미콜론 생략!)
x -> System.out.println(x)
4. 매개변수가 없을 경우에는 소괄호()를 사용한다. (생략 불가)
() -> System.out.println(x)
5. 리턴이 필요한 경우 return 키워드를 사용
(x, y) -> { return x + y; }
6. 실행문이 단순히 return 문 하나로 표현되는 경우 표현식만 사용할 수 있으며, 리턴 값은 표현식의 결과값이 된다.
(이때, 세미콜론은 붙이지 않는다!)
(x, y) -> x + y
String[] str = {"this", "is", "java", "world"};
System.out.println(Arrays.toString(str));
Arrays.sort(str);
// 오름 차순으로 정렬 후: [is, java, this, world]
System.out.println(Arrays.toString(str));
새로운 정렬 기능을 만들려면?
- 내부적으로 Comparator의 compare 메서드를 사용하기 때문에 새로운 기능을 만들고 Array.sort()에 전달하면 됨!
- 자바에서는 함수만 전달할 방법이 없기 때문에 해당 기능을 가지는 객체를 전달해야한다!
=> 일회용으로 정렬 기능을 작성하려면? 익명의 내부 클래스!
익명의 내부 클래스
Anonymous로 적혀있던 클래스가 이거다! 익명의 성질을 가진 클래스라는 뜻
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2) * -1;
}
});
람다식으로 변형!
// Arrays.sort(str, (String o1, String o2) -> { return o1.compareTo(o2) * -1; });
// Arrays.sort(str, (o1, o2) -> { return o1.compareTo(o2) * -1; });
Arrays.sort(str, (o1, o2) -> o1.compareTo(o2) * -1);
// 내림차순 정렬 후: [world, this, java, is]
System.out.println(Arrays.toString(str));
결국 정렬을 위해 필요했던 '기능'은 Comparator가 아니라 사실 compare() 라는 점이다!
- compare()만 있으면 되지만, 자바 특성상 익명의 내부클래스를 만들고 객체화(new)해서 전달하고 있다!
=> 이러한 번거로움을 없애기 위해 람다식이 등장!
함수형 인터페이스(functional interface) 또는 타겟타입(target type)
- 람다식은 결과적으로 "인터페이스 타입의 클래스를 손쉽게 구현하는 방법"
- 반드시 하나의 abstract 메서드만 존재
- 만약 abstract 메서드가 없거나 두 개 이상 존재한다면 람다식으로 대체할 수 없다!
- 함수형 인터페이스 @FunctionalInterface 어노테이션 선언