Post

람다 표현식의 중괄호 생략

서론

  • 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.