JAVA

Optional 클래스

JUN0126 2021. 7. 14. 00:34

Optional 클래스란 ? (java.util.Optional<T>)

 - 개발을 하다보면 심심치 않게 NullPointException(NPE)에러가 발생하는것을 볼 수 있다. 객체가 값이 없이 null을 참조할 때 발생하는 에러인데, java8 버전 이전에는 해당 에러를 잡아주기 위해서는 null값을 체크해주는 구문을 계속해서 작성하여 null 체크를 해주어 코드가 길어지며 가독성이 좋지 않은 현상들이 많이 발생했다.

이러한 현상들을 개선해주는 클래스가 java8 버전에서 나온 Optional 클래스이다.

- Optional는 “존재할 수도 있지만 안 할 수도 있는 객체”, 즉, “null이 될 수도 있는 객체”을 감싸고 있는 일종의 래퍼 클래스이다

- Optional 클래스로 객체를 래핑하여 사용하게 되면 NPE를 유발할 수 있는 null을 직접 구문을 작성해 체크하지 않고 

Optional클래스에서 명시적으로 표현 해 줄 수 있다.

 

사용법

1) 선언 방법

Optional<T> 변수명 = Optional.empty() | Optional.of(인자) | Optional.ofNullable(인자)

 •  Optional.empty() : null을 담고있는 Optional 객체 생성

 •  Optional.of(인자) : 인자가 null이 아닌 객체를 담고 있는 Optional 객체 생성, null이 넘어올 경우 NPE 에러 발생

 •  Optional.ofNullable(인자) : 인자가 null인지 아닌지 확신할 수 없는 객체를 담고 있는 Optional 객체를 생성

2) 접근 방법

 • 변수명.get() : 래핑되고 있는 객체 T 가 null이 아니라면 T 반환, 그렇지 않다면 비어있는 Optional 객체에 대해서, NoSuchElementException 에러 발생, 해당 메서드를 사용하려면 해당 객체 T가 Null이 아닐 때 true를 반환하는 isPresent 메서드를 활용해서 에러가 발생하지 않도록 체크해 준 후 사용해야 한다.

 

 • 변수명.orElse(인자) : 래핑되고 있는 객체 T가 null 이라면 orElse에서 사용된 인자를 반환, 그렇지 않다면 T 반환 

    여기서 orElse에서 사용된 인자의 객체는 래핑되고 있는 객체 T와 타입이 같아야 한다.

   EX) Optional<String> opt변수명 = Optional.ofNullable(인자)

        String orElseTest = opt변수명.orElse("문자객체 String");

       -------------------------------------------------------------------

        Optional<객체명> opt변수명 = Optional.ofNullable(인자)

        객체명 orElseTest = opt변수명.orElse(객체 선언한 객체 인스턴스 변수 or new 객체명);

 

 • 변수명.orElseGet(인자) : orElse와 기능은 같으나 return이 람다식으로 리턴

 

 • 변수명.orElseThrow(인자) : orElse와 기능은 같으나, 인자에 예외를 선언하여 null값이 있을 시 선언한 예외 발생

 

위와 같은 Optional 기능들 이외에도 stream과 같은 기능들을 사용할 수 있다 해당 내역은 사용하면서 블로그 리팩토링할때 다시 한번 정리 해야겠다

 

 

참조 : http://tcpschool.com/java/java_stream_optional

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

https://www.daleseo.com/java8-optional-before/

 

자바8 Optional 1부: 빠져나올 수 없는 null 처리의 늪

Engineering Blog by Dale Seo

www.daleseo.com

 

'JAVA' 카테고리의 다른 글

Retrofit2 (Java)  (0) 2022.04.02
JSON 변환 라이브러리 (Gson,Jackson)  (0) 2022.03.17
일급 컬렉션 (First Class Collection)  (0) 2021.07.13
컬렉션 프레임워크  (0) 2021.07.10
프로세스와 쓰레드  (0) 2021.07.09