[JAVA] Optional
- study
- 2021. 5. 15. 16:46
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 |