Java 8 (3) - Optional<T> / LocalDateTime

김정욱·2021년 6월 13일
0

Java

목록 보기
11/13
post-thumbnail

Optional

[ 개념 ]

  • 객체를 포장해주는 일종의 래퍼 클래스(Wrapper class)
  • 예상하지 못한 NullPointerException(NPE)를 예방할 수 있음
  • 복잡한 조건문 없이널(null) 값으로 인해 발생하는 예외처리할 수 있음

[ 특징 ]

값을 제대로 반환할 수 없는 경우 선택하는 방법

  • 예외 발생
    • 예외가 발생하면 스택 트레이스를 찍게되는 과정이 수행되어 리소스가 소요
  • null 리턴
    • 해당 코드를 사용하는 클라이언트 코드에서 주의해야 한다
  • Optional 사용 (java 8 부터 가능)
    • 클라이언트 코드에게 명시적으로 빈 값일수도 있다는 것을 알려주고, 빈 값인 경우쉽게 처리

주의 할 점

  • 반환 값(리턴 값)으로만 쓰기를 권장
    • 메소드 매개변수 타입으로 사용
      • 파라미터로 사용하면 결국 그 값의 여부를 확인하기 위한 코드가 추가
      • 진짜 null값을 입력했을 때 값의 여부를 확인하기 위한 코드에서 조차 NPE가 발생
    • 맵의 키 타입으로 사용
      • Map의 Key는 기본적으로 Null값일 수 없기 때문Optional로 사용하면 안됨
    • 인스턴스 필드 타입으로 사용
      • 생성자수정자에 사용될 때 NPE를 발생시킬 경우가 많이 생김
  • Optional을 리턴하는 메소드에서 null리턴하지 말자
    • 결국 Optional 내부null이 존재하기 때문에 NPE 발생
  • 기본 타입(primitive type)용 Optional을 따로 사용하자
    • 기본 타입default value를 가진다
    • 일반적인 Optional로 처리하면 성능이 좋지 않다
    • ex) OptionalInt / OptionalLong
  • Collection / Map / Stream / Array / OptionalOptional로 감싸지 말자
    • 비어있다는 것을 표현할 수 있는 타입이기 때문에 굳이 Optional을 사용할 필요가 없음

[ Optional API ]

Optional 생성

  • Optional.of()
    : null값이 아닌 명시된 값을 가지는 Optional 객체를 반환
  • Optional.ofNullable()
    : null값을 가질 수 있는 경우, null이면 비어있는 Optional 객체를 / null이 아니면 명시된 값을 가짐

Optional 내부 값 여부 확인

  • Optional.isPresent() : 값이 존재하는지 여부 확인 [ true / false ]
  • Optional.isEmpty(): 값이 비어있는지 여부 확인 [ true / false ]
    (Java 11부터 제공)
  • Optional.ifPresent(Consumer) : 만약 존재하면 Consumer 수행

Optional 내부 값 접근

  • Optional.get()
    • 내부에 있는 값에 접근
    • 주의 : 사용하기 전에 반드시 isPresent() / ifPresent() 를 통해 여부를 확인하고 사용해야 함
  • Optional.orElse(T)
    • 값이 있으면 가져오고 없는 경우에는 T로 대체
    • null 값이든 아니든 Else 호출
  • Optional.orElseGet(Supplier)
    • 값이 있으면 가져오고 없는 경우에는 Supplier로 대체
    • null 값일 때에만 ElseGet 호출
  • Optional.orElseThrow()
    • 값이 없으면 오류를 던짐

Optional 내부 값 걸러내기

  • Optional.filter(Predicate)
    • filter의 결과Optional

Optional 내부 값 변환

  • Optional.map(Function)
    • map 결과Optional
  • Optional.flatMap(Function)
    • 여러 겹의 Optional인 경우에 1개의 Optionalflat 화 할 수 있음
    • StreamflatMap다르다는 것을 인지

[ Optional API 예시 ]

Optional<String> opt = Optional.ofNullable("자바 Optional 객체");

if(opt.isPresent()) {
  System.out.println(opt.get());
}
===================================================================
Optional<String> opt = Optional.empty(); // Optional를 null로 초기화함.

System.out.println(opt.orElse("빈 Optional 객체"));
System.out.println(opt.orElseGet(String::new));
===================================================================
IntStream stream = IntStream.of(4, 2, 1, 3);

OptionalInt result = stream.findFirst();
System.out.println(result.getAsInt());

Date와 Time API

[ 배경 ]

  • 기존 Java 에서는 java.util.Date 에 포함된 Date 객체날짜/시간을 다루었다
  • 하지만 많은 문제점들이 존재하고 Java 8 에 드디어 새로운 Date와 Time API등장
  • 기존 Date 문제점
    • mutable 하기 때문에 thread safe 하지 X
      • 인스턴스의 시간을 임의로 수정이 가능해서 스레드 간 동기화가 보장되지 않는 경우가발생 가능
    • 클래스 이름이 명확하지 X
      • Date 인데 날짜 / 시간 모두 다루었다
    • 버그 발생 여지가 많다
      • 연 / 월 / 일 정보는 모두 int로 받는데 이는 음수값을 포함할 수 있기에 type safe하지 않음
      • 을 나타내는 숫자가 0부터 시작해서 8월을 표기하려면 7이라고 사용했어야 함

[ 새로운 Date / Time API ]

분류

  • 기계용 시간(machine time) : EPOCK(1970년 1월 1일 0시 0분 0초) 부터 현재까지 타임스탬프 표현
  • 인류용 시간(human time) : 우리가 흔히 사용하는 연, 월, 일 시, 분, 초로 표현
    • LocalDate : 특정 날짜
    • LocalTime : 특정 시간
    • LocalDateTime : 일시

기계용 시간(machine time)


인류용 시간(human time)


파싱(parsing) & 포매팅(formatting)

profile
Developer & PhotoGrapher

0개의 댓글