본문 바로가기

JAVA/JAVA

Optional 개념과 활용

728x90

1. 정의

public final class Optional<T> {
	private final T value;
}

T타입 객체의 래퍼 클래스. T타입의 참조변수를 갖고 있다. T value의 의미는 모든 종류의 객체 저장 가능하다. 

 

참고로 래퍼 클래스는 기본 타입에 해당되는 데이터를 객체로 포장해주는 클래스이다. ex)  Integer, Long.

 

 

출처:https://readtorakesh.com/optional-in-java-8-to-avoid-nullpointer/

Optional을 왜 사용하냐면 null을 직접 다루는 것은 위험하기에(NullPointerException 문제) 객체에 담아서 간접적으로 null을 다룰 수 있다. 기존에 null 체크를 하면 코드가 지저분했기에 Optional을 자주 사용하는 편이다. 

 

2. 활용 예시

1) Optional<T> 객체 생성하기

String str= "hello";
Optional<String> optValue = Optional.of(str);
Optional<String> optValue = Optional.of("abcd");
Optional<String> optValue = Optional.of(null); //NullPointerException
Optional<String> optValue = Optional.ofNullable(null); //가능하다.

메모리

 

of는 인자로서 null값을 받지 않는다는 것이고 ofNullable은 null값을 허용한다.

 

 

2) null 대신 빈 Optional<T> 객체 사용

Optional<String> optValue = null; // 최악. 
Optional<String> optValue = Optional.empty(); // 빈 객체로 초기화.

Optional은 null이 아닌 빈 객체로 초기화해야 한다. 이는 NullPointerException을 피하기 위한 것이다. 

 

 

3) Optional<T> 객체의 값 가져오기

Optional<String> optValue = Optional.of("hello");
String str1 = optValue.get();
String str2 = optValue.orElse("");
String str3 = optValue.orElseGet(String::new);
String str4 = optValue.orElseThrow(NullPointerException::new);

 

str1은 optValue에 저장된 값을 반환하며, null이면 예외가 발생한다. 

str2는 optValue에 저장된 값이 null일 때 ""를 반환한다.

str3는 람다식 사용이 가능하다.

str4는 널이면 예외를 발생시킬 수가 있다. 

 

 

4) isPresent. Optional이 null이면 false, 아니면 true를 반환한다.

if(Optional.ofNullable(str).isPresent()){
	System.out.println(str);
}

Optional.ofNullable(str).ifPresent(System.out::println); //널이 아니면 수행한다.

ifPresent로 위의 코드처럼 널이 아닐 때만 작업 수행을 할 수 있다.

 

 

5) OptionalInt, OptionalLong, OptionalDouble

기본형 값을 감싸는 래퍼 클래스이다. 기본형을 사용하면 성능이 향상되기에 사용한다. 

 

Optional가 비교했을 때, 다른 함수들은 동일하나 값을 가져오는 함수만 다르다.

 

값을 가져오려면 OptionalInt는 getAsInt()를 사용하고, OptionalLong은 getAsLong(), OptionalDouble은 getAsDouble()을 사용하면 된다.

 

 

3. 부작용

Optional을 자주 사용하면 Null-safe하고 가독성이 좋아지지만 무분별하게 남발하면 안 된다. 아래와 같은 부작용이 생길 수 있다. 

 

  • NullPointerException 대신에 NoSuchElementException이 발생한다.
  • 코드 가독성이 오히려 안 좋을 수가 있다. 
  • 오버헤드가 증가한다. 
  • 직렬화를 지원하지 않는다.

 

블로그에 문제점과 사용법이 잘 나왔으니 Optional을 사용할 때 참고하면 좋다. 

 

 

728x90