Optional 클래스는 자바8부터 도입된 기능으로, 널 포인터 예외(NullPointerException)를 방지하고 더 명시적이고 안정적으로 널값을 다룰 수 있게 해준다.
Optional은 널 값을 가질 수 있는 객체를 표현하는 컨테이너이다. 이는 널 값을 가질 수도 있고, 아닐 수도 있다는 것을 나타낸다.
이를 사용하면 다음과 같은 3가지 구체적인 장점이 있다.
장점
1.널 포인터 예외(NullPointerException)를 방지
2.가독성 증가, 및 안정적인 API설계
3.다양한 함수를 사용 가능 (filter, map 등)
주의점
1.반환값으로 사용하고, 클래스필드에 Optional 사용 자제 (메모리 오버헤드 발생 가능성있음)
2.값이 항상 존재할 경우 불필요하게 사용할 필요가 없음
3.값을 꺼내는 Optional.get()을 사용시, 결국 Optional을 사용해서 얻는 안정성이 의미가 없어질 수 있음(결국 Optional 안쓰는 거나 마찬가지니)
한계
1.널을 대체하기 위한 도구이지만 혼용하여 사용하면 결국 널 문제가 발생할 수 있음
2.언어차원에서 지원하는 코틀린보다 널 안정성이 떨어질 수 있음
Optional 사용 예
1.생성
I.값을 포함하는 Optional 생성
Optional<String> optionalValue = Optional.of("Hello");
of(): 값이 반드시 null이 아닌 경우 사용. null 값이 들어오면 NullPointerException을 발생시킴.
II.값이 없을 수도 있는 Optional 생성
Optional<String> optionalValue = Optional.ofNullable(null);
ofNullable(): 값이 null일 수도 있는 경우 사용. null이면 비어 있는 Optional 객체를 생성.
III.비어 있는 Optional 생성
Optional<String> emptyOptional = Optional.empty();
2.확인
I.값이 존재하는지 확인
optionalValue.isPresent(); // 값이 있으면 true
optionalValue.isEmpty(); // 값이 없으면 true (Java 11 이상)
II.값이 있을 때 동작 수행
optionalValue.ifPresent(value -> System.out.println("Value: " + value));
3.접근
I.값 가져오기
String value = optionalValue.get(); // 값이 없으면 NoSuchElementException 발생
II.기본값 제공
String value = optionalValue.orElse("Default Value"); // 값이 없으면 기본값 반환
III.지연계산을 통한 기본값 제공
String value = optionalValue.orElseGet(() -> "Computed Default Value");
IV.값이 없으면 예외 던지기
String value = optionalValue.orElseThrow(() -> new RuntimeException("No value present"));
4.변환 및 필터링
I.변환 (map)
//값을 변환하고, 변환 결과를 Optional로 감싸서 반환.
Optional<Integer> length = optionalValue.map(String::length);
II.변환 (flatMap)
// 중첩된 Optional을 반환하는 경우, 중첩 구조를 평평하게 만듦.
Optional<String> transformedValue = optionalValue
.flatMap(value -> Optional.of(value.toUpperCase()));
III.필터링
// 조건에 맞는 경우 Optional을 반환, 맞지 않으면 빈 Optional 반환.
Optional<String> filteredValue = optionalValue.filter(value -> value.startsWith("H"));
'언어 > Java' 카테고리의 다른 글
리플렉션 (Reflection) (1) | 2024.11.26 |
---|---|
ConcurrentHashMap (0) | 2024.11.23 |
자바 컴파일 과정 (2) | 2024.11.19 |
JAVA 자바 메모리 구조 (0) | 2024.11.18 |
알고리즘 문제풀이용 JAVA 문법 정리 (2) | 2024.11.13 |