[Java] Optional 클래스

Harry park·2022년 5월 16일
0

Java

목록 보기
5/8

Optional 클래스

📌 Optional 클래스 정의

📖 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해주는 래퍼(Wrapper) 클래스이다.
📖 Java8에서는 Optional 클래스를 사용하여 NPE를 방지 할 수 있도록 한다.
✍ NPE(NullPointerException)

📌 Optional 객체의 생성

📖 값이 비어 있는 경우
   ↳ 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();

📌 Optional 주요 메서드

📖 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));

📌 Optional 객체의 사용법

✍ [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 객체의 주의사항

📖 Optional은 값을 Wrapping, Unwrapping 하는 등 함수를 호출시 overhead가 있으므로 잘못 사용하면 성능을 감소 시킨다. 따라서 반환 값이 절대 null이 아니라면 Optional 사용을 하지 않는 것이 좋다.
↳ 오버헤드(overhead)는 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 의미한다.


📌 참고사이트

  1. TCP School - Optional
  2. 티스토리1
  3. 티스토리2

개인적으로 공부하며 기록한 내용으로, 틀린 내용이 있는 경우 덧글을 달아주시면 감사하겠습니다. 😍

profile
Jr. Backend Engineer

0개의 댓글