람다 표현식의 중괄호 생략
서론
- JPA를 사용한다면 반드시 알아야 하는
Optional
에 대해 공부하면서 표현식과 문장의 차이가 뭔지 잘 안와닿아서 그냥 넘어갔었다. - DB로부터 조회된 값이 있을 경우 에러를 발생시키기 위해 평소 자주 쓰던
orElseThrow()
를 쓰듯이ifPresent()
를 쓰고자 했는데, 여기서 의문이 생겼다. - 람다식에서 오류 발생시키는 구문에 중괄호를 빼면 안된다는 것이었다.
1
2
3
4
5
6
7
8
9
10
11
// 평소 사용하던 orElseThrow()
// 깔끔해보인다.
user.orElseThrow(() -> new RuntimeException("user 없음"));
// 잘못된 문법
// 깔끔해보인다.
user.ifPresent(() -> throw new RuntimeException("오류"));
// 올바른 문법
// 지저분해보인다..
user.ifPresent(() -> {throw new RuntimeException("오류");});
- 깔끔한 코드를 지향하는 나로써는 겨우 한 줄의 코드인데도 중괄호를 써야하는 것이 너무 지저분해 보였다.
- 이 글은 그 이유를 찾고자 작성하는 글이다.
함수형 프로그래밍
- 람다는 함수형 프로그래밍의 개념을 바탕으로 만들어졌으며, 함수형 프로그래밍의 구성 요소 중 하나이다.
- 함수형 프로그래밍의 핵심은 자료 처리를 수학적 함수의 계산으로 취급하고, 상태와 가변 데이터를 멀리함으로써 최대한 간결하게 프로그램을 작성하는 것이다.
- 이런 간결함을 선호하는 스타일에 따라, 람다 표현식을 사용하는 대부분의 언어에서 중괄호
{}
도 생략시키는 스타일을 사용한다.
람다 표현식의 기본 구조
- 파라미터는 0개 이상,
- 람다 본문은 단일 표현식(Expression) 또는 문장(Statement)이어야 한다.
- 서로 배타적인 관계는 아니다.
- E는 S에 포함되지만, S는 E에 포함되지 않는다.
E : Expression, S : Statement
- 표현식이 아니라면, 모두 문장이다.
1
2
3
(parameters) -> expression
(parameters) -> { statements; }
단일 표현식의 중괄호 생략
- 단일 표현식은 항상 단일 값을 반환하므로, 중괄호를 생략하더라도 문제가 없다.
1
2
3
4
5
6
7
8
9
() -> (5 + 3) * 2; // 16이라는 단일값을 반환
(data) -> (data * 3) / 2; // data의 값에 따라 항상 단일값을 반환
() -> new CustomObject(); // 객체 하나를 반환
(data) -> data == null ? "null" : "not null"; // 인자에 따라 삼항 연산자는 단일값을 반환
() -> System.out.println("hello"); // 반환 타입이 void인 단일 문장
중괄호 생략이 불가능한 문장
- 프로그램의 실행 흐름을 변경하거나 종료시키는 제어 흐름 문장은 단일 문장이더라도 단일 표현식처럼 중괄호 생략이 불가능하다.
1
2
3
4
5
6
7
// 람다 내부 값 반환 - 단일 표현식에서는 return은 사용되지 않는다.
() -> {
int a = 1;
return a;
};
() -> {throw new RuntimeException("오류");}; // 값을 반환시키는 것이 아닌 예외를 던진다.
- throw는 제어 흐름 문장이기 때문에
ifPresent()
에서는 지저분해 보이더라도, 중괄호를 생략할 수 없다.
This post is licensed under CC BY 4.0 by the author.