Java

람다식

hwanguu 2023. 9. 12. 18:28

람다식이란?

람다식은 간단히 말해서 메서드를 하나의 식으로 표현한 것이다.

람다식은 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해준다.

메서드를 람다식으로 표현하면 메서드의 이름을 반환값이 없어지므로, 람다식을 '익명함수' 이라고도 한다.

 

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