티스토리 뷰

오라클은 2021년 3월 16일 텍사스, 오스틴(최근 오라클 본사를 캘리포니아에서 텍사스로 옮겼다)에서 자바 16 버전을 발표하였다. 관련된 링크는 아래와 같다.

 

www.oracle.com/news/announcement/oracle-announces-java-16-031621.html

 

LTS 버전이 아니라 6개월 한정적으로 운영되며, 당장 16버전으로 업그레이드하는 경우는 드물겠지만, 몇가지 추가되고 변경된 내용이 있어서 정리해 보았다.

 

1. 언어적 개선

 

자바 14에 프리뷰로 추가되었던 Records(JEP 395)instanceof의 패턴 매칭(JEP 394)을 사용하는 기능이 정식으로 추가되었다. Record에 대해서는 이 블로그에서도 간단히 살펴봤는데, 공식 언어로 추가된 내용으로 해당 블로그 페이지를 업데이트 하도록 하겠다.

 

mostadmired.tistory.com/133?category=895109

 

[PMJ] Practical 모던 자바 - 레코드 (Records)

자바 14에 프리뷰로 등록되었고 자바 15에 2번째 프리뷰로 업데이트 되었다. 진행되는 흐름상 자바 16에는 정식 버전으로 추가될 예정이다. 이 포스팅에서는 자바 15 기준으로 설명할 것이며, 정식

mostadmired.tistory.com

instanceof 연산자에 대한 패턴 매칭 기능을 간단히 설명하면, 예를 들어 List나 Map에서 데이터를 가져온 후 해당 객체의 타입을 확인하기 위해 다음과 같은 코드를 작성한다.

 

if (obj instanceof String) {

    String s = (String) obj;

}

 

여기서 불합리한 것이 이미 String이 맞기 때문에 if 문장 안으로 들어왔는데 여기서 다시 형변환을 해야 한다. 그래서 다음과 같이 코딩이 가능하도록 개선을 한 것이다.

 

if (obj instanceof String s) {

    

}

 

instanceof 연산의 개선은 다른 부분에도 영향을 줘서 언어적인 개선이 있을 것으로 예상한다. 대표적으로 switch case 문장에서 객체의 type 에 따른 분기 처리를 할 경우 형 변환 없이 바로 변환할 수 있도록 하는 것이다. (아직 언어적으로 추가되지는 않았다.)

 

2. 새로운 도구 추가

 

jpackage 도구가 JDK에 추가되었다. 자바 9에서는 jlink 도구를 이용해서 원하는 모듈만 포함된 JVM을 패키징하는 방법을 소개하였는데, 이번에 추가된 것은 어플리케이션에서 사용할 클래스, jar 및 관련 자원에 자바 가상 머신을 포함시켜서 패키징할 수 있는 기능을 제공한다. 단, 이 도구를 이용하면 가상 머신이 내부에 포함되기 때문에 특정 OS에 종속되며 현재 지원되는 OS는 윈도우, 리눅스, 맥OS 이다.

특히 윈도우 용 어플리케이션을 만들기 위해서는 리눅스와 맥과는 다르게 WIX라는 도구를 추가로 설치해야 하는데, 이는 윈도우의 실행파일은 MSI, EXE 등으로 한정되기 때문이다. (리눅스와 맥은 실행권한만 부여하면 되기 때문에 무관하다)

 

3. 인큐베이터(Incubator)와 프리뷰(Preview) 기능

 

이번 버전에 포함되어 있는 인큐베이팅과 프리뷰 기능은 다음 4가지이며 이 중 개인적으로 흥미롭고 기대되는 것은 Sealed 클래스이다. 시간이 되면 별도로 블로그에 포스팅 하겠다.

 

- Vector API (인큐베이터) : 16버전에 추가되었다.

- Foregin Linker API (인큐베이터) : 16버전에 추가되었다.

- Foreign-Memory Access API (Third 인큐베이터) : 자바 14에 추가된 이후 3번째이다. 

- Sealed 클래스 (Second 프리뷰) : 자바 15에 추가된 이후 2번째 프리뷰이다. 

 

3가지는 인큐베이터 기능이라 채용여부를 예측하기 어렵지만 Sealed 클래스의 경우 2번째 프리뷰이므로 다음 버전에 정식 추가될 것이 유력하기 때문에 한번 내용을 알아두는 것도 괜찮은것 같다.

간단히 그 개념을 설명하면 sealed라는 식별자를 인터페이스나 클래스 앞에 붙이면 특정한 클래스나 인터페이스(implement)만 상속(extend) 혹은 구현할 수 있도록 제한할 수 있다.

 

예를 들어 다음과 같이 인터페이스를 선언하면

 

sealed interface Shape

    permits Circle, Rectangle { ... }

 

해당 인터페이스는 Circle과 Rectangle에서만 상속 혹은 구현할 수 있다는 의미이다. 과거에는 final로 제한을 할 수 있지만 이것은 전체에 대한 상속을 제한하는 결과를 가져온다. 하지만 sealed를 이용할 경우 특정 경우에 허용하고 나머지는 제한하기 때문에 좀 더 선택적인 캡슐화가 가능하다. 또한 예상하지 못한 곳에서 나의 인터페이스와 클래스를 상속해서 사용함으로 인해 향후 수정 및 변경시 제약 조건이 되는 것을 사전에 막을 수도 있다.

 

4. 기타 

 

OpenJDK의 소스 코드가 Mercurial에서 GitHub으로이동하였으며 위치는 github.com/openjdk/ 이다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함