Optional 이란?
optional 이라는 단어는 우리 나라말로 "선택적인"이라는 의미이다.
즉, 객체를 편리하게 처리하기 위해서 만든 클래스라고 보면된다.
Optional 클래스는 java.util 패키지에 속해 있다.
public final class Optional<T> extends object
object 클래스를 확장했고 final 클래스로 선언되어 있으며, generic 한 클래스다.
final 변수는 변경불가능 하지만, final 클래스로 선언했다고 해서 내용 변경이 불가능한 것은 아니다.
대신 추가적인 확장이 불가능하다. 즉 자식 클래스를 만들 수 없다는 의미다.
이 곳에 물건을 넣을 수도 있고, 아무 물건이 없을 수 도 있다.
그래서 기본적인 클래스를 만들기 위해서는 new Optional()과 같이 객체를 생성하지 않는다.
Optional 객체생성
리턴 메소드 empty(), of(), ofNullable()
private static void createOptionalObjects(){
//empty()
//데이터가 없는 Optional 객체를 생성하려면 이와 같이 empty() 메소드 사용
Optional<String> emptyStr = Optional.empty();
//ofNullable
//만약 null이 추가될 수 있는 상황이라면 ofNullable() 메소드 사용
String common = null;
Optional<String> nullableStr = Optional.ofNullable(common);
//of
//반드시 데이터가 들어갈 수 있는 상황에서는 of()메서드 사용
common = "common";
Optional<String> commonStr = Optional.of(common);
}
Optional 객체 확인
isPresent()
private static void checkOptionalData(){
System.out.println(Optional.of("present").isPresent());
System.out.println(Optional.ofNullable(null).isPresent());
}
Optional 데이터 리턴
get(), orElse(), orElseGet(), orElseThrow()
private static void getOptionalData(Optional<String> data) throws Exception {
String defaultVal = "default";
//가장 많이 사용되는 get() 메소드. 만약 데이터가 없을 경우 null이 리턴된다.
String result1 = data.get();
//만약값이 없을 경우에는 orElse()메소드를 사용하여 기본값을 지정할 수 있다.
String result2 = data.orElse(defaultVal);
Supplier<String> stringSupplier = new Supplier<String>() {
@Override
public String get() {
return "Java8 Optional";
}
};
//Supplier<T>라는 인터페이스를 활용하는 방법으로 orElseGet() 메소드를 사용할 수 있다.
//Supplier<T>는 람다표현식에서 사용하려는 요도로 만들어 졌으며, get()메소드가 선언되어있다.
String result3 = data.orElseGet(stringSupplier);
Supplier<Exception> exceptionSupplier = new Supplier<Exception>() {
@Override
public Exception get() {
return new Exception();
}
};
//만약 데이터가 없을 경우에 예외를 발생시키고 싶다면, orElseThrow() 메소드를 사용한다.
String result4 = data.orElseThrow(exceptionSupplier);
}
정리
Optional 클래스는 null 처리를 보다 간편하게 하기 위해서 만들어졌다. 잘못하면 NullPointerException 이 발생할 수 있는데, 이문제를 보다 간편하고 명확하게 처리하려면 Optional을 사용하면 된다.
'dev > 자바' 카테고리의 다른 글
스프링부트 - 스프링시큐리티 spring security (0) | 2024.03.03 |
---|---|
Spring Boot Build 없이 Run. 톰캣 서버 재기동 없이 수정 반영 class resource jsp 등등 (0) | 2022.11.08 |
eclipse maven프로젝트를 gradle로 변경 (0) | 2022.10.13 |
Lombok (0) | 2022.09.27 |
[자바] Eclipse 에서 DCEVM 사용하기(서버재구동안하기.) (0) | 2021.02.19 |