[Java] Optional<T> 클래스 공부

YoungHo-Cha·2021년 9월 22일
1
post-thumbnail

자바 코드를 작성하면서 다른곳의 api, 라이브러리를 이용하는 경우가 많았다.
근데 많은 곳에서 Optional 타입의 객체를 이용하는 모습을 볼 수가 있었다.
구글링을 통해서 해당 객체를 사용해오긴 했지만, 무엇인지 정확히 모르는 상태로 쓰는게 정말 찝찝하다.

그래서 오늘은 자바 Optional 객체에 대해서 공부를 해보자.


목차

  • Optional이란?
  • 왜 사용하는가?
  • Option<T> 객체 생성
  • Optional<T> 클래스 객체 값 가져오기

🤔Optional이란?

Optional<T> 클래스는 'T'타입의 객체를 포장해주는 래퍼 클래스이다. Integer과 Double 처럼 정해진 타입이 아닌, 모든 타입을 포장해준다.


🤔왜 사용하는가?

Optional 클래스를 이용하면 null에 대한 조작을 편하게 할 수 있다.

다음 코드를 예시로 보자.

Object result = getResult(); // getResult는 어떠한 값을 리턴한다.

if(result!= null){
	System.Out.println("null 오류 입니다.");
    return;
}

list.add(result);

여기서 result의 값은 Object or null 둘 중에 하나가 될 수 있다. Object일 경우에는 정상적인 코드를 타겠지만 null일 경우에는 null check에 대한 로직을 첨가해야한다.
(null 체크를 해야할 것이 많을 수록 더더욱 복잡한 null check가 될 것이다..)

Optional 클래스를 이용하면 null check에 대한 예외를 제공받아 메소드로 간단하게 회피할 수 있다.
(즉, 복잡한 조건문 없이 널값으로 인한 예외처리를 처리할 수 있게 된다.)

어떻게 null check를 피할까

위의 코드에서 Optional로 바뀐 코드를 살펴보자.

Optional<Object> result = Optional.of(getResult());

/*
if(result!= null){
	System.Out.println("null 오류 입니다.");
    return;
}

이제 null 로직 필요 없음
*/

list.add(result);

위의 코드를 보면 Optional로 바꾸어주어서 null check에 대한 코드를 없앨 수가 있다.

Optional 내부의 value는 null이겠지만, 복잡한 null check이 사라진 것이다.


🤔Option<T> 객체 생성


String str = "abc";
Optional<String> optionalValue = Optional.of(str);

//---- null을 Optional로 생성
Optional<String> optionalValue2_1 = Optional.of(null); // 에러!!

Optional<String> optionalValue2_2 = Optional.ofNullable(null); // ok

Optional.of(str)을 통해서 str을 Optioanl.of객체로 담은 모습을 볼 수 있다.

Optional은 어떻게 되어있길래 아무거나 넣어도 동작할까?
Optional 코드를 보자.

public final class Optinal<T>{
	private final T value;
    }

위 코드를 살펴보면 제네릭 타입으로 받아서 처리하는 것을 볼 수 있다.


🤔Optional<T> 클래스 객체 값 가져오기

코드를 보자!


Optional<String> optVal = Optional.of("abc");
String str1 = optVal.get(); // null이면 예외 발생
String str2 = optVal.orElse(""); //null일 떄는, ""를 반환
String str3 = optVal.orElseGet(String::new); // 람다식 () -> new String()
String str4 = optVal.orElseThrow(NullPointException::new); // 널이면 예외 발생, 예외의 종류를 지정할 수 있다.


//isPresent : Optional 객체의 값이 null이면 false, 아니면 true
if(Optinal.ofNullable(str).isPresent()){ //if(str !=null)
	System.out.println(str);
}

위 코드를 보면 null로 인한 컴파일 에러가 아닌 예외를 통해서 null을 다룰 수 있는 것을 볼 수 있다.
그리고
예외를 좀 더 편하게 다룰 수가 있다.


마치며

Optional 클래스는 OptionalInt, OptionalLong, OptionalDouble과 같이 기본 타입을 지원하는 클래스도 존재한다.

해당 내용 또한 위의 내용과 똑같다.
함수 명만 살짝 달라질 뿐이다.

앞으로는 Optianl에 대해서 걱정하지말고 사용하자!


🧷Reference

profile
관심많은 영호입니다. 궁금한 거 있으시면 다음 익명 카톡으로 말씀해주시면 가능한 도와드리겠습니다! https://open.kakao.com/o/sE6T84kf

0개의 댓글