티스토리 뷰

Optional이란

java 8버전 이후 부터 java.util 패키지 내 Optional이라는  class를 제공한다.
용도는 java 비지니스 로직을 구현하며 많이 발생하는 NPE(NullPointException)을 방지하기 위함이다.

Optional 사용 시 발생하는 문제점

Optional get 종류에 따른 결과확인을 위한 소스코드

public static void main(String[] args) {
	System.out.println("case1 - Optional.get() 수행");
	Optional<String> case1 = Optional.of("case1 data");
	System.out.println("case1 " + case1.get());
	System.out.println("====================");
	System.out.println("case2 - Optional.get() 수행 (null인 경우)");
	Optional<String> case2 = Optional.ofNullable(null);
	if(case2.isPresent()){
		System.out.println(case2.get());
	} else {
		System.out.println("case2 null isPresent() 분기 처리");
	}

	System.out.println("====================");
	System.out.println("case3 - Optional.orElse() 수행 (null인 경우)");
	Optional<String> case3 = Optional.ofNullable(null);
	String  case3_rs = case3.orElse(callBase());
	System.out.println("case3 : " + case3_rs);
	System.out.println("====================");
	System.out.println("case4 - Optional.orElseGet() 수행 (null인 경우)");
	Optional<String> case4 = Optional.ofNullable(null);
	String case4_rs = case4.orElseGet(()->callBase());
	System.out.println("case4 : " + case4_rs);
	System.out.println("====================");

	System.out.println("case5 - Optional.orElse() 수행 ");
	Optional<String> case5 = Optional.ofNullable("case5 data");
	String case5_rs = case5.orElse(callBase());
	System.out.println("case5 : " + case5_rs);

	System.out.println("====================");
	System.out.println("case6 - Optional.orElseGet() 수행");
	Optional<String> case6 = Optional.ofNullable("case6 data");
	String case6_rs = case6.orElseGet(()->callBase());
	System.out.println("case6 : " + case6_rs);
}

//호출 테스트용도 메소드
public static String callBase(){
	System.out.println("callBase...");
	return "callBase";
}
실행결과	
case1 - Optional.get() 수행
case1 case1 data
====================
case2 - Optional.get() 수행 (null인 경우)
case2 null isPresent() 분기 처리
====================
case3 - Optional.orElse() 수행 (null인 경우)
callBase...
case3 : callBase
====================
case4 - Optional.orElseGet() 수행 (null인 경우)
callBase...
case4 : callBase
====================
case5 - Optional.orElse() 수행 
callBase...
case5 : case5 data
====================
case6 - Optional.orElseGet() 수행
case6 : case6 data
orElse()로 호출 시 의도하지 않은 로직이 추가적으로 발생하는 경우에 대하여 확인함.
case5의 경우 null이 아니기에 해당 객체를 가져오기만 하면 되지만 callBase 메소드가 실행이 되었다.
테스트 소스코드의 로직상 callBase 메소드가 로그를 출력하는 기능을 담당하지만 비지니스로직을 수행하여 데이터 변경을 수행하였다면 예상하지 않은 결과를 확인할 수 있을 것이다.

객체를 가져오는 주요 메소드

 

Optional.get()
Optional 내 객체가 null이 아닌 경우 객체 반환.
null인 경우 NoSuchElementException 발생.
 
Optional.orElseGet(()->methodA)
Optional 내 객체가 null인 경우에만 methodA가 동작후 값 반환.
null이 아닌 경우 methodA 미동작 Optional 내 객체 반환.
 
Optional.orElse(methodA)
Optional 내 객체가 null여부 상관없이 methodA가 동작
Optional 내 객체가 null인 경우 methodA의 결과값 반환.
null이 아닌 경우 Optional 내 객체 반환.

Optional Class 선언된 소스코드 확인
//Optional.class 일부

public T get() {
	if (value == null) {
		throw new NoSuchElementException("No value present");
	}
	return value;
}

public T orElseGet(Supplier<? extends T> other) {
	return value != null ? value : other.get();
}

public T orElse(T other) {
	return value != null ? value : other;
}
함수형 인터페이스 중 하나인 SupplierLazy Evaluation (지연연산) 할 수 있도록 지원한다.
따라서 Optional의 orElseGet() 사용시 불필요한 호출을 하지 않아 성능 향상 및 부하를 방지할 수 있다.
@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

java7 이전 버전에서의 Lazy Evaluation (지연연산) 예시
public static void main(String[] args) {
	if(method1() && method2()){
		System.out.println("end in if");
	}
    System.out.println("end main");
}

static boolean method1(){
	System.out.println("method1 cal...");
	return false;
}

static boolean method2(){
	System.out.println("method1 cal2...");
	return true;
}
실행결과	
method1 cal...
end main

실행결과를 확인해 보면 if문 내의 조건이 2개 이상이고 and 조건으로 이루어져 있는 경우 선행 조건에서 false로 결정이 되면 이후 조건은 수행하지 않고 다음 로직으로 흘러가는 것을 확인할 수 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함