Optional 문법은 java 개발자의 NullPointerException을 방지 해주기 위한 문법입니다.
Optional 문법에 대해서 알아보겠습니다.
Optional 생성 (of, ofNullable, empty)
Optional.of는 값이 있는 상태에서 Optional을 객체로 감싸기 위해 사용됩니다.
만약 값이 null인 경우 NullPointExcetion을 발생합니다.
Optional<String> value = Optional.of("value");
Optional<String> nullValue = Optional.of(null); // NullPointExcetion 발생
Optional.ofNullable은 값이 null인 경우도 있을 경우 사용할 수 있습니다.
Optional<String> value = Optional.ofNullable("value");
Optional<String> nullValue = Optional.ofNullable(null);
System.out.println(nullValue.get()); // NoSuchElementException 발생
Optional.empty는 빈 값으로 객체를 생성합니다.
Optional<String> emptyValue = Optional.empty();
System.out.println(emptyValue.get()); // NoSuchElementException 발생
Optional 값 확인(isPresent, isEmpty)
isPresent는 안에 값이 있으면 true, null이면 false로 리턴해줍니다.
System.out.println(nullValue.isPresent()); // false 출력
System.out.println(value.isPresent()); // true 출력
isEmpty는 안에 값이 없으면 true, null이면 false로 리턴해줍니다.
자바 11부터 이용가능합니다.
System.out.println(nullValue.isEmpty()); // true 출력
System.out.println(value.isEmpty()); // false 출력
Optional 값이 있으면 동작 수행(ifPresent, ifPresentOrElse)
ifPresent는 값이 있으면 파라미터로 받은 람다식을 실행합니다.
value.ifPresent(val -> System.out.println("값있다")); // 값있다 출력
nullValue.ifPresent(val -> System.out.println("값있다")); // 값있다 출력
ifPresentOrElse는 값이 있으면 1번째 파라미터를 수행, 없으면 2번째 파라미터(Runnable 타입)를 수행합니다.
자바 9부터 수행가능합니다.
// 값있다 출력
value.ifPresentOrElse(val -> System.out.println("값있다"),
() -> System.out.println("없다."));
// 값없다 출력
nullValue.ifPresentOrElse(val -> System.out.println("값있다"),
() -> System.out.println("값없다."));
Optional 값이 없을 때 다른 값을 사용하기(orElse, orElseGet, or)
orElse는 Optional에 값이 없는 경우 다른 값을 전달해주기 위해 사용합니다.
주의할 점은 함수를 파라미터에 넣을 경우 값의 유무와 상관없이 함수를 실행하기 때문에 값을 적어줄 경우 사용하고 함수를 실행해야하는 orElseGet을 사용해야합니다.
System.out.println(nullValue.orElse("값없다")); // 값없다 출력
System.out.println(value.orElse("값없다")); // value 출력
System.out.println(value.orElse(getMember()));
// 회원 출력
// value 출력
public static String getMember(){
System.out.println("회원");
return "회원";
}
orElseGet은 Optional에 값이 없는 경우 람다식에 있는 결과 값을 전달합니다.
System.out.println(nullValue.orElseGet(()->"값없다")); // 값없다 출력
System.out.println(value.orElseGet(()->"값없다"));// value 출력
or은 Optional 값을 리턴해주기 위해 사용합니다.
자바 9버전부터 사용 가능합니다.
System.out.println(value.or(()->Optional.of("값없다")));// Optional[value]
System.out.println(nullValue.or(()->Optional.of("값없다")));// Optional[값없다]
Optional 값이 없으면 예외발생(orElseThrow)
orElseThrow는 값이 없으면 예외를 발생시킵니다.
System.out.println(value.orElseThrow(()->new RuntimeException())); // value 출력
System.out.println(nullValue.orElseThrow(()->new RuntimeException())); // RuntimeException 발생
Optional을 변환할 때 사용(map, flatMap)
map은 받은 값이 있으면 변환해주고 값이 Optional로 리턴해주고 없으면 빈 Optional로 리턴합니다.
System.out.println(value.map(val-> val + " 값있다")); // Optional[value 값있다] 출력
System.out.println(nullValue.map(val-> val + " 값없다")); // Optional.empty 출력
flatMap은 동작은 map과 비슷하지만 내부에 Optional 값이 있으면 평면화하여 Optional로 리턴합니다.
System.out.println(value.flatMap(val->Optional.of(val+"값있다"))); //Optional[value값있다] 출력
System.out.println(nullValue.flatMap(val->Optional.of(val+"값없다"))); // Optional.empty 출력
map과 flatMap 결과 비교
System.out.println(value.flatMap(val->Optional.of(val+"값있다"))); //Optional[value값있다] 출력
System.out.println(value.map(val->Optional.of(val+"값있다"))); // Optional[Optional[value값있다]] 출력
Optional에서 필터링을 사용할 때(filter)
filter는 Optional 객체를 조건을 추가하여 true일 경우 해당 값을 리턴 아니면 빈 값을 리턴합니다.
System.out.println(value.filter(val -> val.length() > 5)); // Optional.empty 출력
System.out.println(value.filter(val -> val.length() > 1)); // Optional[value] 출력
Optional 함수를 조합하여 사용하기
public String getCardNoByMember(Member member) {
if(null == member){
return "없음";
}
Company company = member.getCompany();
if(null == company){
return "없음";
}
Card card = company.getCard();
if(null == card){
return "없음";
}
return card.getNo();
}
이런 코드가 있다면 Optional을 이용하면 더 간결해집니다.
public String getCardNoByMemberOpt(Member member) {
return Optional.ofNullable(member)
.map(mem -> mem.getCompany())
.map(company -> company.getCard())
.map(card-> card.getNo())
.orElse("없음");
}
다양한 조합이 가능하여 익숙해 진다면 더 간결한 코드를 작성할 수 있습니다.
'Java' 카테고리의 다른 글
PDFBox 실무 적용기 - 좌표계 꼬임 문제와 래퍼 설계 (0) | 2025.08.24 |
---|---|
[Java] Stream 생성하는 방법들 (0) | 2025.05.06 |