본문 바로가기
DEV/Java

[자바] 람다식(Lambda expression)

by 어쩌다개발 2023. 2. 22.
반응형

JDK1.8 부터 추가된 람다식은 자바가 등장한 이후 가장 큰 변화였다.

람다식의 도입으로 인해, 자바는 객체지향언어인 동시에 함수형 언어가 되었다.

1. 람다식이란?

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

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

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

int[] arr = new int[3];
Arrays.setAll(arr, (i) -> (int)(Math.random() * 5) + 1);

위의 식에서 '(i) -> (int)(Math.random() * 5) + 1' 부분은 람다가 적용된방식이다. 람다가 적용되지 않는다면 아래와 같이 표현할 수 있다.

int method() {
	return (int)(Math.random() * 5) + 1;
}

!메서드와 함수의 차이

객체지향개념에서는 함수 대신 객체의 행위나 동작을 의미하는 메서드(method)라는 용어를 사용한다. 메서드는 함수와 같은 의미이지만. 특정 클래스에 반드시 속해야 한다는 제약이 있기 때문에 기존의 함수와 같은 의미의 다른 용어를 선택해서 사용했다. 그러나 람다식을 통해 메서드가 하나의 독립적인 기능을 하기 때문에 함수라는 용어를 사용하게 됐다.

2. 람다식 작성

람다식은 이름과 반환타입을 제거하고 매개변수 선언부와 몸통 {} 아시에 -> 를 추가한다.

반환타입 메서드 이름(매개변수 선언) {
          문장들
}
반환타입 메서드 이름(매개변수 선언) -> {
}
int max(int a, int b) {
	return a > b ? a : b;
}
(int a, int b) -> {
	reeturn a > b ? a : b;
}

반환값이 있는 메서드의 경우, return 대신 '식(expression)'으로 대신 할 수 있다. 이 때는 '문장(statement)'이 아닌 식으로 끝나므로 끝에 '세미콜론(;)'을 붙이지 않는다.

(int a, int b) -> {return a > b ? a : b; }
(int a, int b) -> a > b ? a : b

그리고, 람다식에 선언된 매개변수의 타입은 추론이 가능한 경우 생략이 가능하다. 

(a, b) -> a > b ? a : b

아래와 같이 매개변수가 하나인 경우 괄호()도 생략가능하다. 단, 매개변수의 타입이 있는 경우는 괄호를 생략할 수 없다.

a -> a * a
(int a) -> a * a

중괄호{} 안의 문장이 하나인 경우는 중괄호{}를 생략할 수 있는데, 이 땐 문장의 끝에 ; 을 붙이지 않아야 한다.

(String name, int i) -> {
    System.out.println(name + "=" + i);
}
(String name, int i) -> System.out.println(name + "=" + i)

만약 return 을 작성한 경우라면 {}를 생략할 수 없다.

(int a, int b) -> {return a > b ? a : b;} //OK
(int a, int b) -> return a > b ? a : b; //error
(a, b) -> a > b ? a : b //OK

 

참고: 자바의정석

반응형

'DEV > Java' 카테고리의 다른 글

[자바] 메소드 참조  (2) 2023.02.23
[자바] 함수형 인터페이스(Functional Interface)  (5) 2023.02.22
[자바] 제네릭 와일드 카드  (9) 2023.02.16
[자바] Properties  (8) 2023.02.16
[자바] HashMap  (3) 2023.02.15

댓글