반응형
Optional Class란?
자바에서 null 값은 런타임에서 예외를 발생시킬 수 있는 원인 중 하나입니다.
이를 해결하기 위해 Java 8에서는 Optional 클래스가 도입되었습니다.
Optional 클래스는 null 값을 감싸고 있는 래퍼 클래스로, null 값을 명시적으로 다룰 수 있게 합니다.
이를 통해 코드의 가독성과 안정성을 높일 수 있습니다.
Optional 메서드
우선, Optional 객체를 생성할 때는 of(), ofNullable() 또는 empty() 메서드를 활용합니다.
- of() 메서드는 null이 아닌 값을 감싸는 Optional 객체를 생성하며,
- ofNullable() 메서드는 null 값을 감싸는 Optional 객체를 생성합니다.
- empty() 메서드는 비어있는 Optional 객체를 생성합니다.
Optional 객체를 다룰 때는 isPresent() 메서드를 활용하여 값이 존재하는지 확인합니다.
값이 존재하는 경우 true를 반환하고, 그렇지 않은 경우 false를 반환합니다.
get() 메서드는 Optional 객체에 저장된 값을 반환합니다.
값이 존재하지 않는 경우 NoSuchElementException이 발생합니다.
Optional 객체를 다루는 다른 메서드로는 orElse(), orElseGet(), orElseThrow() 메서드가 있습니다.
- orElse() 메서드는 Optional 객체가 비어있는 경우 기본값을 반환합니다.
- orElseGet() 메서드는 비어있는 경우 콜백 함수를 실행하여 값을 반환합니다.
- orElseThrow() 메서드는 비어있는 경우 예외를 발생시킵니다.
Optional 객체를 다룰 때 유용한 메서드로는 filter(), map(), flatMap() 등이 있습니다.
- filter() 메서드는 Optional 객체에 저장된 값이 주어진 조건에 맞는 경우에만 Optional 객체를 반환합니다.
- map() 메서드는 Optional 객체에 저장된 값을 변환합니다.
- flatMap() 메서드는 Optional 객체에 저장된 값을 다른 Optional 객체로 변환합니다.
import java.util.Optional;
public class OptionalCode {
public Optional<String> getNameById(int id) {
// id에 해당하는 이름이 있다면 Optional로 감싸서 반환합니다.
// 없다면 빈 Optional 객체를 반환합니다.
if (id == 1) {
return Optional.of("John");
} else if (id == 2) {
return Optional.of("Mary");
} else {
return Optional.empty();
}
}
public static void main(String[] args) {
OptionalCode example = new OptionalCode();
// getNameById() 메서드를 호출하여 Optional 객체를 반환받습니다.
Optional<String> nameOptional = example.getNameById(1);
// isPresent() 메서드를 사용하여 값이 존재하는지 확인합니다.
if (nameOptional.isPresent()) {
// get() 메서드를 사용하여 Optional 객체에 저장된 값을 반환합니다.
String name = nameOptional.get();
System.out.println("Name: " + name);
} else {
System.out.println("Name not found");
}
// orElse() 메서드를 사용하여 기본값을 반환받습니다.
String defaultName = nameOptional.orElse("Unknown");
System.out.println("Default name: " + defaultName);
// orElseGet() 메서드를 사용하여 콜백 함수를 실행하여 값을 반환받습니다.
String nameFromCallback = nameOptional.orElseGet(() -> {
System.out.println("Callback function called");
return "Unknown";
});
System.out.println("Name from callback: " + nameFromCallback);
// filter() 메서드를 사용하여 조건에 맞는 값을 반환받습니다.
Optional<String> filteredOptional = nameOptional.filter(name -> name.length() > 3);
if (filteredOptional.isPresent()) {
String filteredName = filteredOptional.get();
System.out.println("Filtered name: " + filteredName);
} else {
System.out.println("Filtered name not found");
}
// map() 메서드를 사용하여 Optional 객체에 저장된 값을 변환합니다.
Optional<Integer> lengthOptional = nameOptional.map(name -> name.length());
if (lengthOptional.isPresent()) {
Integer length = lengthOptional.get();
System.out.println("Name length: " + length);
} else {
System.out.println("Name length not found");
}
// flatMap() 메서드를 사용하여 Optional 객체에 저장된 값을 다른 Optional 객체로 변환합니다.
Optional<String> flatMappedOptional = nameOptional.flatMap(name -> Optional.of(name.toUpperCase()));
if (flatMappedOptional.isPresent()) {
String flatMappedName = flatMappedOptional.get();
System.out.println("Flat mapped name: " + flatMappedName);
} else {
System.out.println("Flat mapped name not found");
}
}
}
Optional 단점
- Optional 클래스를 남용하면 코드의 가독성을 떨어뜨릴 수 있습니다.
- Optional 객체를 사용하면서도 항상 코드의 가독성과 유지보수성을 고려해야 합니다.
- Optional 클래스를 단순히 null 처리만을 위해 남용하지 않도록 주의해야 합니다.
반응형
'Java > Java' 카테고리의 다른 글
[Java] JDK 환경변수 설정 방법 및 이유 (0) | 2023.07.27 |
---|---|
Java 깊은 복사(Deep Copy) 와 얕은 복사( Shallow Copy) (0) | 2023.02.01 |
Java _ 래퍼 클래스(Wrapper Class) (0) | 2023.01.29 |
Java StringBuilder vs StringBuffer /Thread (0) | 2023.01.21 |
Java Thread (0) | 2023.01.21 |