Optional
java.util.Optional<T> 클래스
optional이란?
- T 타입의 객체를 감싸주는 Wrapper 클래스
- T 타입의 참조 변수에 모든 타입의 객체를 저장할 수 있고
- 복잡한 조건문 없이도 null값으로 인해 발생하는 예외를 처리할 수 있게 됨
//String 타입의 참조변수(opt)에 문자열 객체 저장
Optional<String> opt = Optional.of("ABC")
- 존재할 수도 있고, 존재하지 않을 수도 있는 객체, 즉 null이 될 수도 있는 객체를 감싸주는 Wrapper 클래스
- 따라서 Optional 객체를 사용하면, 예상하지 못한 NPE(NullPointerException) 예외에 대해 간단히 회피할 수 있음
- 즉, Optional 타입의 변수에 값을 저장하기 때문에,
- 값이 null이더라도 바로 NPE 예외가 발생하지 않고
- 클래스이기 때문에 각종 메서드를 제공함
NPE(NullPointerException)
- null인 값을 참조하여 발생하는 예외
- NPE 예외를 피하려면, null 여부를 검사해야 하는데, 검사해야 하는 변수가 많으면 복잡해짐
- 그래서 초기값을 설정하여 사용하기를 권장함
optional의 효과
Optional로 null이 될 수 있는 객체를 감싸서 사용하면
- NPE를 발생시키는 null을 직접 다루지 않아도 되고
- null 체크를 위한 조건문(if-else문 등)을 길게 작성하지 않아도 됨
- 명시적으로 해당 변수가 null일 수도 있다는 가능성을 표현할 수 있음
Optional의 사용법
1. Optional 변수 선언하기
Optional<Integer> opt; // Optional타입의 변수에 Integer타입의 데이터를 대입할 수 있음
- Optional은 제네릭 타입을 제공하므로
- 변수를 선언할 때에 명시한 타입 파라미터에 따라서 사용할 수 있는 객체의 타입이 결정됨
- opt 참조 변수에 저장할 수 있는 자료형은 Integer
2. Optional 객체 생성하기
[ Optional 객체를 생성할 수 있는 3가지 메서드 ]
1. Optional.empty()
2. Optional.of()
3. Optional.ofNullable()
1) 값이 null인 경우 : Optional.empty()
- null을 담고 있는, 즉 비어있는 Optional 객체를 생성
- 비어있는 객체는 Optional 내부적으로 미리 생성해놓은 싱글톤 인스턴스
- 즉, 빈 Optional 객체를 만들고 싶다면 Optional.empty()로 생성
[ 예제 ]
public static void main(String[] args) {
// 값이 null인 경우: Optional.empty()
Optional<String> opt = Optional.empty();
System.out.println(opt); // Optional.empty
System.out.println(opt.isPresent()); // false
System.out.println(opt.isEmpty()); // true
}
2) null이 아닌 값을 가지는 경우 : Optional.of()
- 어떤 값이 null이 아니라면, Optional.of() 메서드로 Optional 객체를 생성
- null이 아닌 명시된 값을 가지는 Optional 객체를 반환함
- Optional.of(value)
[ 주의할 점 ]
만약 null을 Optional.of()로 저장하려는 경우에 NullPointerException 예외가 발생
// Optional.of() 메서드에 null값이 들어감 - 에러 !! Optional<String> optString = Optional.of(null);
[ 예제 ]
public static void main(String[] args) {
String str = "자바 Optional 객체";
// Optional.of : 무조건 값이 있어야 함
Optional<String> opt = Optional.of(str);
System.out.println(opt.get()); // 자바 Optional 객체
System.out.println(opt.isPresent()); // true
}
3) 값이 null이 될 가능성이 있는 경우 : Optional.ofNullable()
- 만에 하나 값이 null이 될 가능성이 있다면, Optional.ofNullable() 메서드를 사용하여 Optional 객체를 생성
- Optional.ofNullable(value)
- 명시된 값이 null이 아니면, 명시된 값을 가지는 Optional 객체를 반환하고
- 명시된 값이 null이면, 비어있는 Optional 객체를 반환
- 이후 값이 없는 경우라도 orElse()나 orElseGet() 메서드를 이용하여 값을 가져올 수 있음
[ 예제 ] 값이 있는 경우
public static void main(String[] args) {
Optional<String> opt = Optional.ofNullable("자바 Optional 객체");
System.out.println(opt.get()); // 자바 Optional 객체
// orElse(value)
// 저장된 값이 존재하면, 저장된 값을 반환하고
// 값이 없다면, 파라미터(value)로 전달된 값을 반환함
String orElse = opt.orElse("null");
System.out.println(orElse); // 자바 Optional 객체
}
[ 예제 ] 값이 null인 경우
public static void main(String[] args) {
// Optinal에 저장되는 값이 null
Optional<String> opt = Optional.ofNullable(null);
System.out.println(opt); // Optional.empty
// orElse(value)
// 저장된 값이 존재하면, 저장된 값을 반환하고
// 값이 없다면, 파라미터(value)로 전달된 값을 반환함
String orElse = opt.orElse("Optinal null");
System.out.println(orElse); // Optinal null
}
3. Optional 객체에 접근하기
get() 메서드를 사용하여 Optional 객체에 저장된 값에 접근할 수 있음
- 만약 Optional 객체에 저장된 값이 null인데 get() 메서드를 사용하면, NoSuchElementException 예외가 발생
- 따라서 get() 메소드를 호출하기 전에
- isPresent() 메소드를 사용하여
- Optional 객체에 저장된 값이 null인지 아닌지를 먼저 확인한 후 호출하는 것이 좋음
4. 메서드 : null값을 대체할 값을 지정
1) orElse() 메서드
- 저장된 값이 존재하면 그 값을 반환하고
- 값이 존재하지 않으면 파라미터에 전달된 값을 반환함
2) orElseGet() 메서드
- 저장된 값이 존재하면 그 값을 반환하고,
- 값이 존재하지 않으면 파라미터에 전달된 람다 표현식의 결괏값을 반환함
사용 시 주의할 점
1. Optional타입의 변수에 Null을 할당하지 말 것
Optional<String> opt = null; // (X), 변수 자체에 Null사용하지 말 것
Optional<String> opt = Optional.empty() // (O)
- Optional타입의 변수 자체가 null인지를 또 검사해야 하는 불편함이 있음
- null을 담고 있는 Optional 객체를 만들고 싶다면, Optional.empty()를 사용하여 변수에 할당
2. 저장된 값을 꺼내기 오기 위해서, OrElse() 메서드를 활용할 것
Optional<String> opt = Optioal.of("자바 Optional 객체");
if( opt.isPresent() ) {
String result = opt.get();
}
- get() 메서드를 사용하여 Optional 객체의 값을 가지고 오려면,
- isPresent() 메서드로 Optional 객체의 값이 존재하는지를 하여야 함
- 만약, 값을 꺼내기 전에 null 체크를 거치지 않으면, 그대로 NoSuchElementException가 발생함
Optional<String> opt = Optional.of("자바 Optional 객체");
String result = opt.orElse("Null Err");
- 저장된 값을 꺼내기 위해서 orElse 메서드를 활용할 것
- 저장된 값이 존재하면 저장된 값을 반환하고
- 값이 없다면(null) 파라미터로 전달된 값[ orElse(value) ]을 반환함
3. 파라미터로 Optional을 넘기지 말 것
- 의도에 맞게 리턴 값을 넘겨주는 용도로 사용할 것
4. 컬랙션(Collection)의 경우에 Optional을 사용할 필요가 없이, 빈 컬랙션(Collection)을 념겨주면 됨
출처
'JAVA' 카테고리의 다른 글
[JAVA] 람다식의 메서드 참조 (1) | 2024.05.02 |
---|---|
[JAVA] 람다 표현식을 사용하는 함수형 인터페이스 (0) | 2024.05.02 |
[JAVA] 스트림이 동작할 때(생성, 중간 연산, 최종 연산) 사용하는 메서드 (0) | 2024.05.01 |
[JAVA] 스트림 API(특징, 스트림의 동작 흐름, 컬랙션과의 차이) (1) | 2024.05.01 |
[JAVA] 데몬 스레드 알아보기(특징, 사용 방법) (0) | 2024.04.30 |