JuBin's personal study blog

[JAVA 8] 자바1.8 Optional이란? 본문

JAVA

[JAVA 8] 자바1.8 Optional이란?

JuBin 2020. 9. 20. 18:09
반응형
Optional은 null을 다루기위한 객체로 null이 될수도있고 안될수도있는 래퍼클래스.
원소가 없거나 최대 하나밖에없는 Collection, Stream으로 생각해도 좋다.

Optional의 효과
1. null을 직접 처리하지 않아도 된다.(null처리를 Optional 클래스에 위임)
2. 변수로 null 가능성을 표현할 수 있다.(불필요한 방어로직을 줄일 수 있다)
   2.1 Optional<Member> optMember;

        Optional<Address> maybeAdress;
        >> maybe나 opt같은 접두어를 붙여서 Optional타입 변수를 명확히 하는게 좋다. 

ex) empty(), of(), ofNullable()

//비어있는(null) Member객체 생성
Optional<Member> maybeMember = Optional.empty();
//null이아닌 객체를 담고있는 객체생성, null이 넘어올경우 NullPointerException 발생.
Optional<Member> maybeMember = Optional.of(aMember);
//null인지 아닌지 확신할 수 없을때 사용(가장 많이사용)
//만약에 null이 들어오면 비어있는 Optional<Member> 반환(Optional.empty() 와 동일)
Optional<Member> maybeMember = Optional.ofNullable(aMember);

 

 



Optional이 담고있는 객체에 접근하는 방법
기본적으로 Optional이 담고있는 객체가 존재할 경우에는 모두 동일하게 해당 값을 반환한다.

반대로 null을 담고있는 경우 다르게동작.

1. get() : 비어있을경우 NoSuchElementException 발생
2. orElse(T other) : 비어있는 Optional 객체에 대해 넘어온 인자를 반환
3. orElseGet(Supplier <? extends T> other) : orElse(T other)의 게으른 버전.
   orElse(T other) 대비 성능상 이점을 기대할 수 있다.

 


예 시

 

 

[ null로 인한 지저분한 코드 ]

User user = getUser();
if (user != null) {
  Address address = user.getAddress();
  if (address != null) {
    String street = address.getStreet();
    if (street != null) {
      return street;
    }
  }
}
return "주소 없음";

 

map 메소드는 해당 값이 null 이 아니면 mapper 를 이용해 계산한 값을 저장하는 Optional 객체를 리턴합니다. 만약 값이 null 이라면 빈 Optional 객체를 리턴합니다.

 

[ map을 통한 코드 간결화 ]

Optional<User> user = Optional.ofNullable(getUser());
Optional<Address> address = user.map(User::getAddress);
Optional<String> street = address.map(Address::getStreet);
String result = street.orElse("주소 없음");

// 다음과 같이 축약해서 쓸 수 있다.
user.map(User::getAddress)
    .map(Address::getStreet)
    .orElse("주소 없음");

 

만약 위 예제에서 getAddress  getStreet  Optional<T> 객체를 리턴한다면 flatMap 메소드를 사용할 수도 있습니다.

 

Optional<User> user = Optional.ofNullable(getUser());
String result = user
         .flatMap(User::getAddress)
         .flatMap(Address::getStreet)
         .orElse("주소 없음");
반응형

'JAVA' 카테고리의 다른 글

[Java] ObjectMapper란  (0) 2020.12.23
[JVM] JVM의 Memory영역 ( Stack & Heap&Static )  (0) 2020.11.10
서버 기반 인증 -> token 기반 인증  (0) 2020.10.31
자바1.8 Stream API 정리  (0) 2020.09.20
JAVA 8 람다식이란?  (0) 2020.09.20