객체를 포장해주는 일종의래퍼 클래스(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/Optional은Optional로 감싸지 말자
비어있다는 것을 표현할 수 있는 타입이기 때문에 굳이Optional을 사용할 필요가 없음
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개의 Optional로flat 화할 수 있음Stream의flatMap과다르다는 것을 인지
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());
- 기존
Java에서는java.util.Date에 포함된Date 객체로날짜/시간을 다루었다- 하지만
많은 문제점들이 존재하고Java 8에 드디어새로운 Date와 Time API가등장- 기존 Date 문제점
mutable하기 때문에thread safe하지X
인스턴스의 시간을 임의로 수정이 가능해서스레드 간 동기화가 보장되지 않는 경우가발생 가능- 클래스 이름이 명확하지 X
Date인데날짜 / 시간모두 다루었다- 버그 발생 여지가 많다
연 / 월 / 일정보는 모두int로 받는데 이는음수값을 포함할 수 있기에type safe하지 않음월을 나타내는 숫자가0부터 시작해서8월을 표기하려면7이라고 사용했어야 함
분류
- 기계용 시간(
machine time) : EPOCK(1970년 1월 1일 0시 0분 0초) 부터현재까지타임스탬프 표현- 인류용 시간(
human time) : 우리가 흔히 사용하는연, 월, 일 시, 분, 초로 표현
- LocalDate :
특정 날짜- LocalTime :
특정 시간- LocalDateTime :
일시
기계용 시간(machine time)
인류용 시간(human time)
파싱(parsing) & 포매팅(formatting)
DateTimeFormatter에미리 정의된 여러 formatter가 많으니사용해도 되고,만들어서 사용해도 된다- 미리 정의해둔 포맷 참고
: https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#predefined