null 대신 Optional 클래스

김진욱·2022년 11월 5일
0

java

목록 보기
10/13

NullPointerException

  • 실제 값을 가지고 있는 객체가 아닌 null을 객체를 호출할 때 발생하는 예외이다.
  • NullPointerException를 피하기 위해서는 Null 값이 들어갈 수 있는 객체를 미리 확인하여 처리를 해주는 것이다.
  • 자바 8부터는 java.util.Optional<T>라는 새로운 클래스를 제공하여 null 처리를 쉽게 할 수 있도록 도와준다.

Optional 클래스

Optional 클래스는 객체를 Optional이라는 클래스로 감싸주어 null인 객체를 빈 Optional 로 반환하여 NullPointerException에 대해 안전하도록 만들어 준다.

Optioncal 클래스의 메서드

메서드설명
empty빈 Optional 인스턴스 반환
filter값이 존재하여 프레디케이트와 일치하면 값을 포함하는 Optional 반환, 값이 없거나 프레디케이트와 일치하지 않으면 빈 Optional 반환
flatMap값이 존재하면 인수로 제공된 함수를 적용한 결과 Optional을 반환하고 값이 없으면 빈 Optional 반환
get값이 존재하면 Optional이 감싸고 있는 값을 반환, 값이 없으면 NoSuchElementException 발생
ifPresent값이 존재하면 지정된 Consumer를 실행, 값이 없으면 아무일도 일어나지 않음
ifPresentOrElse값이 존재하면 지정된 Consumer를 실행, 값이 없으면 아무일도 일어나지 않음
isPresent값이 존재하면 true를 반환, 값이 없으면 flase를 반환
map값이 존재하면 제공된 매핑 함수를 적용
of값이 존재하면 값을 감싸는 Optional를 반환, 값이 null이면 NullPointerException 발생
ofNuallalbe값이 존재하면 값을 감싸는 Optional를 반환, 갑싱 null이면 빈 Optional 반환
or값이 존재하면 같은 Optional을 반환, 값이 없으면 Supplier에서 만든 Optional을 반환
orElse값이 존재하면 값을 반환하고, 값이 없으면 기본 값을 반환
orElseGet값이 존재하면 값을 반환하고, 값이 없으면 Supplier에서 생성한 값을 반환
orElseThrow값이 존재하면 값을 반환, 값이 없으면 Supplier에서 생성한 예외 발생
stream값이 존재하면 존재하는 값을 포함하는 스트림을 반환, 값이 없으면 빈 스트림을 반환

orElse, orElseGet 의 차이점

getRandomName

public String getRandomName() {
    LOG.info("getRandomName() method - start");

    Random random = new Random();
    int index = random.nextInt(5);

    LOG.info("getRandomName() method - end");
    return names.get(index);
}

orElse()

String name = Optional.of("baeldung")
  .orElse(getRandomName());

이 이 경우 name의 값은 "baeldung"가 있어 null이 아니지만, 콘솔에는 아래와 같이 메세지가 출력된다.

getRandomName() method - start 
getRandomName() method - end

orElse()는 메소드를 인수로 받지 않고, 바로, 값을 인수로 받는다.

결국, orElse() 메소드 인수를 할당하기 위해 getRandomName() 메소드가 실행된 후 해당 결과 값을 orElse() 메소드 인수로 할당하기 때문에 Optional의 값과 상관 없이 메소드가 실행되게 되는 것이다.

orElseGet()

String name = Optional.of("baeldung")
  .orElseGet(() -> getRandomName());

orElseGet()은 getRandomName()메서드를 호출하지 않았다.

그 이유는 인수로 전달된 Supplier 메소드 경우 Optional의 값이 없을 때만 get()을 통해 실행** 되기 떄문이다.

orElse()

  • 값이 null인 경우에도 메서드를 실행해야 할 때 사용

orElseGet()

  • 값이 null인 경우에만 메서드를 실행해야 할 때

-> 메서드가 아닌 값을 넘겨야 할 경우에는 orElse()를 사용하면 된다.

[Java] Optional – orElse() vs orElseGet() 차이점 알고 쓰자. — 일단은 내 이야기

0개의 댓글

관련 채용 정보