개요

자바 8 부터는 널 값에 대해서 직접적으로 다루지 않고 간접적으로 null 을 처리할 수 있도록 Optional 객체를 제공해주고 있다. Optional 객체에 대한 상세한 설명은 바로 아래의 링크에서 자세히 설명되어 있고 내가 오늘 알아보려고 하는 것은 orElse() 메소드와 orElseGet() 메소드에 대해서 알아보려고 한다.

 

옵셔널 객체에 대한 개괄적인 설명.

글쓴이 분이 매우 친절하게 설명해주고 있다.

 

자바 8 Optional 1부

자바 8 Optional 2부

 

시나리오 1

  • username 에 "홍길동" 이라는 글자를 입력한다.
  • orElse() 메소드를 통해서 해당 값이 null 이면 메소드 내에 있는 스트링 값을 삽입한다.
  • orElseGet() 메소드를 통해서 해당 값이 null 이면 메소드 내에 있는 스트링 값을 삽입한다.
String username = "홍길동";

String testNameOnOrElse = Optional.ofNullable(username)
										.orElse("고길동");

String testNameOnOrElseGet = Optional.ofNullable(username)
										.orElseGet(() -> "고길동");

// username : 홍길동
// testNameOnOrElse : 홍길동
// testNameOnOrElseGet : 홍길동

예상되는 값이 도출된다. username 에 "홍길동" 이라는 이름이 명시되어 있기 때문이다. 

 

 

시나리오 2

  • username 에 null 값이 들어간다.
  • orElse() 와 orElseGet() 은 시나리오 1 과 동일하게 수행된다.
String username = null;

String testNameOnOrElse = Optional.ofNullable(username)
										.orElse("고길동");

String testNameOnOrElseGet = Optional.ofNullable(username)
										.orElseGet(() -> "고길동");

// username : null
// testNameOnOrElse : 고길동
// testNameOnOrElseGet : 고길동

username 이 널 값이기 때문에 그에 따라 orElse** 메소드에 있는 "고길동" 이라는 값을 삽입해준다.

 

 

시나리오 3

  • username 에 "홍길동" 값이 들어간다.
  • orElse() 와 orElseGet() 내부에는 메소드가 있으며 해당 메소드는 string 을 리턴타입으로 가진다. 그리고 리턴은 항상 "고길동" 이다.
public class DemoApplication {

    public static void main(String[] args) {

        String username = "홍길동";

        String testNameOnOrElse = Optional.ofNullable(username)
        										.orElse(returningName("orElse"));

        String testNameOnOrElseGet = Optional.ofNullable(username)
        										.orElseGet(() -> returningName("orElseGet"));

        // username : 홍길동
        // testNameOnOrElse : 홍길동
        // testNameOnOrElseGet : 홍길동
    }

    public static String returningName(String methodName) {

        System.out.println("호출 메소드 명 :: " + methodName);

        return "고길동";
    }
}

여기서 콘솔창을 확인하면 orElse() 메소드는 returningName 메소드를 호출한다. 반면에 orElseGet() 메소드는 호출하지 않는다. 실제로 값이 비어있는 경우에 orElseGet() 은 메소드를 호출하기 때문에 orElse 보다 LAZY 하다. 별 거 아닌 내용이긴 한데, orElse 보다 orElseGet 이 좀 더 널 값에 대해서 융통성있게 처리하는 것을 알 수 있었다.

Posted by doubler
,