옵셔널은 Java 8부터 도입된 클래스로, 값이 있을 수도 없을 수도 있는 상황을 처리하기 위한 컨테이너 클래스이다.
Optional의 값이 존재하는 경우 Optional 객체에 해당 값이 포함되며 값이 없는 경우에는 Optional.empty()를 호출하여 빈 Optional 객체를 생성한다.
이러한 방식은 null 값을 다루는 것보다 안전한 방법을 제공한다. null을 다룰 때 발생할 수 있는 NullPointerException을 방지할 수 있다.
또한 Optional은 메서드 체이닝을 통해 다양한 연산을 수행할 수 있다. 값이 존재하는 경우에만 연산을 수행하거나, 값이 없는 경우에 대한 대체값을 제공할 수 있다.
of: 주어진 값으로 Optional 객체를 생성한다. 만약 값이 null이라면 NullPointerException이 발생한다.
ofNullable: 주어진 값으로 Optional 객체를 생성한다. 값이 null인 경우에도 Optional 객체가 생성되며 이는 값이 없는 상태를 말한다.
isPresent: Optional 객체에 값이 있는지 확인힌다. 값이 존재하면 true를 반환하고, 값이 없으면 false를 반환한다.
get: Optional 객체에 값이 존재한다면 해당 값을 반환하며 값이 없는 경우에는 NoSuchElementException이 발생한다. isPresent() 메서드를 통해 값의 존재 여부를 확인한 뒤에 사용하는 것이 좋다.
orElse: Optional 객체에 값이 존재한다면 해당 값을 반환하고, 값이 없는 경우에는 주어진 기본값을 반환한다.
orElseGet: Optional 객체에 값이 존재한다면 해당 값을 반환하고, 값이 없는 경우에는 주어진 Supplier 함수를 통해 기본값을 생성하여 반환한다.
orElseThrow: Optional 객체에 값이 존재한다면 해당 값을 반환하고, 값이 없는 경우에는 주어진 Supplier 함수를 통해 예외를 발생시킨다.
Optional을 사용하는 예시는 다음과 같다.
Optional<String> optionalValue = Optional.of("Hello"); // 값이 있는 Optional 생성
Optional<String> optionalEmpty = Optional.empty(); // 값이 없는 Optional 생성
// 값이 존재하는 경우
if (optionalValue.isPresent()) {
String value = optionalValue.get();
System.out.println(value); // 출력: Hello
}
// 값이 없는 경우
if (optionalEmpty.isEmpty()) {
System.out.println("Value is empty"); // 출력: Value is empty
}
// 값이 있는 경우에만 연산 수행
optionalValue.ifPresent(val -> System.out.println(val.toUpperCase())); // 출력: HELLO
// 값이 없는 경우 대체값 제공
String result = optionalEmpty.orElse("Default Value");
System.out.println(result); // 출력: Default Value
Optional은 주로 메서드의 반환 타입이나 매개변수로 사용되며 null을 반환하거나 받는 것보다 안전하고, 명확한 코드를 작성할 수 있도록 한다는 장점이 있다. 그러나 Optional을 남용하는 것은 코드의 가독성과 성능에 문제를 유발할 수 있으므로 주의해야 한다.