Optinal<t>는 Integer
, Long
클래스처럼 T타입의 객체를 감싸는 래퍼클래스이다. 따라서 모든 타입의 참조변수를 담을 수 있다.
Optional 클래스를 사용한는 이유는 null을 간접적으로 다루기 위함이다. null을 직접다루게 되면 NullPointerException
을 만나게 될 수도 있다. 따라서 if문을 따로 생성해 null체크를 해줘야 하는데 코드가 지저분해지는 것을 피할 수 없을 것이다.
Object result = getResult();
//result의 반환값이 null이라고 가정
result.toString(); // NullPointerException 발생!!
// if문을 통해 null체크
if (result != null) {
result.toString();
}
따라서 최종 연산의 결과를 그냥 반환하지 않고 Optional객체에 담아서 반환하는 것이다. 그렇다면 결과값이 null이라도 Optional객체에 담겨서 반환되기 때문에 예외가 발생하지 않는다.
Optionala객체를 생성할 때는 Optional
클래스의 of()
나 ofNullable()
메서드를 사용한다.
변수의 값이 null일때는 NullPointerException
이 발생하기 때문에 Nullable()
메서드를 사용해야 한다.
String s = "abc";
Optional<String> o = Optional.of(s);
Optional<String> o = Optional.ofNullable(s);
Optional 타입의 참조변수를 기본값으로 초기화 할때는 empty()
메서드를 사용한다.
Optional<String> o = Optional.empty();
Optional 객체의 값을 가져올 때는 get()
메서드를 사용한다. 값이 null이라면 NoSuchElementException
이 발생하고 이때는 orElse()
메서드를 사용해 대체한다.
Optional<String> o = Optional.of("abc");
String s1 = o.get();
String s2 = 0.orElse();
값이 null일때 대신할 값을 반환해주고 싶다면 그 값을 반환하는 람다식을 지정할 수 있는 orElseGet()
메서드를 사용할 수 있다.
T orElseGet (Supplier<? extends T? other)
또 지정된 예외를 발생시킬 수 있는 orElseThrow()
메서드가 있다.
T orElseThrow (Supplier<? extends T? exceptionSupplier)
사용법을 간단하게 살펴보면,
String s1 = o.orElseGet(String::new);
String s2 = o.orElseThrow(NullPointerException::new);
이런식으로 사용할 수 있다.