T_era
[JAVA] Optional이란? 본문
Null에 대해 조금 알아보다 Optional이라는 컨테이너 클래스에 대해 알게되어 찾아봤다
Optional은 Java 8에서 도입된 컨테이너 클래스
Null의 가능성이 있는 상황에서 명시적으로 표시하기 위해 사용
이전에는 그냥 Null을 사용해 표기했지만 NullPointerException등의 예외발생의 원인이 되곤 했다
그래서 사용하게된 것이 Optional이다. Null관련 문제를 해결하고 더 안전한 코드 작성을 돕는 클래스
Optional의 주요 목적:
- null 가능성이 있는 값을 명시적으로 표현: 변수가 null일 수 있다는 것을 코드 상에서 명확하게 드러내어 개발자가 주의하도록 유도.
- NullPointerException 방지: null 체크를 명시적으로 수행하도록 강제하여 예기치 않은 NullPointerException 발생 가능성을 낮춤.
- 더욱 표현력 있는 API 설계: 값이 없을 때 수행할 동작을 간결하고 명확하게 정의할 수 있도록 다양한 메서드를 제공.
Optional의 사용 방법:
객체 생성
Optional<String> emptyOptional = Optional.empty();
객체에 값 삽입(name이 만약 null이라면 예외발생)
String name = "John Doe";
Optional<String> nameOptional = Optional.of(name);
값이 존재할 수도 있고 null일 수도 있는 경우에 사용해. value가 null이면 Optional.empty()를 반환하고, 그렇지 않으면 해당 값을 감싸는 Optional 객체를 반환
String nullableName = null;
Optional<String> nullableNameOptional = Optional.ofNullable(nullableName); // Optional.empty()
이외에도
isPresent(): Optional 객체에 값이 존재하는지 여부를 boolean 값으로 반환.
get(): Optional 객체에 저장된 값을 반환.
주의: 값이 없는 Optional 객체에서 get()을 호출하면 NoSuchElementException이 발생하므로, isPresent()로 먼저 확인하거나 다른 안전한 메서드를 사용하는 것을 추천
orElse(other): Optional 객체에 값이 없으면 other에 지정된 기본값을 반환.
orElseGet(supplier): Optional 객체에 값이 없으면 Supplier 함수형 인터페이스를 통해 생성된 값을 반환. orElse()와 달리 값이 없을 때만 Supplier가 실행되므로, 기본값 생성 비용이 큰 경우에 유용
orElseThrow(exceptionSupplier): Optional 객체에 값이 없으면 Supplier 함수형 인터페이스를 통해 생성된 예외를 던져. 값이 없는 상황을 예외로 처리해야 할 때 유용
ifPresent(consumer): Optional 객체에 값이 있으면 Consumer 함수형 인터페이스를 통해 해당 값을 처리. 값이 없으면 아무 동작도 수행하지 않음.
map(function): Optional 객체에 값이 있으면 주어진 Function 함수형 인터페이스를 적용한 새로운 Optional 객체를 반환. 값이 없으면 Optional.empty()를 반환. Optional 안에 있는 값을 변환할 때 유용
flatMap(function): map()과 유사하지만, Function이 Optional을 반환하는 경우에 사용. flatMap()은 중첩된 Optional을 하나의 Optional로 평탄화(flatten)해준다
filter(predicate): Optional 객체에 값이 있고, 주어진 Predicate 함수형 인터페이스의 조건을 만족하면 원래의 Optional 객체를 반환하고, 그렇지 않거나 값이 없으면 Optional.empty()를 반환
Optional 사용 시 주의사항:
- 기본 타입 (primitive type)에 대한 Optional: OptionalInt, OptionalLong, OptionalDouble과 같은 기본 타입 전용 Optional 클래스를 사용하는 것이 박싱/언박싱 오버헤드를 줄이는 데 도움이 된다.
- 필드로서의 Optional 남용 지양: 클래스의 필드를 Optional로 선언하는 것은 직렬화 문제나 불필요한 객체 생성을 야기할 수 있으므로 신중하게 결정.
- 컬렉션과의 Optional: Optional을 컬렉션에 담는 것은 일반적으로 권장되지 않아. 빈 컬렉션 자체가 "값이 없음"을 나타낼 수 있기 때문.
- 성능 고려: Optional 객체 생성은 약간의 오버헤드를 발생시킬 수 있으므로, 성능에 민감한 상황에서는 신중하게 사용
'Programing > Java' 카테고리의 다른 글
| JavaDoc 주석이란? (0) | 2025.05.13 |
|---|---|
| [JAVA] 제너릭의 타입보장 (0) | 2025.04.18 |
| [JAVA] 문법정리 - 2 (0) | 2025.04.15 |
| [JAVA] 문법정리 (0) | 2025.04.15 |
| [JAVA] Map에 객체를 value로 하기 위한 메서드 (0) | 2025.04.14 |