본문 바로가기

기초 지식/Java

Java 1.8 Optional

Optional

Optional을 사용하지 않을 때는 메서드의 결과값이 null일 경우를 체크하고 분기를 나눠서 처리해야 했습니다. 코드가 지저분해지고 길어졌죠. Optional을 사용하면 조금 더 직관적으로 표현할 수 있습니다.

 

메서드가 반환할 결과값이 '없음'을 명확하게 표현하고, null을 반환하면 에러를 유발할 가능성이 높은 상황에서 Optional을 반환 타입으로 사용하는 것이 목적이다.

 

위의 목적에 맞는 사용법을 추구하여 사용해야겠습니다.

 

1. 기본 사용 예시

//null이 반환된 메소드
String isNullString = testBO.getString();


//기존 null 체크 방식
String retValue = "";
if (isNullString == null) {
	retValue = "it's null";
} else {
	retValue = isNullString;
}

//Optional 사용 방식 (비쌈)
String retValue = Optional.ofNullable(isNullString).orElse("it's null");

//위의 경우라면 추천
String retValue = isNullString == null ? "it's null" : isNullString;

-----
//값이 들어있는 리스트
String doubleString = "8.2";

//map, filter, ifPresent 사용
Optional.of(doubleString)
	.filter(NumberUtils::isParsable)
	.map(Double::parseDouble)
	.ifPresent(System.out::println);

 

사용방법은 위의 예시처럼 사용하면 됩니다. 하지만 단순히 위의 예시처럼 null인 경우에 단순값을 반환하기 위한 용도로 사용한다면 Optional이 기존 방식보다 비용이 비쌀 수 있습니다.

 

2. of, ofNullable의 차이

//of, ofNullable 차이
String isNull = null;

//NullPointerException 발생
return Optional.of(isNull);

//문제없음
return Optional.ofNullable(isNull);

 

위 처럼 of를 사용할때 null이 들어간다면 NullPointerException이 발생합니다. 따라서 null이 아닌것이 확실한 경우에만 of를 사용해야합니다. 그리고 null이 아닌것이 확실한 경우에는 ofNullable을 사용하는것은 좋은 사용법이 아닙니다.

 

3. OptionalInt, OptionalLong, OptionalDouble

//auto boxing, auto unboxing 발생
Optional<Double> doubleValue = Optional.of(28.8);
return doubleValue.get();

//auto boxing, auto unboxing 발생하지 않음
OptionalDouble doubleValue = OptionalDouble.of(28.8);
return doubleValue.get();

 

auto boxing, auto unboxing은 자바 컴파일러가 Primitive data type(ex. int, double..)을 상응하는 Wrapper class로 자동 변환시켜주는 기능입니다. 이는 당연히 비용이 들어가게 됩니다.

따라서 Optional을 사용할 때 int, long, double을 Optional<T>의 T에 사용해야한다면 OptionalInt, OptionalLong, OptionalDouble을 사용하는것이 바람직합니다.

 

 

4. 장점

  • 코드 수를 줄일 수 있다.
  • NullPointerException이 발생할 상황을 줄일 수 있다.
  • 읽기 좋은 코드를 만들 수 있다.

5. 단점

  • 잘못 사용시 비용만 비싸질 수 있다.
반응형