본문 바로가기
JAVA

[JAVA] Optional의 개념과 사용법, 주의할 점

by 정공자씨 2024. 5. 1.

 

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)을 념겨주면 됨

 

 

 

 

 

 

 

 

출처

 

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

자바8 Optional 2부: null을 대하는 새로운 방법

Engineering Blog by Dale Seo

www.daleseo.com

 

[Java] Optional이란? Optional 개념 및 사용법 - (1/2)

이번에는 Java8부터 지원하는 Optional 클래스에 대해 알아보도록 하겠습니다. 1. Optional이란? Optional 개념 및 사용법 [ NPE(NullPointerException) 이란? ] 개발을 할 때 가장 많이 발생하는 예외 중 하나가 바

mangkyu.tistory.com

 

null보다는 Optional이나 빈 컬렉션을 반환

* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다. 43. null보다는 빈 배열이나 컬렉션을 반환하라 빈 배열이나 컬렉션을 반환하는 대신 null을 반환하는 메서드를 사용하게 되면 오

sedangdang.tistory.com