Java, Optional을 써야하는 이유와 사용법

skyju·2023년 5월 22일
0

Java

목록 보기
1/1

java 개발자들의 숙적 NPE(Null pointer Exception)

java 8 이상에서 제공해주는 Optional은 NPE를 효과적으로 다룰 수 있게 도와준다.

그러나 Optional은 올바른 사용법을 숙지 하지 못하면 안쓰니만 못하다.

Optional을 만든 의도는 아래에서 살펴볼 수 있다.
https://stackoverflow.com/questions/26327957/should-java-8-getters-return-optional-type/26328555#26328555
개발자가 기대하는 범용적인 Maybe type이 아니다.
변환할 결과값이 없음을 명백하게 표현할 필요가 있는 곳에서 제한적으로 사용할 수 있는 메커니즘을 제공한다.

... 주의사항도 26가지나 된다.

isPresent() ㄴㄴ

대신

  • orElse()
  • orElseGet()
  • orElseThrow()
    를 사용하자.

orElse(new Ojbect()) 대신 orElseGet(() -> new Object())

orElse(...)에서 ...는 Optional에 값이 있든 없든 무조건 실행된다. 따라서 ...가 새로운 객체를 생성하거나 새로운 연산을 수행하는 경우에는 orElse() 대신 orElseGet()을 써야한다
Optional에 값이 없으면 orElse()의 인자로서 실행된 값이 반환되므로 실행한 의미가 있지만, Optional에 값이 있으면 orElse()의 인자로서 실행된 값이 무시되고 버려진다. 따라서 orElse(...)는 ...가 새 객체 생성이나 새로운 연산을 유발하지 않고 이미 생성되었거나 이미 계산된 값일 때만 사용해야 한다.

Collections 의 경우 굳이 Optional로 감쌀 필요 없다.

컬렉션은 비어있는 컬렉션을 발환하는 것이 좋을 떄가 종종 있다. 따라서 Optional로 감쌀 필요없이 비어있는 컬렉션을 반환하자.

그밖에 하지 말아야 할 사항

  • 필드로 사용 (목적에 안맞고 직렬화가 구현되어 있지 않음)
  • 생성자나 메서드 인자로 사용, 호출되는 쪽에서 항상 null체크를 하는 것이 좋음
  • 컬렉션의 원소로 사용 금지 - 원소를 꺼낼 때 null체크 하는 것이 좋다. 특히 Map의 경우 null체크를 포함한 메서드를 제공한다.

of(), ofNullable() 주의

of()은 null이 아님이 확실할 때만 사용해야 한다.
X가 null이면 NPE가 발생한다.

ofNullable(X)은 null일 수도 있을 때 사용한다.
null이 아님이 확실하면 of()를 사용해야 한다.

profile
https://github.com/skyju

0개의 댓글