티스토리 뷰

Java

Optional에 대해....

개발자-김씨 2020. 10. 22. 01:13
반응형

람다식이 일반화되면서 Optional을 사용한 코드를 많이 보게 됩니다.

Optional을 사용하지 않으면 왠지 투박해보이고 레거시한 개발자가 된거 같습니다. ?

 

 

1.  Optional은 기존의 null처리를 대체하기 위해 나온 것인가? 

자바 API에 보면 다음과 같이 나옵니다.

Optional is primarily intended for use as a method return type where there is a clear need to represent "no result,"......

"Optional은 주로 결과값 없음을 명확하게 표시할 필요가 있는 return 유형으로 사용하기 위한 것..."

즉, null이 리턴될 수도 있다는 것을 인지시키고 npe를 방지하기 위해 사용하는 것입니다. 

이것이 Optional의 주 목적입니다.

 

 

 

예를 들어

public String getUserAddr(int userSeq) { ...

라는 메소드를 호출해야 해서 아래와 같이 호출합니다.

String addr = 클래스.getUserAddr(10001);
String detailAddr = addr.substring(.....);

그랬더니 2번째 줄에서 NullPointerException이 발생했습니다.

그래서 getUserAddr의 메소드를 다시 보니 다음과 같은 주석이 있습니다.

/**
* Null을 리턴할 수도 있으니 조심하세요....
*/
public String getUserAddr(int userSeq) { ...

getUserAddr메소드에서 null이 리턴되었고 null.substring에서 NullpointerException이 발생하게 된 것입니다.

 

이런 경우 Optional을 사용하여 NPE를 예방할 수 있습니다.

/**
* Null 발생할 수 있어 Optional을 리턴합니다.
*/
public Optional<String> getUserAddr(int userSeq) { ...

이렇게 Optional로 리턴하게 되면 사용자는 싫으나 좋으나 null체크를 해야합니다.

Optional<String> addr = 클래스.getUserAddr(10001).;
if (addr.isPresent()) {
    detailAddr = addr.substring(.....);
}

 

당연히 null을 리턴하지 않는다면 굳이 Optional을 리턴할 필요는 없습니다.

 

 

- Optional.empty(), Optional.of(), Optional.ofNullable()  

   정적(static) 메소드들을 이용해 손쉽게 Optional 객체를 만들 수 있습니다.

 

- isPresent(), ifPresent(), get()

    메소드들을 이용해 조회 및 처리작업을 할수 있습니다.

 

 

 

 

 

2. Optional과 람다식(함수형 프로그래밍)

간혹 함수형 프로그래밍 혹은 가독성을 위해 Optional을 쓰는 사람도 있습니다.

String arg = null;
int num = 0;
if(arg != null){
    num = Integer.parseInt(arg);
} else {
    num = -1;
}
System.out.println(num);

이랬던 코드가

String arg = null;
int num = Optional.ofNullable(arg).map(Integer::parseInt).orElse(-1);
System.out.println(num);

이렇게 된다고 말입니다.

 

사실 이렇게 바꾸는 건

int num = 1;  대신

int num = new Integer(1);

이렇게 코딩하는 것과 별반 다를게 없습니다.

가독성 측명이나 불필요하게 객체를 생성하지 않으려면 위 방법 대신

String arg = null;
int num = arg != null ? Integer.parseInt(arg): -1;
System.out.println(num);

삼항연산자를 이용하는 편이 낫다고 생각합니다.

물론 "위의 예제는 너무 간단해서" 예외적인 케이스일 수도 있습니다.

만약 정말 Optional을 사용하여 이점이 있다면 사용하는게 맞다고 생각합니다.

 

 

만약 사용한다면 optional에 대해 자세히 알아보고 써야 할거 같습니다.

Optinal제대로 쓰기

이 포스팅을 읽고, 포스팅에 링크되어 있는 Optional 사용시 주의 사항 26가지도 한 번 보시길 추천합니다.

 

저희 회사에서도 orElse()를 잘못 사용하는 바람에 큰 장애가 났었더라는....

 

 

 

반응형

'Java' 카테고리의 다른 글

ClientSocketUtil 개선버전  (0) 2023.04.12
Socket Util 만들어 보기  (0) 2023.04.11
자바 동기화 처리 - volatile 와 synchronized  (1) 2020.11.25
synchronized 와 Double-checked locking  (0) 2020.11.20
ThreadPoolExecutor  (0) 2017.01.09
댓글