1. Optional 2. 인터페이스의 기본 메소드(Default method) 3. 날짜와 시간 관련 클래스들 추가 4. 병렬 배열 정렬 5. StringJoiner 추가 6. 람다(Lambda) 표현식 7. 함수형 인터페이스(Functional Interface) 8. 스트림(Stream)
Optional(옵셔널)
선택적으로 뭔가를 처리 할 때 사용하는 것으로 객체를 편리하게 처리하기 위해서 만든 클래스다.
Optional클래스는 null 처리를 보다 편리하게 하기 위해서 만들어졌다.
NullPointerException이 발생할 수 있는 상황에서 문제를 보다 간편하고 명확하게 처리하기 위해 사용된다.
java.util 패키지에 속해있다.
Optional은 final 클래스로 선언되어 있으며 Generic 한 클래스이다.
final클래스로 선언되어 있기 때문에 추가적인 확장(상속)이 불가능하다. 즉, 자식 클래스를 만들 수 없다는 의미다.
Optional 클래스는 객체를 생성할 때 Optional 클래스를 리턴하는 empty(), of(), ofNullable() 메소드들을 사용하여 생성한다.
A라는 인터페이스가 있을때 해당 인터페이스를 구현한 B,C,D 클래스가 있다고 예를 들어보자. 여기서 A 인터페이스에 추가기능이 필요해서 추상 메서드를 추가하고 새로 E라는 클래스로 인터페이스를 구현했다. 여기서 문제는 E클래스를 위해 추가된 추상 메서드를 B,C,D 클래스에 추가로 구현해야한다. 이러한 이유때문에 default method가 추가되어 하위호환성과 유연성을 높여주고 있다.
사용 방법은 아래 예제와 같이 사용된다.
public interface DefaultInterface{
String id = "bang";
String getId();
//추가된 부분
default String getEmail(){
return id + "@gmail.com";
}
}
default method는 재정의하여 사용할 수 있다.
default method외에도 static method도 추가되었는데 유틸 메서드를 사용하기 위해서 추가된거같다...
interface에서 생성된 static method는 재정의가 불가능하다.
날짜와 시간 관련 클래스
Java 8에서는 기존 Date나 Calendar의 문제를 해결 할 수 있는 새로운 날짜와 시간 관련 클래스들이 추가되었다.
아래는 Date클래스나 Calendar클래스등 이전에 사용하던 날짜와 시간관련 클래스들의 문제점들이다.
불변 객체가 아니어서 지속적으로 값이 변경 가능하다
java.util.Date클래스는 날짜 계산을 할 수 없으며, java.util.Calendar클래스는 불변객체가 아니므로 연산시 객쳉 자체가 변경되었다.
SimpleDateFormat은 Thread safe하지 않고 느리다.
멀티 쓰레드 상황에서 static으로 impleDateFormat을 사용하고 parse를 할 때 NumberFormatException이 발생하게 된다.
DateFormat을 javadoc에서 찾아보면 아래와 같은 내용이있다.
멀티 쓰레드에서는 동기화를 관리해야한다는 내용이다.
int 상수 필드의 남용
Calendar에 add메서드를 사용할 때 정수를 사용한다. calendar.add(Calendar.YEAR, 1);
여기서 Calendar.YEAR를 다른 정수로 변경해도 에러가 나지 않는다. calendar.add(Calendar.DECEMBER, 1);
직관적이지 않은 월 지정
Calendar의 월은 1월이 0부터 시작한다.
일관성없는 요일 상수
Calendar의 get으로 요일을 가져왔을때와 Date의 getDay()로 요일을 가져왔을 때 결과값이 다르다.
getDay()는 @Deprecated로 지정되어있다.
//일요일 기준
Calendar calendar = Calendar.getInstance();
calendar.get(Calendar.DAY_OF_WEEK); // 7
Date date = new Date();
date.getDay(); // 6
오류에 둔감한 timezone id 지정
TimeZone.getTimeZone 메서드에 timezone id가 들어가는데 여기서 Asia/Seoul을 Seoul/Asia로 입력해도 오류가 나오지 않는다.
Java 8에서는 parallelSort()라는 정렬 메서드가 제공되고 있다. 기존의 sort()의 경우 단일 쓰레드로 수행되고 있으며 parallelSort()는 필요에 따라 여러 개의 쓰레드로 나눠서 작업을 수행한다. 멀티 쓰레드로 작업을 수행하기 때문에 CPU를 더 많이 사용하지만 속도적인 측면에서는 더 빠르다.
parallelSort는 Fork-Join이라는 프레임워크가 내부적으로 적용된 메서드다.
Fork-Join은 Java 7에서 새로 추가된 기능으로 CPU를 더 쉽고 효율적으로 사용하기 위해서 만들어진 기능이다. 작업을 여러개로 나누어서 처리한 후 합친다는 의미로 Fork-Join에는 Work Stealing이라는 개념이 포함되어 있다. 예를 들어 여러개의 작업을 나눠서 진행하고 있을 때 어떤 작업은 바쁜반면 다른 작업은 한가할 경우가 있다. 이 때 한가한 작업이 바쁜 작업의 대기하고 있는 일을 대신 가져가서 처리해 주는 것이다.
length를 증가시키면서 random한 정수를 가진 배열을 가지고 테스트 진행 결과 배열의 길이가 길어질 수록 parallelSort메서드가 더 빨라지는 모습을 볼 수 있었다.