Optional를 왜 사용해야 하는지 정리해보자!
public final class Optional<T> { ... }
공식 문서 API Note
Optional is primarily intended for use as a method return type
where there is a clear need to represent "no result," and
where using null is likely to cause errors.
A variable whose type is Optional should never itself be null; it should always point to an Optional instance.
옵셔널은 주로 메소드의 리턴 타입으로 사용하기위해 의도된거야
근데 어느 메소드냐면, "결과 없음"이라고 명확하게 나타내줄 필요가 있는 메소드랑
null을 사용이 에러를 발생시킬 수도 있는 메소드지~
옵셔널을 반환타입으로 가지고 있는 변수는 절대 그 자체가 null이 되어서는 안돼, 항상 옵셔널 인스턴스를 가리켜야만해~
정리
메소드의 리턴 타입이 Optional일 경우, 우리가 코드를 보고 알 수 있는 것
- 아, 이 메소드는 우리가 원하는 값을 가져오지 못할 수도 있겠구나!
- 여기 메소드에서는 null 사용으로 에러가 날 수도 있나보네?!
즉, Optional<T> 는 T 타입의 객체를 감싸주는 wrapper 클래스로, 객체가 없을 경우 반환하는 return null 까지도 포함할 수 있어, 의도치 않게 null값을 반환했을 경우, 처리를 미리함으로써 시스템이 정상적으로 작동을 할 수 있도록 해준다.
다시 말해, null 대신 사용함으로써, NullPointException을 방지할 수 있도록 도와주는 클래스다.
지양하는 메소드 2가지와 그 이유
- get()
- isPresent()
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
public boolean isPresent() {
return value != null;
}
Optional은, return null를 대체하려고 만든 것이므로, null인 상태로 사용하지 않기 위해 Optional을 사용하는 것이다. 그런데, 이렇게 get()과 isPresent()를 사용하면, 우리가 직접 null이라는 코드를 타이핑하지 않은 것뿐이지 결국 내부적으로 사용하기 때문에 Optional을 사용하게 된 의미가 퇴색된다!!
그러면, 값이 없을 때는 어떤 메서드를 사용하라는 뜻이지..?
Optional에서 지향하는 메서드 3가지
- orElse(기존에 있는 객체)
객체가 없을 경우, 즉 null일 경우 기존에 있던 객체를 매개변수로 넣어줌 - orElseGet(새로운 객체를 생성해달라고 요청하는 메서드)
객체가 없을 경우, 즉 null일 경우 디폴트 값의 객체를 생성하는 메서드를 매개변수로 넣어줌 - orElseThrow(새로운 예외 객체를 생성해달라고 요청하는 메서드)
객체가 없을 경우, 즉 null일 경우 예외 객체를 생성하는 메서드를 매개변수로 넣어줌
public T orElse(T other) {
return value != null ? value : other;
}
public T orElseGet(Supplier<? extends T> supplier) {
return value != null ? value : supplier.get();
}
public T orElseThrow() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
이렇게 1.8이후에 나온 Optional를 사용함으로써 개발자 편의성, 시스템 안정성을 높일 수 있다.
물론, 위의 get() 메서드처럼 내가 쓰는 것이 어떻게 돌아가는지는 알고쓴다면 더 좋을 것 같다!
'언어(Language) > JAVA' 카테고리의 다른 글
[JAVA] ISP vs 다형성 (0) | 2024.08.02 |
---|---|
[JAVA] JPA는 무엇일까? (2) | 2024.07.29 |
[JAVA] 예외(Exception)는 어디서 처리하는게 좋을까? (0) | 2024.07.24 |
내가 생각하는 SOLID원칙 (0) | 2024.07.12 |
[JAVA] 생성자도 상속이 된다는 입장에서 쓰는 글 (0) | 2024.07.04 |