mjeongriver
Published 2023. 6. 22. 20:39
Optional 과 null TIL/Java

 

런타임에서 발생하는 NullPointException 방어를 위해 만들어둔 로직체크는 코드의 가독성과 유지 보수성이 떨어진다. 어떻게 null 을 다루면 좋을 지에 대한 해결책을 함수형 언어에서 찾았다. 함수형 언어는 존재하지 않을 수도 있는 값에 대한 별도의 타입을 가지고 있다. 개발자들은 여러가지 API 를 통해 간접적으로 값에 접근할 수 있다. 자바는 함수형 언어로부터 영감을 받아 자바 8에 처음 Optional 이 도입 되었다.

 

java.util의 Optional<T>는 java 8부터 지원하는 객체를 감싸는 래퍼 클래스(Wrapper class)이다. 객체를 Optional 안에 넣어서 한 번 감싸는데 이 때 객체는 null일 수도 있고 null이 아닐 수도 있다. Optional을 사용함으로써 Optional에 감싸진 객체가 null일 수 있다는 것을 명시해주는 것과 동시에 null 처리를 조건문 코드를 통해 처리하지 않고 Optional을 통해 처리할 수 있다.

 

Optional?

값이 존재할 수도, 존재하지 않을 수도 있는 값을 포장한 객체

Null 이 될 가능성을 가진 값을 객체로 감싸는 래퍼 클래스다. 즉, Optional 에 포장된 객체는 하나의 원소 혹은 Null 원소가 되는 것을 뜻한다. Null 을 직접 다루면 위험한 상황이 발생하거나 굉장히 까다롭다. 이를 Optional 객체에 포장함으로써 유연한 처리가 가능해 진다. Null 을 Optional 에 포장하게 되면 Null 을 값으로 보고 로직을 구현할 수 있다.

 

Optional 사용하기

1. Optional.empty( ) : 비어있는(null) Optional 객체를 가져온다.

Optional<Station> optStation = Optional.empty();

 

2. Optional.of(T value) : 객체를 담은 Optional 객체를 생성한다. 이 경우 null 이 들어오면 NPE 가 발생한다.

Optional<Line> optLine = Optional.of(new Line("1호선"));

 

3. Optional.ofNullable(T value) : 비어있거나 값이 있을 수 있는 객체를 생성한다. (null 여부를 확신할 수 없을 때)

Optional<Section> optNullSection = Optional.ofNullable(null);
Optional<Section> optSection = Optional.ofNullable(new Section("잠실역", "몽촌토성역", "850m"));

 

Optional 값에 접근하기

1. get( )

// 값을 가져오고, 비어있는 Optional 객체에 대해서는 NoSuchElementException 예외를 던진다.
Optional<Station> optStation = Optional.of(new Station("잠실역"));
Station station = optStation.get();

 

2. orElse(T other)

// 비어있는 Optional 객체에 대해서 orElse 로부터 넘어온 인자를 반환한다.
Optional<Station> optStation = Optional.of(null);
Station station = optStation.orElse(new Station("잠실역"));

 

3. orElseGet(Supplier<? Extends T> other)

// 비어있는 Otional 객체에 대해서 orElseGet 으로부터 넘어온 함수형 인자를 통해 생성된 객체를 전달한다.
Optional<Station> optStation = Optional.of(null);
Station station = optStation.orElseGet(() -> new Station("임시역"));

 

4. orElseThrow(Supplier<? Extends X> exceptionSupplier)

// 비어있는 Optional 객체에 대해서 orElseThrow 로부터 넘어온 함수형 인자를 통해 예외를 던진다.
Optional<Station> optStation = Optional.empty();
Station station = optStation.orElseThrow(UnsupportedOperationException::new);

 

Optional의 장점

  • 명시적으로 변수에 대한 null 가능성을 표현할 수 있다.
  • null 체크를 직접하지 않아도 된다.
  • Null Point Exception 이 발생할 가능성이 있는 값을 직접 다룰 필요가 없다.

 

Optional의 단점

  • Wrapper 클래스이기 때문에 두 개의 참조를 가지므로 생성 비용이 비싸다.
  • 직렬화 불가능하기 때문에 클래스의 인스턴스 필드로 사용하면 안된다.
  • 필드로 사용하기 위해 고안된 것이 아니기 때문에 값을 반환하는 용도로 사용해야 한다.

 

참조

https://tecoble.techcourse.co.kr/post/2021-06-20-optional-vs-null/

 

Optional 과 null 에 대해 ⌥␀

런타임에서 발생하는 NullPointException 방어를 위해 만들어둔 로직체크는 코드의 가독성과 유지 보수성이 떨어진다. 어떻게 null…

tecoble.techcourse.co.kr

 

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

StringBuffer, StringBuilder가 string보다 성능이 좋은 이유와 원리  (0) 2023.05.15
day25-java  (0) 2022.10.31
day24-java  (0) 2022.10.28
day23-java  (0) 2022.10.27
day22-java  (0) 2022.10.26
profile

mjeongriver

@mjeongriver

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그