스프링 강의를 수강하기 시작하며 Optional이란 걸 마주쳤다! null값으로 올 수 있는 애들을 위해서 실무에서 많이 쓴다던데?

이제 이런 것들 안 지나치고 내 것으로 만들어야겠다는 생각이 든다. 바로 알아봤음.


일단 이 녀석은 Integer클래스처럼 일종의 Wrapper클래스다. 포장해주는 느낌. 그리고 그 알멩이로는 모든 타입의 변수가 저장될 수 있다.

 

내부 알멩이로 null 역시 저장될 수 있기 때문에, null값과 관련된 예상치 못한 NPE(NullPointerException)들을 피할 수 있다는게 가장 큰 장점이다. 예를 들면 어떤 저장소에서 find를 했는데 내가 찾는 게 없어서 null값이 반환된 경우 등..이런 상황을 방지하려면 find한 결과가 null인지 아닌지를 if문으로 파악해야 했지만 Optional을 사용하면 그런 걸 간단히 처리할 수 있다는 게 장점쓰. 애당초 null일 수도 있는 값을 다루기 위한 클래스이기 때문에 그와 관련된 다양한 메서드들을 제공한다.

 

그러면 일단, 이 Optional 객체를 어떻게 만드는가? Optional클래스를 뜯어보면 다음과 같이 of와 ofNullable이라는 스태틱 메서드가 정의돼있는 것을 볼 수 있다.

 

 

두 메서드 모두 Optional을 리턴하는 걸 볼 수 있다. 즉 이 두 메서드를 통해서 Optional객체를 생성할 수 있다! of메서드는 인자로 'null이 아닌 값'을 받고, ofNullable메서드는 인자로 'null값일 수도 있는 값'을 받는다.

 

of메서드의 경우 인자로 준 값이 null이면 NPE예외가 발생한다. 또한, ofNullable메서드의 경우 인자로 준 값이 null이면 EMPTY, 즉 빈 Optional객체가 리턴된다. 아니 그냥 내부에 null값 넣어서 리턴해주지 왜 약속된 빈 Optional객체(= EMPTY)를 리턴하도록 했을까? 답은 메모리 절약을 위해서. 어차피 알멩이가 null인 Optional 객체는 솔직히 의미없는 객체인데, 여러 곳에서 이 깡깡이 Optional객체를 만들었다면 메모리 낭비가 있을 것이다. 이를 위해 Optional클래스가 싱글턴 인스턴스로 EMPTY 객체를 가지는거고, 얘 하나만을 빈 객체로 리턴해주는 것이다. 개발자 분들이 메모리 절약을 위한 센스있는 선택을 하신 것 같다. 캬..

 

 

그럼 이 Optional객체가 감싸고 있는 알멩이는 어떻게 꺼낼 수 있을까? 간단하다. get메서드로 꺼낼 수 있다. 근데 음..이렇게 꺼내쓰는 건 권장되지 않는다고 한다. 만약 Optional객체가 감싸고 있는 값이 null이면 NoSuchElementException예외가 발생하기 때문. 즉 다짜고짜 꺼내는 게 아니라 안에 있는 알멩이가 null인지를 확인하고 꺼내는 게 좋다. isPresent메서드가 이 기능을 해준다.

 

참고로 isEmpty메서드는 는 반대로 알멩이가 null이면 true를 리턴한다

 

그럼 만약 알멩이가 null인지를 확인하고, null이 아니면 바로 뭔가 해주고 싶으면? ifPresent메서드를 사용할 수도 있다. 이 메서드는 알멩이가 null이 아니면 파라미터로 받은 action을 실행해준다.

 

뭐 람다식같은 거 인자로 주면 되겠죵?

 

만약, 알멩이를 꺼내고 싶은데 알멩이가 null이면 내가 지정한 값을 쓰고 싶다면? orElse메서드를 쓰면 된다.

 

 

 

이외에도 여러 메서드들이 있다. 실무에서는 null값이 될 수도 있는 애들을 Optional로 래핑해서 처리하는 경우가 많다고 한다. 나도 이 방법을 숙지하도록 하자. 아자아자..!

 

※ 참고 : orElse vs orElseGet에 관련된 좋은 글

https://ysjune.github.io/posts/java/orelsenorelseget/

 

orElse 와 orElseGet 무슨 차이가 있을까?

The Lazy Snack's Cargo

ysjune.github.io

 

+ Recent posts