티스토리 뷰
Java 8에서 지원하는 Optional를 사용하면 NullPointerException에 대한 방어코드를 functional하게 처리할 수 있습니다. Optional 내부 객체가 null 일 때 기본 값을 반환하기 위해 orElse()와 orElseGet()를 사용할 수 있습니다. Optional이 생기기 이전에는 다음과 유사한 코드를 작성했을 것 입니다.
public void method(Object o) {
if (o == null) {
// null value handling
}
// to do something
}
이제 예시를 통해 두 메서드가 어떻게 동작하는지 살펴보겠습니다.
Optional.orElse()
private static String wontRunThis() {
System.out.println("Won't run this");
return "foo";
}
public void optional1() {
String o = Optional.of("Hello World!").orElse(wontRunThis());
System.out.println("Result : " + o);
}
Result
Won't run this
Result : Hello World!
Optional.orElseGet()
public void optional2() {
String o = Optional.of("Hello World!").orElseGet(() -> wontRunThis());
System.out.println("Result : " + o);
}
Result
Result : Hello World!
결과에서 확인할 수 있듯이 두 메서드 모두 내부 객체가 null이 아니기 때문에 foo는 반환하지 않고 Hello World!를 반환합니다. 하지만 orElse()는 Optional 내부 객체의 상태와 상관없이 무조건 실행되어 Won't run this를 출력하며, orElseGet()은 내부 객체가 null인 경우에만 실행됩니다. 그 이유는 orElse()의 인자로 T other를 받기 때문입니다. 때문에 예상치 못한 사이드 이펙트가 생길 수 있으므로, 상황에 맞는 알맞은 선택이 필요합니다.
'프로그래밍 > Java' 카테고리의 다른 글
| [이펙티브 자바] 규칙46. for 문보다는 for-each 문을 사용하라 (0) | 2018.01.06 |
|---|---|
| [이펙티브 자바] 규칙45. 지역 변수의 유효범위를 최소화하라 (0) | 2018.01.06 |
| [이펙티브 자바] 규칙27. 가능하면 제네릭 메서드로 만들 것 (0) | 2017.11.28 |
| [이펙티브 자바] 규칙26. 가능하면 제네릭 자료형으로 만들 것 (0) | 2017.11.28 |
| [이펙티브 자바] 규칙25. 배열 대신 리스트를 써라 (0) | 2017.11.28 |
댓글
Copyright ⓒ 2018 moneystory.blog. All rights reserved.
