📖 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해주는 래퍼(Wrapper) 클래스이다.
📖 Java8에서는 Optional 클래스를 사용하여 NPE를 방지 할 수 있도록 한다.
✍ NPE(NullPointerException)
📖 값이 비어 있는 경우
↳ Optional은 Wrapper Class에 해당하기 때문에 빈 값이 올수도 있는데,
빈 객체는 아래와 같이 생성할 수 있다.
<Optional<String> optional = Optional.empty();
📖 값이 Null이 아닌 경우
↳ 어떤 데이터가 만약 절대 null이 아닌 경우에는 아래와 같이 생성 할 수 있다.
아래의 데이터를 Null 값으로 저장하려고 하면 NullPointerException이 발생한다.
<String string = null;
Optional<String> opString = Optional.of(string); // 허용되지 않음.
📖 값이 Null인 경우
↳ null이 허용되어야 하는 경우에는 아래와 같이 생성한다.
<String str = null;
Optional<String> optional = Optional.ofNullable("str");
// 값을 가지고 오는 경우
String result = optional.orElse("nullable"); // 또는 orElseGet();
📖 of(), ofNullable(), isPresent(), get(), orElse(), orElseGet(), orElseThrow()
📖 findFirst(), findAny() 기본 타입의 Optional Class인 경우
📖 get() : Optional 객체에 저장된 값에 접근.
만일 저장된 값이 null이면, NoSuchElementException 발생
📖 isPresent() : Optional객체에 저장된 값이 null인지 확인하는 method.
📖 orElse() :
저잔된 값이 존재하면 값을 반환하고, 없으면 인수로 전달된 값을 반환한다.
📖 orElseGet() :
저장된 값이 존재하면 그 값을 반환하고, 없으면 인수로 전달된 람다 표현식의 결과값을 반환한다.
📖 orElseThrow() :
저장된 값이 존재하면 그 값을 반환하고, 값이 없으면 인수로 전달된 예외를 발생시킨다.
Optional<String> opt = Optional.empty(); // Optional를 null로 초기화함.
System.out.println(opt.orElse("빈 Optional 객체"));
System.out.println(opt.orElseGet(String::new));
System.out.println(opt.orElseThrow(Exception::new));
✍ [1] : 입력예시
// Java8 이전
List<String> names = new ArrayList<>();
names.add("name1");
names.add("name2");
List<String> temps = names != null ? names : new ArrayList<>();
// Java8 이후(Lamda Expression 등장)
List<String> nameList = Optional.ofNullable(names)).orElseGet(() -> new ArrayList<>());
✍ [2] : 입력예시
Optional<String> opt = Optional.ofNullable(getName());
String result = opt.orElseThrow(Exception::new).toUpperCase();
📖 Optional은 값을 Wrapping, Unwrapping 하는 등 함수를 호출시 overhead가 있으므로 잘못 사용하면 성능을 감소 시킨다. 따라서 반환 값이 절대 null이 아니라면 Optional 사용을 하지 않는 것이 좋다.
↳ 오버헤드(overhead)는 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 의미한다.
개인적으로 공부하며 기록한 내용으로, 틀린 내용이 있는 경우 덧글을 달아주시면 감사하겠습니다. 😍