1. Optional

  1. [설명]

    1. Class를 사용해 NPE를 방지할 수 있도록 도움을 줍니다
    2. Optional<T>는 null이 올 수 있는 값을 감싸는 Wrapper Class로 참조하더라도 NPE가 발생하지 않도록 도와줍니다
    3. Optional Class는 value에 값을 저장하기 때문에 값이 null이라도 바로 NPE가 발생하지 않으며, Class이기 때문에 각종 메서드를 제공해줍니다
  2. [Optional객체의 생성]

    1. of() 메서드나 ofNullable()메서드를 사용하여 Optional 객체를 생성할 수 있습니다

    2. of() : null이 아닌 명시된 값을 가지는 Optional 객체를 반환합니다

    3. Optional 객체에 null이 저장되면 NullPointerException 예외가 발생합니다

    4. [예제]

      Optional<String> opt = Optional.ofNullable("Optional object");
      
      System.out.println(opt.get());
      
  3. [Optional객체에 접근]

    1. get() : Optional객체에 저장된 값에 접근 할 수 있습니다

    2. get()메서드 호출하기 전에 메서드를 사용하여 Optional객체에 저장된 값이 null인지 아닌지 먼저 확인한 후 호출하는 것을 말합니다

    3. [예제]

      Optional<String> opt = Optional.ofNullable("Optional object");
      
      if(opt.isPresent()) {
          System.out.println(opt.get());
      }
      
    4. orElse() : 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환하라는 의미입니다

    5. orElseget() : 저장된 값이 존재하면 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 람다 표현식의 결과값을 반환하라는 의미입니다

    6. orElseThrow() : 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시켜라는 의미입니다

    7. [예제]

      Optional<String> opt = Optional.empty(); // Optional를 null로 초기화함.
      
      System.out.println(opt.orElse("빈 Optional object"));
      
      System.out.println(opt.orElseGet(String::new));
      
    8. empty() : Optional객체를 null로 초기화 시켜줍니다

  4. [기본 타입의 Optional 클래스]

    1. [설명]
      1. IntStream 클래스와 같이 기본 타입 스트림을 위한 별도의 Optional 클래스를 제공하고 있습니다
    2. [3가지 종류]
      1. Optional 클래스[기본]
        1. Class
          1. Optional<T>
        2. Method[저장된 값에 접근]
          1. T get()
      2. OptionalInt 클래스
        1. Class
          1. OptionalInt
        2. Method[저장된 값에 접근]
          1. int getAsInt()
      3. OptionalLong 클래스
        1. Class
          1. OptionalLong
        2. Method[저장된 값에 접근]
          1. long getAsLong()
      4. OptionalDouble 클래스
        1. Class
          1. OptionalDouble
        2. Method[저장된 값에 접근]
          1. double getAsDouble()
  5. [Optional 메소드]

    1. static <T> Optional<T> empty()
      1. 아무런 값도 가지지 않는 비어있는 Optional 객체를 반환합니다
    2. T get()
      1. Optional 객체에 저장된 값을 반환합니다
    3. boolean isPresent()
      1. 저장된 값이 존재하면 true를 반환하고, 값이 존재하지 않으면 false를 반환합니다
    4. static <T> Optional<T> of(T value)
      1. null이 아닌 명시된 값을 가지는 Optional 객체를 반환합니다
    5. static <T> Optional<T> ofNullable(T value)
      1. 명시된 값이 null이 아니면 명시된 값을 가지는 Optional 객체를 반환하며, 명시된 값이 null이면 비어있는 Optional 객체를 반환합니다
    6. T orElse(T other)
      1. 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환합니다
    7. T orElseGet(Supplier<? extends T> other)
      1. 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 람다 표현식의 결괏값을 반환합니다
    8. <X extends Throwable> T orElseThrow(Supplier<? extends X>  exceptionSupplier)
      1. 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시킵니다

2. NPE(NullPointerException)

  1. [설명]
    1. 가장 많이 발생하는 예외 중 하나가 바로 NPE인데 null여부를 검사를 해야하는데, null검사를 해야하는 변수가 많은 경우 코드가 복잡해지고 번거롭습니다
    2. null대신 초기값을 사용하길 권장하기도 합니다