Optional 클래스

람다, 메서드 참조, Optional 클래스


소스분석을 하다가

Optional <CustDTO> ...

CustDTO custDto = custEntity.map(custMapper::toCustDTO).orElse(null);

라는 소스를 봤는데 Optional, 세미콜론 두개와 map이라는 메소드.. 모르는것 투성이... 하나씩 검색을 해봤다.

Optional 클래스


자바 NPE(NullPointException) 예방

반환 값으로 null을 사용하는 것이 위험하기 때문에 등장한 것이 Optional

Optional는 null이 될 수도 있는 객체을 감싸고 있는 일종의 래퍼 클래스



Optional을 제대로 사용하기 위해서는 Stream처럼 사용해야 한다.
 
Stream : 람다를 활용할 수 있는 기술 중 하나

Optional 클래스와 Stream 클래스 간에 직접적인 구현이나 상속관계는 없지만 사용 방법이나 기본 사상이 매우 유사

람다


메서드에 전달할 수 있는 동작

메서드와 비슷하지만 특정 클래스에 종속되지 않으며 이름을 갖지 않음.

1. 기존 메서드
int min(int x, int y) { return x < y ? x : y; }

2. 메서드명과 반환 타입 생략
(int x, int y) -> { return x < y ? x : y; }

3. return문 대신 표현식 사용 그리고 중괄호의 생략, 이때는 문장이 아니므로 끝에 세미콜론은 생략
(int x, int y) -> x < y ? x : y

4. 매개변수의 타입이 추론이 가능한 경우 생략
(x, y) -> x < y ? x : y

세미콜론 두개란? (::)


람다 표현식이 단 하나의 메소드만을 호출하는 경우에 해당 람다 표현식에서 불필요한 매개변수를 제거하고 사용할 수 있도록 해줌(메서드 참조)


// 변수 i가 Math 클래스의 random 이라는 함수를 바라보도록(참조하도록) 함.
MathInterface i = Math::random;

메서드 참조 문법


클래스이름::메소드이름

참조변수이름::메소드이름

map()


map 메서드는 매퍼 함수의 반환값을 Optional.ofNullable에 인자로 전달하여 Optional 객체로 만든다.

orElse()


orElse() 메소드를 호출하여 이 전 과정을 통해 얻은 Optional이 비어있을 경우, 디폴트로 사용할 값 세팅.