[Java] Java 8: Optional

sj·2022년 12월 4일

Java

목록 보기
7/7

Optional 이란?

NPE(Null Pointer Exception) 예외를 Optional이 제공하는 메소드로 간단하게 회피할 수 있다.

⚠️ 잘못 사용하면 오히려 코드가 오히려 지저분해지고, 의미 없는 동작, Side-Effect 유발이 많이 발생할 수 있음.

  • NPE은 물론이고, NoSuchElementException이 발생함.
  • 잘못된 Optional 사용으로 새로운 문제들이 발생함.
  • 코드의 가독성을 파괴
  • 시간, 공간적 비용이 증가함

null 을 반환하면 오류가 발생할 가능성이 매우 높은 경우에 “결과 없음”을 명확하기 드러내기 위해 메소드의 반환 타입으로 사용되도록 매우 제한적인 경우로 설계됨.
- Java 언어 아키텍트 Brian Goetz

✅ Optional은 메소드 반환 타입으로만 사용해야한다.

➕ Optional은 Wrapper Class 이다.

Optional의 객체 꺼내는 방법

Optional<String> opt = Optional.ofNullable("Optional은 Wrapper Class");
System.out.println(opt.get());

예시

empty()

Optional<String> empty = Optional.empty();
System.out.println(empty.isPresent()); // ?

of()

Optional<String> empty = Optional.of("assert NotNull");    
System.out.println(empty.isPresent()); // ?
Optional.of(null); // ?

→ NPE 발생. of는 null이 아님을 확신할때 사용.

ofNullable()

Optional<String> empty = Optional.ofNullable(null);    
System.out.println(empty.isPresent()); // ?

ifPresent()

Optional에서 꺼낸 객체가 존재한다면, 구문수행.

String name = null;
Optional<String> opt = Optional.ofNullable(name);
opt.ifPresent(n -> System.out.println(n.length()));

orElse()

Optional에서 꺼낸 객체가 존재한다면 꺼내고, 그렇지 않다면? orElse의 인자값을 반환

System.out.println(Optional.ofNullable(null).orElse("냐옹"));
System.out.println(Optional.ofNullable("Hey!").orElse("냐옹"));

orElseGet()

orElse()와 비슷하지만, 인자값으로 람다 표현식의 결과값을 출력

System.out.println(Optional.ofNullable(null).orElseGet(() -> "냐옹"));
System.out.println(Optional.ofNullable("Hey!").orElseGet(() -> "냐옹"));

orElseThrow()

Optional에서 꺼낸 객체가 존재한다면 꺼내고, 그렇지 않다면? Exception 던지기

String nullName = null;
String name = Optional.ofNullable(nullName).orElseThrow(IllegalArgumentException::new);

0개의 댓글