객체를 포장
해주는 일종의래퍼 클래스
(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