리루

Java8 - Optional 본문

# Study/JAVA

Java8 - Optional

뚱보리루 2020. 7. 5. 12:24

 - 비어있을 수 있고, 어떤 값을 갖고 있을 수 있는 컨테이너 인스턴스 

 - null 체크를 하지 않으면 Null Pointer Exception이라는 문제가 발생 할 경우가 잦아질 수 있다.

 - 매번 Null check 할 수 없고 Human error가 있을 수 있다.

 - Null을 반환할 수 있는 상황 자체도 문제다.

 

 방법 1. 

 - null이 반환될 수 있는 코드에서 미리 null check를 해서 client 코드에 편의를 제공할 수 있다. 하지만 로직상 자꾸 exception 처리를 넣는건 좋은 습관이 아니다.

 

 방법 2.

 - null을 그냥 반환하고 client 코드에서 null check를 한다. 

 

- 리턴 값으로만 Optional로 사용하길 권장된다. (매개변수 등으로 사용가능하지만 호출하는 쪽에서 Optional 타칩이지만 null을 넘겨 줄 수 있으므로 이는 NPE가 발생할 수 있는 위험한 방식이다.)

public void optionalParameter(Optional<Param> param){

}

optionalParameter(null);

 

 - 맵의 키 타입으로 Optional을 사용하면 안된다. Map의 큰 컨셉 중 하나는 key 값이 null이 아닌 것인데 Optional을 키로 사용했을 경우에 키가 있을 수도, 없을 수도 있다는 것 자체가 문제가 될 수 있다.

 

 - 인스턴스 필드타입으로도 사용하지 말자. 어떠한 클래스의 필드가 있을 수도 있고, 없을 수도 있다라는 도메인 클레스 설계는 좋지 못하다.

 - 컨테이너 성 데이터 타입 (Collection, Map, Stream, Array,Optional)은 이미 자체적으로 비어있는지 여부에 대해서 확인 할 수 있으니 Optional로 한번 더 작업 할 필요가 없다.

 

 

검사 및 값 가져오기

 - isPresent()로 있는지 없는지 확인 가능.

 - Java11 부터는 isEmpty() 도 제공.

 - get() 을 통해서 값을 가져 올 수 있다.( 값이 들어있을 때는 문제가 없지만 값이 안들어 있으면 NoSuchElementException 발생)

 - get() 호출 전에 해당 값이 있는지 확인 필요.

 - 값이 있을 때의 처리는 ifPresent() 를 사용해 처리하면 추가적인 값 확인 없이 사용할 수 있다.

 - 값을 가져올 때는 orElse()를 사용해서 있으면 값을 꺼내오고, 없으면 새로운 클래스를 만드는 메소드 호출 등의 방법을 사용

 - orElseGet(Supplier) 를 사용할 수 도 있는데 이 둘의 차이는 orElse의 경우에는 참이든 거짓이든 parameter 속의 내용을 수행하지만 orElseGet의 경우에는 Else인 케이스에만 Supplier를 수행하게 된다. orElse 같은 경우에는 상수같이 이미 만들어진 작업에 대해서는 사용하는 것이 적절하고, 동적으로 무엇을 만들어야 하는 상황에서는 orElseGet이 더 적절할 수 있다.

 - 중복 Optional일 경우에는 flatMap을 통해서 한번에 까버릴 수 있다.

// 양파까기
Optional<Optional<Day>> day = optional.map(Date::getDay);
Optional<Day> day2 = day1.orElse(Optional.empty());

// flatMap 사용
Optional<Day> test = optional.flatMap(Date::getDay); 

 

'# Study > JAVA' 카테고리의 다른 글

Steam  (0) 2020.07.05
Java8 함수형 인터페이스  (0) 2020.07.04
[퍼온글]Volatile 변수  (0) 2017.03.31
[퍼온글]Servlet이란?  (0) 2017.03.31