본문 바로가기

프로그래밍/Java

java8 - Optional

Optional

Optional는 T타입의 객체를 감싸는 래퍼 클래스(Wrapper class)여서 optional타입의 객체는 모든 타입의 참조변수를 담을 수 있다.
최종 연산의 결과를 그냥 반환하지 않고 Optional객체에 담아 반환하여 반환된 결과가 null인지 체크하는 조건문 없이 null값으로 인해 발생하는 예외를 처리할 수 있다.

Optional 객체 생성

of()나 ofNullable()메서드를 사용하여 Optional객체를 생성할 수 있다.
참조 변수의 값이 null일 가능ㄴ성이 있으면, of()대신 ofNullable()을 사용하여 생성하는것이 좋습니다.
( of()메서드는 매개변수의 값이 null이면 NPE를 발생하기 때문)

Optional<String> val = Optional.of("abc");
Optional<String> val2 = Optional.of(null);  //NullPointerException 발생
Optional<String> val3 = Optional.ofNullable(null);  //ok

Optional 객체의 값 접근

get() 메서드를 사용하여 Optional객체에 저장된 값에 접근할 수 있다.
값이 null이면 NoSuchElementException이 발생하기 때문에 get()을 호출하기전에 isPresent()메서드를 사용하여 null인지 확인후에 호출하는것이 좋으며, 이를 대비하여 orElse()로 값을 대체할 수 있다.

Optional<String> opt = Optional.of("java");
System.out.println(opt.get());  //java
Optional<String> nullOpt = Optional.empty();
System.out.println(nullOpt.orElse("hello")); //hello

null 대신하는 값을 지정하는 메서드로 orElseGet(), orElseThrow()도 있다.

Optional<String> nullOpt = Optional.empty();
System.out.println(nullOpt.orElseGet(String::new));
System.out.println(nullOpt.orElseThrow(NullPointerException::new)); //null이면 예외 발생

기본 타입의 Optional 클래스

IntStream과 같은 기본 타입 스트림을 위한 Optional 클래스들이 있다. (OptionalInt, OptionalLong, OptionalDouble)
반환 타입이 Optional가 아니라는것을 제외하고 stream에 정의된 것과 비슷하다.

클래스 값을 반환하는 메서드
Optional T get()
OptionalInt int getAsInt()
OptionalLong long getAsLong()
OptionalDouble double getAsDouble()
IntStream stream = IntStream.of(1, 2, 3, 4);
OptionalInt result = stream.findFirst();
System.out.println(result.getAsInt());  //1

'프로그래밍 > Java' 카테고리의 다른 글

클래스  (0) 2020.12.18
java8 - time  (0) 2020.03.10
java8 변경사항 - 스트림API 최종연산  (0) 2020.02.07
Java8 변경사항 - 스트림API 중간연산  (0) 2020.02.07
Java8 변경사항 - 스트림API 특징과 생성  (0) 2020.02.01