1996년 자바는 Generics 등장 직후 Lambda Expression을 보여주었다. 람다 표현식(람다식)으로 자바는 함수형 언어의 특징을 갖추게 되었다.
람다식은 1930년대 알론조 처치의 람다 대수식으로부터 그 뿌리를 두고 있다. 람다식을 사용하면 코드가 간결해지고 지연 연산 등을 통해 성능을 향상시킬 수 있다. 하지만 모든 엘리먼트를 순회하는 경우 성능이 떨어지고 코드 분석이 어려워지는 단점이 있다.
자바는 객체지향언어이기 때문에 아래 함수를 사용하기 위해서는 클래스를 만들고 그 안에 메서드를 작성한 뒤 객체를 생성해야 한다. static으로 객체를 생성하지 않고도 실행할 수 있으나 보질적으로 클래스를 정의해야만 한다.
public int sum(int a, int b) {
return a + b;
}
위 함수를 람다식으로 표현하면
(a, b) -> a + b;
매우 깔끔 하고 알아보기 쉽다. 또한 클래스를 정의하지 않아도 되고, 리턴타입과 메소드의 이름이 필요가 없다.
람다식은 익명함수라고 부를 수 있다.
사실 자바에서 람다는 익명 클래스와 동일하다. 컴파일러는 람다식을 익명 클래스와 같이 해석한다. 람다식은 곧 익명 클래스 객체이기 때문에 다른 메소드의 인자로 객체를 넘기듯 람다를 넘긴다.
new Object(){
int sum(int a, int b) {
return a + b;
}
}
람다식 문법은 다음과 같다.
(파라미터 ,,,) -> { 람다식 바디 }
a -> a * a
(a, b) -> { return a > b ? a : b }
람다식은 파라미터 타입이 추론할 수 있는 경우 생력할 수 있다.
람다식의 파라미터가 하나인 경우 괄호를 생략할 수 있다.
람다식 바디가 하나의 표현식인 경우 중괄호를 생략할 수 있다. 이 때, 세미콜론을 붙이지 않는다.
람다식 바디에 return 문이 있는 경우 중괄호를 생략할 수 없다.
람다식 예1 : 쓰레드 프로그래밍에서 Runnable 인터페이스를 익명객체로 구현하던 것을 람다식으로 바꿀 수 있다.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Start Thread");
Thread.sleep(1000);
System.out.println("End Thread");
}
});
// 이 코드를 람다를 사용해서 구현하면 다음과 같다.
Thread thread = new Thread(() -> {
System.out.println("Start Thread");
Thread.sleep(1000);
System.out.println("End Thread");
});
람다식 예2 : 람다는 많은 경우 컬렉션과 함께 사용된다.
List<>인터페이스의 forEach() 메소드를 이용해 리스트 컬렉션의 각 요소들을 순회하여 출력할 수 있다.
List<String> list = new ArrayList<>;
list.add("ele1");
list.add("ele2");
list.add("ele3");
list.forEach(x -> System.out.println(x));
[Java] 자바8의 람다식(lambda expression)
1996년 처음 공개된 이후 자바에는 괄목할 만한 두 번의 변화가 있었다. 그 첫 번째가 '지네릭스(Generics)'의 등장이었고, 두 번째가 바로 '람다식(Lambda Expression)'의 등장이다. 특히 람다 표현식의 지
soft.plusblog.co.kr
Java 8 함수형 인터페이스 (Functional Interface)
Overview 함수형 인터페이스란 1 개의 추상 메소드를 갖는 인터페이스를 말합니다. Java8 부터 인터페이스는 기본 구현체를 포함한 디폴트 메서드 (default method) 를 포함할 수 있습니다. 여러 개의 디
bcp0109.tistory.com
'프로그래밍언어 > Java' 카테고리의 다른 글
자바 쓰레드 (0) | 2023.07.26 |
---|---|
[Java Collection Framework] HashMap, HashTable, Map (0) | 2023.07.26 |
Java Collection Framework (JCF) (0) | 2023.06.21 |
람다식 (0) | 2023.05.24 |
가변객체와 불변객체 (0) | 2023.05.23 |