Java의 정석 - 옵셔널

원태연·2022년 5월 30일
0

Java의 정석

목록 보기
18/19
post-thumbnail

Optional

  • T타입 객체의 래퍼클래스

    public final class Optional<T> {
      private final T value; //T타입의 참조변수
      ...
    }

    T에는 모든 종류의 객체가 저장가능하다. 특히, null도 가능하다

null을 직접 다루는 것은 위험할 뿐더러 (NullPointerException), 항상 if (obj == null)과 같은 조건식을 통해 처리해주어야 하는데, null을 감쌀 수 있는 Optional객체로 감싸는 것이 하나의 해결책이 될 수 있다.

null이 될수 있는 객체는 Optional로 다루는 것이 권장된다.

Optional\ 객체 생성

String str = "abc";

//str을 옵셔널로 감싸기
Optional<String> optVal = Optional.of(str);

//null을 감싸는 경우엔 .ofNullable을 통해 다루기
Optional<String> optNullVal = Optional.ofNullable(null);

//생성 및 초기화시 다른 객체나 타입과 마찬가지로 null이 아닌 값으로 초기화
//Optional.empty()을 사용
Optional<String> optInitVal = Optional.empty();

Optional\ 값 가져오기

public static void play() {
  Optional<String> optValue_1 = Optional.of("Hello"); 
  Optional<String> optValue_2 = Optional.ofNullable(null); //null로 지정
  printMessage(optValue_1);
  printMessage(optValue_2);
}
private static void printMessage(Optional<String> optValue){
  String getValue = optValue.orElse("Is Empty"); //optValue가 null 이면 getValue = "Is Empty"
  System.out.println("getValue = " + getValue);
}
		


//getValue = Hello
//getValue = Is Empty
public static void play() {
        Optional<String> optValue_1 = Optional.of("Hello");
        Optional<String> optValue_2 = Optional.ofNullable(null);
        try {
            throwException(optValue_1);
            System.out.println("optValue_1 = PASS");
            throwException(optValue_2);
        } catch (Exception e) {
            System.out.println("optValue_2 = FAIL");

        }
}
  
private static void throwException(Optional<String> optValue) {
  optValue.orElseThrow(); //optValue가 null 이면 예외 발생
}

// optValue_1 = PASS
// optValue_2 = FAIL
public static void play() {
        Optional<String> optValue_1 = Optional.of("Hello");
        Optional<String> optValue_2 = Optional.ofNullable(null);
  			boolean isPresent_1 = optValue_1.isPresent(); //true
        boolean isPresent_2 = optValue_2.isPresent(); //false
}

OptionalInt, OptionalLong, OptionalDouble

특정 기본형에 대해 성능향상을 위해 존재하는 기본형 값을 감싸는 옵셔널 래퍼클래스

getAsInt(), getAsLong(), getAsDouble() 을 통해 가져옴

빈 Optional
OptionalInt a = OptionalInt.of(0);   //0 저장
OptionalInt b = OptionalInt.empty(); //0 저장

System.out.println(a.isPresent()); //true
System.out.println(b.isPresent()); //false
System.out.println(a.equals(b));   //false

.empty()를 통해 생성하면, 기본값 0이 저장되겠지만 실제로 0이라는 값을 저장한 것과는 다르다. isPresent()를 통해 구분할 수 있도록 하자

profile
앞으로 넘어지기

0개의 댓글