[JAVA] Optional

 

Optional 

 

  • null을 대신 하도록 자바 8에서 추가된 코어 자바 라이브러리 데이터 형식

 

Optional 왜 쓸까

 

  • null을 사용하게 되면 NPE가 발생
    • null인 변수를 참조하면 프로그램이 즉시 종료
  • Optional을 사용하면 개발자가 변수에 값이 있는지 없는지 체크가능
  • 리턴 값이 없을 수 있다는 사실을 Optional을 통해 문서화 한다.

 

Optional 어떻게 쓸까

 

  • of() 팩토리 메서드로 Optional 인스턴스를 만든다.
  • get()으로 안에 있는 값을 꺼낼 수 있다.
Optional<String> a = Optional.of("a");

assertEquals("a", a.get());

 

  • 그러나 get()으로 얻어오는 경우 값이 없다면 NoSuchElementException을 발생시킨다.
    • null 이건 empty건 NoSuchElementException 발생

 

@Test
void testOptional() {
    Optional emptyOptional = Optional.empty();
    Optional nullOptional = Optional.ofNullable(null);

    assertThatExceptionOfType(NoSuchElementException.class)
        .isThrownBy(emptyOptional::get);
        
    assertThatExceptionOfType(NoSuchElementException.class)
        .isThrownBy(nullOptional::get);
}

 

  • isPresnt()를 사용하여 조금 더 안전하게 get() 호출이 가능

 

@Test
void testOptionalIsPresent() {
    Optional emptyOptional = Optional.empty();
    Optional nullOptional = Optional.ofNullable(null);
    Optional valueOptional = Optional.of("value");


    assertFalse(emptyOptional.isPresent());
    assertFalse(nullOptional.isPresent());
        
    assertTrue(valueOptional.isPresent());
}

 

 

  • isPresnet와 == null 의 차이가 없어보인다.
  • 그러면 굳이 Optional을 왜 사용하는 것 일까
    • orElse()로 값이 없을 경우 대체값 제공 가능

 

orElse()와 orElseGet()

 

  • Optional이 비었을 때 대체값을 제공하는 orElse()
  • 대체값 계산에 시간이 많이 걸린다면 orElseGet() 사용

 

@Test
void testOptionalOrElse() {
    Optional emptyOptional = Optional.empty();
    
    assertEquals(emptyOptional.orElse(new Station()), new Station());
    
    assertEquals(emptyOptional.orElseGet(() -> {
        Long id = 1L;
        String name = "station";
        return new Station(id, name);
    }), new Station(1L, "station"));
}

 

'study' 카테고리의 다른 글

내가 만난 CORS 관련 문제  (2) 2021.06.14
[java] 클래스와 인스턴스  (0) 2021.06.10
Spring DI  (0) 2021.04.30
Spring 동작원리  (2) 2021.04.30
Spring @Valid, @Validated Annotation  (2) 2021.04.22

댓글



Designed by JB FACTORY