[JAVA] Optional<T> 클래스

SCY·2023년 2월 15일
0

Null과 관련된 오류에서 다들 한번쯤은 헤매보았을 것이다.
Null값을 방지하기 위해서는 아래와 같은 코드를 작성해야 했다.

if(names != null){
    execute();
}

이렇게 되면 코드가 점점 길어지고 귀찮아진다.

JAVA 8에서부터는 Optional<T>이라는 유용한 클래스를 제공한다.
Optional<T>는 null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 참조하더라도 NPE(NullPointerException)가 발생하지 않도록 도와준다. 한 겹 더 감싸져 있다고 생각하면 된다.

Optional 객체 생성하기

Optional.empty() : 값이 Null인 경우

Optional<String> op = Optional.empty();

System.out.println(op); // Optional.empty
System.out.println(op.isPresent()); // false

Optional.of() : 값이 Null이 아닌 경우
Null을 저장하려고 하면 NPE가 발생한다.

Optional<String> op = Optional.of("hi");

System.out.println(op); // Optional[hi]
System.out.println(op.isPresent()); // true

Optional.ofNullable() - 값이 Null일 수도, 아닐 수도 있는 경우
orElse()를 통해 Null인 경우에도 안전하게 값을 가져올 수도 있다. orElse()isPresent()-get()를 대체한다.

Optional<String> opjava = Optional.ofNullable("java"); // Optional[java]

Optional<String> op = Optional.ofNullable(null);        
System.out.println(op); // Optional.empty
System.out.println(op.orElse("null값이다.")); // null인 경우 반환

참고로 orElse(...)...은 empty이든 아니든 실행되므로 orElse(new Member()) 같은 코드는 삼가고 이 경우에는 orElseGet()을 사용하는 것이 좋다.

Optional 객체 접근하기

get() 메소드를 사용하여 객체에 접근할 수 있다. 한 겹 까주는 역할이라고 생각할 수 있다.

Optional<String> op = Optional.ofNullable("spring");
System.out.println(op); // Optional[spring]
System.out.println(op.get()); // spring

잘못된 Optional 사용은 큰 비용을 야기할 수 있으므로, 결과가 null이 될 수 있으며 null에 의해 오류가 발생할 가능성이 매우 높을 때만 반환값으로 사용해야 한다.

profile
성장 중독 | 서버, 데이터, 정보 보안을 공부합니다.

0개의 댓글