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. 단점
- 잘못 사용시 비용만 비싸질 수 있다.
반응형
'기초 지식 > Java' 카테고리의 다른 글
[Java] Java Primitive Type VS Reference Type (0) | 2021.05.07 |
---|---|
[Java] Java의 날짜, 시간 클래스는 어떻게 편해졌나 (0) | 2021.04.26 |
Java 1.8 Default Method (0) | 2021.03.02 |
Java 1.8 Stream 정리 (0) | 2020.10.27 |
Java 1.8 method reference (메소드 레퍼런스) (0) | 2020.10.21 |