NullPointerException을 방지하기 위해 null인지 체크해야하는 상황이 많습니다.
Java에서는 ifnull이나 nvl같은 메서드가 없어서 불편했는데, 이를 개선시키기 위해 Java8부터 Optional이라는 클래스를 도입했습니다.
(다양한 예제를 살펴보다보니, String 타입의 변수에 ifnull, nvl처럼 사용하는 데에는 오히려 더 복잡해보이는 것 같기도 합니다... 그냥 if(str == null) str = "" 쓰기로함)
Optional 사용법
null이 될 수 있는 값을 감싸는 Wrapper클래스입니다.
생성자
- Optional.of(value): 주어진 값으로 Optional 객체를 생성합니다. 값이 null이 아니어야 합니다.
String value = "Hello, Optional!";
Optional<String> optionalValue = Optional.of(value);
- Optional.ofNullable(value): 주어진 값으로 Optional 객체를 생성합니다. 값이 null이면 빈 Optional 객체가 생성됩니다.
String valueNull = null;
Optional<String> optionalValue2 = Optional.ofNullable(valueNull);
- Optional.empty(): 빈 Optional 객체를 생성합니다.
주요 메서드
- get(): 값이 존재한다면 해당 값을 반환하고, 없다면 NoSuchElementException을 발생시킵니다. (권장되지 않는 방법)
String value = "Hello, Optional!";
String valueNull = null;
System.out.println(optionalValue.get()); // "Hello, Optional!" (String Type)
System.out.println(optionalValue2.get()); //NoSuchElementException
- isPresent(): 값이 존재하는지 여부를 확인합니다.
String value = "Hello, Optional!";
String valueNull = null;
// 값이 존재하는지 확인
System.out.println(optionalValue.isPresent()); // true
System.out.println(optionalValue2.isPresent()); // false
- ifPresent(consumer): 값이 존재할 경우 주어진 작업을 수행합니다.
String value = "Hello, Optional!";
String valueNull = null;
// 값이 있는 경우 실행할 작업 정의 (람다식 활용)
optionalValue.ifPresent(val -> System.out.println(value)); //"Hello, Optional!"
optionalValue2.ifPresent(val -> System.out.println("hi")); //
- orElse(defaultValue): 값이 존재하지 않을 경우 주어진 기본값을 반환합니다.
orElse를 호출하는 객체의 value가 바뀌는 것이 아니기 때문에, 새로운 변수에 넣어줘야 합니다.
String value = "Hello, Optional!";
String valueNull = null;
// 값이 없는 경우 기본값 설정
var result = optionalValue.orElse("Default Value");
var result2 = optionalValue2.orElse("Default Value");
System.out.println(result); // "Hello, Optional!"
System.out.println(result2); // "Default Value"
- map(function): 값이 존재할 경우 주어진 함수를 적용하고, 결과 값을 가지는 Optional을 반환합니다.
String value = "Hello, Optional!";
String valueNull = null;
// 값이 있는 경우에만 작업 실행하고 결과 반환
String result = optionalValue.map(val -> val.toUpperCase());
String result2 = optionalValue2.map(val -> val.toUpperCase());
System.out.println(result); //"HELLO, OPTIONAL!"
System.out.println(result2);//
- flatMap(function): 값이 존재할 경우 주어진 함수를 적용하고, 결과 값을 가지는 Optional을 반환합니다. 값이 없으면 빈 Optional을 반환합니다.
- orElseGet(supplier): 값이 존재하지 않을 경우 주어진 Supplier에서 생성된 값을 반환합니다.
- orElseThrow(exceptionSupplier): 값이 존재하지 않을 경우 주어진 예외를 발생시킵니다.
전체 예제코드
import java.util.Optional;
public class Main {
public static void main(String[] args) {
String value = "Hello, Optional!";
String valueNull = null;
// Optional 객체 생성
Optional<String> optionalValue = Optional.of(value);
Optional<String> optionalValue2 = Optional.ofNullable(valueNull);
System.out.println(optionalValue.get()); // "Hello, Optional!" (String Type)
System.out.println(optionalValue2.get()); //NoSuchElementException
// 값이 존재하는지 확인
System.out.println(optionalValue.isPresent()); // true
System.out.println(optionalValue2.isPresent()); // false
// 값이 있는 경우 실행할 작업 정의 (람다식 활용)
optionalValue.ifPresent(val -> System.out.println(value)); //"Hello, Optional!"
optionalValue2.ifPresent(val -> System.out.println("hi")); //
// 값이 있는 경우에만 작업 실행하고 결과 반환
String result = optionalValue.map(val -> val.toUpperCase()).orElse("No Value");
String result2 = optionalValue2.map(val -> val.toUpperCase()).orElse("No Value");
System.out.println(result); //"HELLO, OPTIONAL!"
System.out.println(result2);//"No Value"
// 값이 없는 경우 기본값 설정
optionalValue.orElse("Default Value");
optionalValue2.orElse("Default Value");
System.out.println(optionalValue); // "Hello, Optional!" (Optional Type)
System.out.println(optionalValue2); // "Default Value" (Optional Type)
}
}
728x90
'Java' 카테고리의 다른 글
[Java] String to LocalDate (0) | 2023.08.13 |
---|---|
[Java] equals NullPointerException(NPE) 다루기 (0) | 2023.08.11 |
[Java] LocalDate 비교 (0) | 2023.08.10 |
[JAVA] HashMap, LinkedHashMap - value로 key찾기 (0) | 2023.08.09 |
[JAVA] Set과 Map의 차이 (0) | 2023.07.27 |