728x90
of, ofNullable로 객체 감싸기
자바에서 제공하는 객체를 Optional 객체로 감싸기 위해서는 Optional 에서 제공하는 of 와 ofNullable 매서드를 사용합니다. 둘의 차이점은 of는 인자로서 null값을 받지 않는다는 것이고 ofNullable은 null값을 허용한다는 것입니다.
@Test
public void givenNonNull_whenCreatesNonNullable() {
String name = "saelobi";
Optional<String> opt = Optional.of(name);
assertEquals("Optional[saelobi]", opt.toString());
}
아래 코드를 보시면 null값을 of 메서드의 입력으로 받을 시 NullPointerException을 일으킵니다.
@Test(expected = NullPointerException.class)
public void givenNull_whenThrowsErrorOnCreate() {
String name = null;
Optional<String> opt = Optional.of(name);
}
ofNullable은 일반 객체뿐만 아니라 null값까지 입력으로 받을 수 있다는 것을 아래 코드로 확인해 볼 수 있습니다.
@Test
public void givenNonNull_whenCreatesNullable() {
String name = "saelobi";
Optional<String> opt = Optional.ofNullable(name);
assertEquals("Optional[saelobi]", opt.toString());
}
@Test
public void givenNull_whenCreatesNullable() {
String name = null;
Optional<String> opt = Optional.ofNullable(name);
assertEquals("Optional.empty", opt.toString());
}
또한, isPresent메서드로 현재 Optional이 보유한 값이 null인지 아닌지를 확인할 수 있습니다.
@Test
public void givenOptional_whenIsPresentWorks() {
Optional<String> opt = Optional.of("saelobi");
assertTrue(opt.isPresent());
opt = Optional.ofNullable(null);
assertFalse(opt.isPresent());
}
- 이 Optional 메서드를 이용하면 다음과 같은 if를 이용한 null값 체크를 대체할 수 있습니다. if를 이용한 null값 체크가 좋지 않은 이유는 크게 2가지가 있습니다.
1. 코드가 길어짐에 따라 코드의 가독성이 점점 떨어지게 된다
2. 각 변수마다 null값을 체크해야 되기 때문에 프로그래머의 실수를 유발할 가능성이 높아진다.
- Optional 방식은 위의 문제를 해결하여 가독성 좋고 강건한 코드를 만드는 데 도움을 줍니다. 다음 예제를 보면 어떤 의미인지 바로 아실 수 있을겁니다.
if(name != null){
System.out.println(name.length);
}
- 위의 if 의 null 체크 방식을 다음과 같이 ifPresent로 간결하게 해결할 수 있습니다.
@Test
public void givenOptional_whenIfPresentWorks() {
Optional<String> opt = Optional.of("saelobi");
opt.ifPresent(name -> System.out.println(name.length()));
}
출처: https://engkimbs.tistory.com/646, https://www.baeldung.com/java-optional
728x90
'JAVA' 카테고리의 다른 글
ArrayList 중복 값 개수 세기(부제: Map 자료구조) (0) | 2022.07.11 |
---|---|
다형성(Polymorphism) (0) | 2022.06.21 |
롬복(lombok) .. 그 기능에 관해서 (0) | 2022.03.31 |
(Java) 로그관리! Logger 사용 이유 및 설정 방법 (0) | 2022.03.27 |
[디자인 패턴]Builder pattern 이란? (0) | 2022.03.22 |