<

비교표

기본필터
사용자필터

* 더블클릭 : 해당 셀을 클립보드로 복사

Java 7 Java 8 Java 9 Java 10 Java 11 Java 12 Java 13 Java 14 Java 15 Java 16 Java 17
발표일

2011.07

2014.03

2017.09

2018.03

2018.09

2019.03

2019.09

2020.03

2020.09

2021.03

2021.09

특징

* Fork/Join Framework

http://pigbrain.github.io/java/2016/03/28/ForkAndJoin_on_Java

* Java NIO 2.0

* G1 Garbarge Collector

* 기본 GC > Parallel GC

* Repeating Annotation

* 새로운 날짜와 시간 API(LocalDate, LocalTIme, LocalDateTime)

* CompletableFuture

* Permgen 영역(Heap 에 포함) 이 삭제되고 동일한 기능을 하는 Metaspace 영역(Native 영역에 포함) 사용


* Jshell 추가로 Java를 인터프리터 언어처럼 쓸 수 있음

http://taewan.kim/post/trans_jshell/

* Java Jigsaw project - 모듈기반으로 동작함

* 통일된 JVM 로깅 : -Xlog 옵션으로 JVM 에 대한 로깅 가능

* Javadoc 에 HTML5 적용 ( -html5 옵션으로 사용 가능)

* 64비트 버전만 출시

* 프로퍼티 파일에 UTF-8 지원

* 다중해상도이미지

* TIFF 이미지 I/O 플러그인


참고 : https://www.popit.kr/%EB%82%98%EB%A7%8C-%EB%AA%A8%EB%A5%B4%EA%B3%A0-%EC%9E%88%EB%8D%98-java9-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EB%B3%B4%EA%B8%B0/

* JDK Forest 저장소 를 단일 저장소로 통합

* GC 인터페이스 추가

* 병렬 GC 추가

* 애플리케이션 클래스를 다른 자바 프로세스와 공유 가능

* Trhead-Local Handshakes

모든 쓰레드를 동시에 멈춰야 했던 기존과 달리, 쓰레드 별로 멈추고 콜백 실행 가능

* javah 제거

* 유니코드 언어태그 추가

* JVM Heap 영역에 비사용자 지정과 같은 대체 메모리 장치에 할당 가능

* 기본 root CA(인증기관) 목록 포함

(기존에는 빈 keystore 만 제공)



https://itstory.tk/entry/Java-10-%EC%8B%A0%EA%B7%9C-%EA%B8%B0%EB%8A%A5%ED%8A%B9%EC%A7%95-%EC%A0%95%EB%A6%AC

기본 GC > G1 GC

람다 파라미터에 대한 지역 변수 문법

엡실론 가비지 컬렉터

엡실론 가비지 수집기는 할당을 처리하지만 메모리를 회수하지는 않는고 힙이 소진되면 JVM이 종료된다. 엡실론은 수명이 짧은 서비스와 가비지를 사용하지 않는 것으로 알려진 애플리케이션에 유용하다.

Epsilon GC를 사용할 경우 우리가 작성한 어플리케이션이 외부 환경으로부터 고립된 채로 실행되기 때문에 실제 내 어플리케이션이 얼마나 메모리를 사용하는 지에 대한 임계치나 어플리케이션 퍼포먼스 등을 보다 정확하게 측정할 수 있다.

HTTP 클라이언트 표준화(HttpClient 추가)

* CDS(Class Data-Sharing) 및 가비지 수집

* ARM 포트수 감소

(preview) switch 문 개선


* (preview) switch yield 예약어가 추가


* NullPointerException 발생시 라인넘버 뿐만 아니라 발생 객체 정보까지 제공

* 플랫폼별 패키지 작성위한 jpackage 도입

* NUMA 메모리 시스템에서의 G1 가비지 컬렉터  성능 향상

* CMS GC 제거

* 리눅스에만 있던 ZGC를 맥, 윈도우 에도 이식

* JFR 이벤트 실시간 스트리밍 가능

(JFR = JDK Flight Recorder : JVM 모니터링 위한 도구)

* EdDSA 암호화 알고리즘 추가

* 스케일링 가능한 낮은 지연의 가비지 컬렉터 추가(ZGC)

* Solaris 및 SPARC 플랫폼 지원 제거

* 외부 메모리 접근 API (인큐베이팅)

Vector API

자동 병렬 프로세싱을 지원하는 자동 벡터 API

자바 네이티브(JNI 등) 개발 시 C++14 규격을 지원

CG 기능 향상

유닉스 도메인 소켓

PermGen 대신 Metaspace 방식을 지원

ARM 64비트 윈도우 운영체제가 지원

jpackage 명령어를 통해 각 운영체제별 자바 프로그램을 설치 패키지(pkg, deb, msi 등)로 생성하는 기능

자바 14의 패턴 매칭이 정식 기능으로 추가

자바 14에 추가된 Record 형식 정식 지원

자바 15에 추가된 봉인 클래스의 2차 미리보기

애플릿이 완전히 제거될 예정

애플 M1 및 이후(MacOS/AArch64) 프로세서 탑재 컴퓨터 제품군에 대한 정식 지원 예정

macOS 그래픽 렌더링 베이스를 OpenGL 에서 Metal 로 교체 예정

JEP 356: 의사난수 생성기를 통해 예측하기 어려운 난수를 생성하는 API 제공 예정

문법 변화

* switch 에 String 사용 가능

* catch 에 복수 예외 명시 가

