
자바8의 핵심기능 중 하나인 Optional 클래스에 대하여 알아보자
기존에 NPE에 대한 소개를 했었는데 Optional을 사용하여 복잡한 조건 없이 오브젝트에 대한 null을 관리 할 수 있다.
Optional<T> 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class)기 때문이다.
따라서 Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있으며 null을 관리 할 수 있다.
1. Optional
1-1. Optional 클래스에 진입하면 static에 EMPTY로 빈 객체를 생성, 공유 하고있다.
1-2. T로 클래스를 래핑하여 빈 값에 대한 처리와 리턴을 하고 있다.

2. 활용
2-1. Optional의 간단한 예제를 진행한다. 더 많은 함수 활용은 DOCS를 참고하자.
private void test(){
//ofNullable()함수로 NPE 가능성이 있는 함수를 생성하여 Optional에 담는다.
Optional<String> optional = Optional.ofNullable(get값이있을수도없을수도());
//값이 없다면 orElse로 일종의 null 처리가 가능하다.
String id = optional.orElse("tempId");
}
2-2. Spring에서 많이 사용하는 JPA의 경우를 예로 들어보자.

private void test2(){
//Entity객체를 JPA쿼리하면 리턴이 Entity가 아니라 Optional이다.
Optional<Entity> optional = EntityRepository.findById(1L);
//isPresent()함수로 null 여부를 확인한다. 쿼리 결과가 없기때문에 return;
if(!optional.isPresent()){
return;
}
//있다면 Entity로 반환한다.
Entity ent = optional.get();
...
...
...
}
3. 한계
3-1. null을 별도의 클래스에 맡기다니 너무 편리하고 파격적으로 느껴질 수 있지만. Optional에도 한계는 존재한다. 실제 위의 샘플 코드는 실무에서 저런식으로 작성되지 않으며 클린하지 못한 코드이다.
3-2. Optional은 NPE발생 가능에 따라 리턴이 없음을 명확히 하기위헤 메소드의 반환 타입으로 사용되도록 매우 제한적이다. 첨부한 oracle-optional링크를 꼭 읽어보기 바란다.
3-3. 한계의 예
- NPE는 회피 가능하지만 실제 값에 대한 보증은 하지 않기 때문에 NoSuchElementException 가능성
- T를 포장한 래퍼 클래스기 때문에 메모리할당이 필요하고 Optional에서 한번더 접근해야하기 때문에 접근 비용이 발생한다.
- isPresent()같은 함수의 무분별한 사용을 하게되면 코드 가독성을 떨어트린다.
4. 결론
좋아 보이는 기능도 대충 구글링을 통해 함수나 찾아보고 무분별한 사용하기 이전에 DOCS를 참고하여 해당 클래스의 의도와 정확한 사용을 이해한 후에 반영해야. 좋은 기능을 100퍼센트 활용 할 수 있을것이다.여러 뎁스의 if(null !=)에 대한 편의 제공이 되었을때 우리는 어떻게 사용할 것인가.
https://www.oracle.com/technical-resources/articles/java/java8-optional.html
Tired of Null Pointer Exceptions? Consider Using Java SE 8's Optional!
Make your code more readable and protect it against null pointer exceptions. A wise man once said you are not a real Java programmer until you've dealt with a null pointer exception. Joking aside, the null reference is the source of many problems because i
www.oracle.com
https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
Optional (Java Platform SE 8 )
A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value. Additional methods that depend on the presence or absence of a contained value are provided, such as orEl
docs.oracle.com
[Java] NPE(NullPointerException)에 대하여(String NPE)
1. NPE 1-1. NPE는 null로 인하여 발생하는 Runtime Exception이다. 1-2. null 유발에 대한 고찰 개발하다 보면 객체의 null에 대한 가능성을 고려해야 하는 경우가 생긴다. 예제 코드로 이러한 경우를 확인하
yangjaya.tistory.com
'Java' 카테고리의 다른 글
| [Java] 자바 AtomicLong의 사용과 멀티 스레드 (0) | 2023.11.26 |
|---|---|
| [Java] 자바 LocalDatetime, LocalDate, LocalTime 시간 API (0) | 2023.11.26 |
| [Java] NPE(NullPointerException)에 대하여(String NPE) (0) | 2023.09.29 |
| [Java]Map(HashMap)의 전체 데이터를 출력하는 방법 (0) | 2023.09.29 |
| [Java]자바 스트림(Stream API)과 for 그리고 배열(Array) 처리 (0) | 2023.09.28 |
