람다식이란?
람다식은 간단히 말해서 메서드를 하나의 식으로 표현한 것이다.
람다식은 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해준다.
메서드를 람다식으로 표현하면 메서드의 이름을 반환값이 없어지므로, 람다식을 '익명함수' 이라고도 한다.
int arr[] = new int[5];
Arrays.setAll(arr, (i) -> (int)(Math.random() * 5 ) + 1 );
위 코드에서 '(i) -> (int)(Math.random() * 5 ) + 1)' 이 람다식이다. 위의 람다식을 메서드로 표현하면 다음과 같다.
int method() {
return (int) (Math.random() * 5) + 1;
}
위의 메서드보다 람다식이 간결하면서도 이해하기 쉽다. 람다식은 메서드의 매개변수로 전달되어지는 것이 가능하고, 메서드의 결과로 반환될 수도 있다. 람다식으로 인해 메서드를 변수처럼 다루는 것이 가능해진 것이다.
람다식작성하기
int sum(int a, int b) {
return a + b;
}
위 코드를 람다식으로 작성해보자
1. 익명함수이기 때문에 메서드에서 이름과 반환타입을 제거하고 매개변수 선언부와 몸통{} 사이에 '->'를 추가한다.
(int a, int b) -> { return a + b; }
2. 반환값이 있는 메서드의 경우, return문 대신 식으로 대신 할 수 있다. 식의 연산결과가 자동적으로 반환값이 된다.
이때는 문장이 아닌 식이므로 끝에 ';' (세미콜론)을 붙이지 않는다.
(int a, int b) -> a + b
3. 람다식에 선언된 매개변수의 타입은 추론이 가능한 경우에 생략할 수 있는데, 대부분의 경우에 생략가능하다.
람다식에 반환타입이 없는 이유도 항상 추론이 가능하기 때문이다.
(a, b) -> a + b
주의
(int a, b) -> a + b 와 같이 두 매개변수 중 어느 하나의 타입만 생략하는 것은 허용되지 않는다.
아래와 같이 선언된 매개변수가 하나뿐인 경우에는 괄호()를 생략할 수 있다. 단, 매개변수의 타입이 있으면 괄호()를 생략할 수 없다.
(a) -> a + a -> a -> a + a // OK
(int a) -> a + a -> int a -> a + a // ERROR
마찬가지로 괄호{} 안의 문장이 하나일 때는 괄호{}를 생략할 수 있다. 이 때 문장의 끝에 ';'(세미콜론)을 붙이지 않아야 한다는 것에 주의하자.
(String name, int i) ->
System.out.println(name+"="+i) // 끝에 세미콜론을 붙이지 않는다
그러나 괄호{} 안의 문장이 return문일 경우 괄호 {}를 생략할 수 없다.
(int a, int b) -> { return a + b; } // OK
(int a, int b) -> return a + b; // ERROR
References
Java의 정석, 남궁 성 지음
'Java' 카테고리의 다른 글
| Stream (0) | 2023.09.20 |
|---|---|
| 함수형 인터페이스 (0) | 2023.09.13 |
| 날짜와 시간 - parse (0) | 2023.09.11 |
| 날짜와 시간 - DateTimeFormatter (0) | 2023.09.11 |
| 날짜 계산 - TemporalAdjusters (0) | 2023.09.11 |