728x90
반응형
Optional 클래스
java.util.Optional 클래스
- Optional 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 Wrapper class
- Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있음.
- Optional 객체를 사용하면 예상치 못한
NullPointerException
예외를 제공되는 메소드로 간단히 회피할 수 있음. 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 됨.
Optional 객체 생성
of()
메소드나 ofNullable()
메소드를 사용하여 Optional 객체를 생성
of
메소드: null이 아닌 명시된 값을 가지는 Optional 객체를 반환. 만약,of()
메소드를 통해 생성된 Optional 객체에 null이 저장되면 NullPointerException 예외가 발생- 참조 변수의 값이 만에 하나 null이 될 가능성이 있다면,
ofNullable()
메소드를 사용하여 Optional 객체를 생성하는 것이 좋음.
- 참조 변수의 값이 만에 하나 null이 될 가능성이 있다면,
ofNullable
메소드: 명시된 값이 null이 아니면 명시된 값을 가지는 Optional 객체를 반환하며, 명시된 값이 null이면 비어있는 Optional 객체를 반환
Optional<String> opt = Optional.ofNullable("자바 Optional 객체");
System.out.println(opt.get());
Optional 객체 접근
get()
메소드를 사용하면 Optional 객체에 저장된 값에 접근할 수 있음.- 만약 Optional 객체에 저장된 값이 null이면, NoSuchElementException 예외가 발생함
- ⇒
get()
메소드를 호출하기 전에isPresent()
메소드 혹은ifPresent()
를 사용하여 Optional 객체에 저장된 값이 null인지 아닌지를 먼저 확인한 후 호출 필요
- ⇒
isPresent()
: Optional 객체가 값을 가지면 true, 없다면 false를 리턴하는 Boolean 타입을 반환함.ifPresent()
: Optional 객체가 값을 가지고 있으면 실행, 값이 없으면 넘어감. void 타입 반환.- 또한, 다음과 같은 메소드를 사용하여 null 대신에 대체할 값 지정 가능.
orElse()
: 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환함orElseGet()
: 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 람다 표현식의 결괏값을 반환함orElseThrow()
: 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시킴
// isPresent() + Optional 객체
void optional_test() {
String email = "test@test.com";
Optional<User> user = userRepository.findByEmail(email);
if(user.isPresent()) {
System.out.println("이미 존재하는 이메일")
} else System.out.println("사용 가능한 이메일!");
}
// ifPresent() + Optional 객체
void optional_test2() {
Long idx = 4L;
userRepository.findById(idx).ifPresent(a -> {
throw new BadRequestException("이미 존재함!!");
});
System.out.println("없음!");
}
기본 타입의 Optional 클래스
- 자바에서는 IntStream 클래스와 같이 기본 타입 스트림을 위한 별도의 Optional 클래스를 제공하고 있음.
- Optionalint 클래스
- OptionalLong 클래스
- OptionalDouble 클래스
- 반환 타입이 Optional 타입이 아니라 해당 기본 타입이라는 사실만 제외하면 거의 모든 면에서 비슷함.
- 또한, Optional 객체에서
get()
메소드를 사용하여 저장된 값에 접근할 수 있는 것처럼 클래스별로 저장된 값에 접근할 수 있는 다음과 같은 메소드를 제공
클래스 | 저장된 값에 접근하는 메소드 |
---|---|
Optional | T get() |
OptionalInt | int getAsInt() |
OptionalLong | long getAsLong() |
OptionalDouble | double getAsDouble() |
IntStream stream = IntStream.of(4, 2, 1, 3);
OptionalInt result = stream.findFirst();
System.out.println(result.getAsInt()); // 4
728x90
반응형
'Java' 카테고리의 다른 글
[Java] 스레드 동시성 문제 (0) | 2025.01.06 |
---|---|
[Java] 스레드의 생성 / 실행 / 제어 / 생명 주기 (0) | 2025.01.06 |
[Java] Stream API (0) | 2025.01.05 |
[Java] Lambda Expression (1) | 2025.01.05 |
[Java] 자바 컬렉션 프레임워크 (0) | 2025.01.04 |