catch(NullPointerException |  ArithmeticException e) {

* 생성자에 제네릭 타입을 생략 가능

List<Integer> primes = new ArrayList<>(); 

* InputStream 처리중 예외대비한 finally { io.close(); } 를 사용할 필요 없음

* 숫자에 _(underscore) 사용가능

int billion = 1_000_000_000

* 숫자앞에 0b 를 붙여 이진법 표현 가능

8진법 : 0

16진법 : 0x

* catch 에서 던진 예외 외의 다른 예외도 throws 가능


참고 : http://pigbrain.github.io/java/2016/03/28/Java7_on_Java

* 람다 표현식 

Thread thread = new Thread(() -> System.out.println("Start to new thread!"));

* 함수형 인터페이스

@FunctionalInterface

public interface Car {

    String drive(int driveLevel);

}

...


* default method 

인터페이스에도 메서드 내용 구현 가능

public interface Car {

    default void fly() {

        System.out.println("Fly to the moon");

    }

}


* Stream

books.stream()

                .filter(book -> book.getAuthor().equals("Friedrich Nietzsche"))

                .sorted(Comparator.comparing(Book::getName))

                .map(Book::getIsbn)

                .collect(Collectors.toList());


* Optional

Optional.ofNullable(book)

                .map(bookObject -> bookObject.getAuthor())

                .map(authorObject -> authorObject.getName());



참고 : https://bbubbush.tistory.com/23

* interface 에도 private 메서드 선언 가능 / private static 사용 가능

* 익명클래스에도 <> 사용 가능

MyHandler intHandler = new MyHandler<>(1) { .... }

* ProcessHandle 클래스 이용해서 프로세스 정보 확인 가능

* CompletableFutrue 개선

* Reactive Stream 추가

* Collection에 팩토리 메서드 추가

List immutableList = List.of("one","two","three");

Set immutableSet = Set.of("one","two","three");

Map immutableMap = Map.of(1,"one",2,"two",3,"three")

* @Deprecated에 새 메서드 추가

@Deprecated(since ="1.5", forRemoval = true)

* Stack-walking API 추가

* immutable collection

* Stream 개선

Stream.of(1, 2, 3, 4, 5, 6).takeWhile(i -> i <= 3).forEach(System.out::println);

* Optional 개선

List newStrings = streamOptional()

.flatMap(Optional::stream)

.collect(Collectors.toList());

* try-with-resource 개선

https://hianna.tistory.com/546

참고 : https://www.popit.kr/%EB%82%98%EB%A7%8C-%EB%AA%A8%EB%A5%B4%EA%B3%A0-%EC%9E%88%EB%8D%98-java9-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EB%B3%B4%EA%B8%B0/

"


* 지역변수로 var 사용 가능

var i=0

* 수정불가 Collection 생성 API 추가 
var unmodifiable = List.copyOf(numbers);
unmodifiable = Collections.unmodifiableList(numbers);


* String 클래스에서 새로운 기능 추가
String str = "abc";
str.isBlank(); // 빈 문자열 및 공백 만있는 문자열은 공백으로 변환(변환시 true 반환)
str.lines(); // 라인단위로 분할해 스트림으로 반환
System.out.println(str.lines().collect(Collectors.toList()));

str.strip(); // 문자열 시작끝 공백 제거(java8에서 trim과 달리 공백에 관한 유니코드 처리지원)
str.repeat(5); // 문자열을 여러번 반복

* 람다 문법에서 var, 어노테이션(@NotNull, ...) 사용 가능
sampleList.stream()
  .map((@NotNull var s) -> s.toLowerCase())
  .collect(Collectors.toList());

* Files 클래스에서 readString(), writeString() 추가 
Path filePath = Files.writeString(Files.createTempFile(tempDir, "demo", ".txt"), "Sample text");
String fileContent = Files.readString(filePath);
assertThat(fileContent).isEqualTo("Sample text");

* Predicate 인터페이스에 not() 추가
sampleList.stream()
  .filter(Predicate.not(String::isBlank))

* Nested 클래스 간 private 속성 공유 (Nest-Based Access Controll)
(생략)

* http 클라이언트 개선 (생략)

$ 참고
https://joeylee.tistory.com/35
https://recordsoflife.tistory.com/350
https://okky.kr/article/784365


"


"


* instanceof 를 변수에 담을 수 있음.
if(obj instanceof String s) {
...
}
=> obj 가 String 일 경우
s=(String)obj 와 같은 효과

* record 키워드 이용해 lombok 과 비슷한 효과
public record 생성자(String name, Integer age) {
}

하면 equals, hashcode, toString() 및 name(), age() 의 Getter 가 생성

* switch - break 대신 '->' 로 작성 가능
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}

* switch 자체를 return 가능
...
return switch (input) {
case 1, 2 -> 1;
case 3, 4 -> 2;
default -> 3;
};

* switch 에 yield 키워드로 값 리턴
int j = switch (day) {
case MONDAY -> 0;
case TUESDAY -> 1;
default -> {
int k = day.toString().length();
int result = f(k);
yield result;
}
};

MONDAY 일땐 0, TUEDAY 일땐 1을 j에 대입하고,
그외의 상황에는 result 값을 대입함을 의미.
(default의 {} 내에서 어떤것이 반환값인지 지정하주는 역할)

https://blog.naver.com/gngh0101/222396980468



"


* 따옴표 3개(""")로 텍스트 블록 사용
String paragraph =
"""
aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii
""""
System.out.println(paragraph);


기타
* person?.getAddress()?.getPostcode(); 형태의 Null-safe Method Invocation 은 최종 버전에선 발표되지 않음



선택된 행/열이 없습니다.
<필터편집> 에서 행/열을 선택해주세요
999 카테고리이름 X