JAVA

Optional.of 와 Optional.ofNullable 의 차이

쿠카이든 2022. 5. 13. 09:52
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