1. 자바 소개와 역사
구글 검색에 따르면, 2020년 말까지 9492개의 기업들이 기술 스택에 자바를 사용한다고 보고되었으며, 여기에는 구글과 이 책이 쓰여지는 동안 제가 일했던 회사도 포함됩니다. 자바는 25년이 지난 지금도 가장 영향력 있는 프로그래밍 언어 중 하나로 남아 있습니다. 이 모든 것은 1990년에 시작되었습니다. 컴퓨터 산업 혁명을 선도하던 미국의 한 기업이 신흥 인터넷 세상에서 중요한 플레이어가 되고자 최고의 엔지니어들을 모아 제품을 설계 및 개발하기로 결정했습니다. 이 엔지니어 중에는 자바 프로그래밍 언어의 아버지로 인정받는 캐나다의 컴퓨터 과학자 제임스 아서 고슬링이 있었습니다. 설계와 프로그래밍, 그리고 한 번의 개명(상표 문제로 Oak에서 Java로 변경)을 거쳐 마침내 1996년 1월에 자바 1.0이 리눅스, 솔라리스, 맥, 윈도우용으로 출시되었습니다.
기술 서적을 읽을 때 일반적인 경향은 도입 장을 모두 건너뛰는 것입니다. 그러나 이 경우 그것은 실수가 될 것입니다. 저는 자바 개발자일 때 자바의 역사에 별로 관심이 없었습니다. 제임스 고슬링이 창시자이고 오라클이 선을 인수했다는 것을 알았을 뿐입니다. 언어가 어떻게 발전했는지, 영감은 어디서 왔는지, 각 버전 간 차이점은 무엇인지에 대해서는 별로 신경 쓰지 않았습니다. 저는 자바 1.5 버전에서 자바를 배우기 시작했고 언어의 많은 것들을 당연하게 여겼습니다.
그래서 자바 1.2에서 실행하는 프로젝트에 배정되었을 때, 제가 작성한 코드의 일부가 왜 컴파일되지 않는지 알 수 없어서 상당히 혼란스러웠습니다. IT 산업은 매우 빠르게 움직이지만 레거시 응용 프로그램을 가진 고객은 항상 있을 것입니다. 각 자바 버전의 특이성을 아는 것은 유리합니다. 마이그레이션을 수행할 때 발생할 수 있는 문제들을 알 수 있기 때문입니다.
이 책을 위한 연구를 시작할 때 저는 매혹되었습니다. 자바의 역사는 엄청난 성장과 기술의 성공 이야기이며, 경영진의 자존심의 충돌이 자바 창시 회사의 위기를 초래한 예입니다. 현재 자바는 소프트웨어 개발에서 가장 많이 사용되는 기술이며, 아이러니하게도 이를 탄생시킨 회사는 더 이상 존재하지 않습니다.
이 장은 자바의 각 버전을 설명하며, 언어와 자바 가상 머신의 진화를 추적합니다.
2. 이 책은 누구를 위한 것인가?
대부분의 초보자를 위한 자바 책은 리스트 1-1에 표시된 전형적인 Hello World! 예제로 시작합니다.
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
리스트 1-1 The Most Common Java Beginner Code Sample
가장 일반적인 자바 초보자 코드 예제 이 코드는 실행되면 콘솔에 "Hello World!"를 출력합니다. 하지만 이 책을 구매했다면 자바로 실제 응용 프로그램을 개발하고 자바 개발자로서의 직무를 지원할 때 진정한 기회를 원한다고 가정합니다. 만약 이것이 당신이 원하는 것이고 당신이 초보자로서 이 언어의 능력을 최대 활용하겠다는 의지와 유머를 가지고 있다면, 이 책은 당신을 위한 것입니다. 그렇기 때문에 저는 당신에게 더 복잡한 예제로 이 책을 시작할 충분한 신용을 드릴 것입니다.
자바는 영어 기반의 가독성 있는 구문을 가진 언어입니다. 따라서 논리적 사고와 약간의 영어 지식이 있다면 바로 아래 리스트 1-2의 코드가 무엇을 하는지 실행하지 않고도 이해할 수 있을 것입니다.
package com.apress.ch.one.hw;
import java.util.List;
public class Example01 {
public static void main(String[] args) {
List<String> items = List.of("1", "a", "2", "a", "3", "a");
items.forEach(item -> {
if (item.equals("a")) {
System.out.println("A");
} else {
System.out.println("Not A");
}
});
}
}
``
리스트 1-2 The Java Beginner Code Sample a Smart Beginner Deserves
스마트한 초보자가 받아야 할 자바 초급 코드 샘플 이 코드 예제에서는 문자열 값의 목록이 선언됩니다. 그런 다음 목록을 순회하면서, 문자열이 "a"와 같으면 콘솔에 "A"를 출력하고, 그렇지 않으면 "Not A"를 출력합니다.
만약 당신이 프로그래밍에 완전히 초보자라면, 이 책은 당신을 위한 것입니다. 특히 이 책에 첨부된 자료들이 일반적으로 프로그래밍에서 사용되는 알고리즘과 디자인 패턴을 활용하기 때문입니다. 그러므로 프로그래밍에 입문하여 고급 프로그래밍 언어를 배우려는 계획이 있다면, 이 블러그를 읽고, 예제를 실행하고, 자신만의 코드를 작성하여 좋은 출발을 할 수 있을 것입니다.
자바를 이미 알고 있다면 이 책을 유용하게 사용할 수 있습니다. 책에서는 자바 17 버전(조기 액세스 프로그램 또는 EAP2 릴리스 포함)까지의 구문 및 내부 세부 사항을 다루기 때문에 알지 못했던 새로운 정보를 발견할 수 있을 것입니다.
3. 자바 구조
현재 Java의 발전 과정을 보여주고 미래를 엿볼 수 있는 소개 장입니다. 또한 Java 애플리케이션을 실행하는 메커니즘을 다루어 2장에 대비할 수 있도록 합니다. 다음 장에서는 개발 환경을 설정하는 방법과 간단한 애플리케이션을 소개합니다.
3장부터는 패키지, 모듈, 클래스, 인터페이스, 애너테이션 객체, 연산자, 데이터 타입, 레코드, 구문, 스트림, 람다 표현식 등 언어의 기본적인 부분을 다룰 것입니다.
8장부터는 외부 데이터 소스와의 상호 작용: 파일 읽기 및 쓰기, 객체 직렬화/역직렬화, 사용자 인터페이스 테스트 및 생성 등을 다룹니다.
12장은 Java 9에 도입된 publish-subscribe 프레임워크와 반응형 프로그래밍에 전적으로 헌신합니다.
13장은 가비지 수집기를 다룰 것입니다.
이 책의 목록에서 사용된 모든 소스와 책의 크기를 적절하게 제한하기 위해 포함되지 않은 일부 소스는 java-17-for-absolute-beginners라는 프로젝트의 일부입니다. 이 프로젝트는 모듈로 구성되어 있으며(다중 모듈 프로젝트임) 각각 연결되어 Maven이라는 도구로 관리되어야 합니다. Maven은 많은 소스 코드를 포함하는 프로젝트를 빌드할 수 있는 기능을 제공하는 빌드 도구입니다. 프로젝트를 빌드한다는 것은 작성된 코드를 실행 가능한 형태로 변환하는 것을 의미합니다. 제가 작성하는 책에서는 다중 모듈 프로젝트를 사용하는 것이 더 쉽게 빌드할 수 있어서, 그리고 공통 요소를 함께 그룹화하여 프로젝트의 구성을 단순하고 반복적이지 않게 유지할 수 있기 때문에 이를 사용합니다. 또한, 모든 소스를 하나의 다중 모듈 프로젝트로 조직함으로써 소스가 작동하는지 여부에 대해 가능한 한 빨리 피드백을 받을 수 있으며, 작성자에게 연락하여 업데이트를 요청할 수 있습니다. 빌드 도구를 사용하면 일정 수준의 복잡성이 추가되지만, 직원으로서 실제로 직장에서 일할 개발 환경과 매우 유사한 환경에 익숙해질 수 있습니다.
Conventions 이 책은 더 읽기 쉽게 만든 여러 개의 포맷팅 규칙을 사용합니다. 이를 위해 다음과 같은 규칙을 사용합니다: 문단 내의 코드 또는 개념 이름은 다음과 같이 표시됩니다: java.util.List
코드 목록은 다음과 같이 표시됩니다:
public static void main(String[] args) {
System.out.println("Hello World!");
}
콘솔 출력 로그는 다음과 같이 나타납니다:
01:24:07.809 [main] INFO c.a.Application - Starting Application
01:24:07.814 [main] DEBUG c.a.p.c.Application - Running in debug mode
{xx}는 명령이나 구문에서 사용해야 하는 실제 값을 암시하는 유사 값의 자리 표시자입니다.
느낌표 아이콘에 주목해야 하는 이유는 단락 앞에 나타납니다. 팁과 경고에 대한 유사한 아이콘이 있습니다.
이탤릭체는 유머러스한 은유와 표현에 사용됩니다.
볼드 폰트는 장 참조와 중요한 용어에 사용됩니다.
4. 자바가 썬 마이크로시스템즈 회사에 주인이 되었을 때
자바의 첫 번째 안정 버전은 1996년에 출시되었습니다. 그 전까지 작은 팀인 그린 팀은 Oak이라는 프로토타입 언어를 개발했고, 이 언어는 인터랙티브 핸드헬드 홈 엔터테인먼트 컨트롤러인 Star7로 세상에 소개되었습니다. 애니메이션 터치 스크린 사용자 인터페이스의 주인공은 팀의 그래픽 아티스트인 조 팔랑(Joe Palrang)이 만든 만화 캐릭터 듀크(Duke)였습니다. 세월이 흘러 듀크는 자바 기술의 공식 마스코트가 되었고, 매년 오라클이 주최하는 JavaOne 컨퍼런스에서는 듀크의 개성이 주목받습니다. Green Team은 Java를 인터넷을 통해 전 세계에 출시했습니다. 이는 빠른 확산을 위한 최선의 방법이었습니다. 다운로드가 발생할 때마다 그들이 기뻐했던 것은 사람들이 Java에 관심을 가졌다는 것을 의미했기 때문입니다. 오픈 소스 소프트웨어를 만들면 전 세계 많은 사람들이 기여하고 피드백을 제공한다는 장점도 있습니다. 따라서 자바는 많은 개발자들이 오늘날 사용하는 언어로 발전할 수 있었습니다. 25년이 지난 지금도 자바는 여전히 가장 많이 사용되는 세 가지 프로그래밍 언어 중 하나로 남아 있습니다.
그린 팀은 Sun Microsystems라는 미국 회사에 소속되어 있었으며, Sun Microsystems는 1982년에 설립되었습니다. 이 회사는 컴퓨터, 컴퓨터 부품 및 소프트웨어를 판매하여 컴퓨터 혁명을 주도했습니다. 그들의 가장 큰 업적 중 하나는 자바 프로그래밍 언어입니다.
Java가 탄생한 해부터 2010년에 Oracle에 인수되기 전까지 사용된 회사 로고를 볼 수 있습니다. 자바 첫 버전에 대한 정보는 찾기 어렵지만, 웹이 지금보다 훨씬 작고 정적 페이지로 가득 찼을 때 이를 목격한 개발자들이 블로그를 작성하고 그들의 경험을 공유했습니다. Java는 사용자와 상호작용하는 동적 콘텐츠를 표시하는 애플릿으로 쉽게 빛을 발할 수 있었습니다. 하지만 개발 팀이 더 큰 그림을 그리면서 Java는 웹 프로그래밍 언어 이상의 것이 되었습니다. 모든 브라우저에서 애플릿이 실행되도록 하려는 과정에서 팀은 일반적인 문제인 이식성 문제를 해결했습니다.
오늘날 개발자들은 모든 운영 체제에서 실행되어야 하는 소프트웨어를 개발할 때 많은 어려움을 겪습니다. 그리고 모바일 혁명으로 인해 상황은 더욱 복잡해졌습니다. 해당 그림은 처음 Java 로고로 여겨지는 추상적인 그림을 볼 수 있습니다.
Java 1.0은 첫 번째 JavaOne 컨퍼런스에서 6000명 이상의 참석자와 함께 출시되었습니다. Java는 Oak이라는 언어로 시작되었습니다. 이 언어는 C++와 매우 유사했으며, 휴대용 기기와 셋톱박스를 위해 설계되었습니다. 이는 Java의 첫 번째 버전으로 발전하여 C++가 제공하지 못하는 몇 가지 이점을 개발자에게 제공했습니다:
보안: Java에서는 배열의 크기를 초과할 때 잘못된 데이터를 읽을 위험이 없습니다.
자동 메모리 관리: Java 개발자는 객체에 할당할 메모리가 충분한지 확인하고 명시적으로 해제할 필요가 없습니다. 이러한 작업은 가비지 컬렉터에 의해 자동으로 처리됩니다. 이는 또한 포인터가 필요하지 않음을 의미합니다.
단순성: 포인터, 유니언, 템플릿, 구조체가 없습니다. Java에서는 대부분 무엇이든 클래스라고 선언할 수 있습니다. 또한, 다중 상속 사용 시 발생하는 혼란을 상속 모델을 수정하고 다중 클래스 상속을 허용하지 않음으로써 피할 수 있습니다.
멀티스레드 실행 지원: Java는 처음부터 멀티스레드 소프트웨어 개발을 지원하도록 설계되었습니다.
이식성: Java의 가장 잘 알려진 모토 중 하나는 "한 번 작성하면 어디에서나 실행된다(Write once, run anywhere, WORA)"입니다. 이것은 Java 가상 머신에 의해 가능해졌습니다.
이들이 자바를 개발자들에게 매력적으로 만들었고, 1997년에 Java 1.1이 출시되었을 때, 전 세계에 약 40만 명의 Java 개발자가 있었습니다. 그 해 JavaOne 컨퍼런스에는 10,000명이 참석했습니다. 위대한 발전의 길이 마련되었습니다. 각 Java 버전을 분석하기 전에 몇 가지를 명확히 해봅시다.
5. 자바는 어떻게 이식성이 있을까요?
제가 몇 번 언급했듯이 자바는 이식성이 있으며 자바 프로그램은 모든 운영 체제에서 실행될 수 있습니다. 이제 이것이 어떻게 가능한지 설명할 때입니다. 단순한 그림으로 시작해 봅시다, 그림 1-4처럼 말이죠.
자바는 특정 컴퓨터 유형에 독립적인 프로그램을 작성할 수 있는 고급 프로그래밍 언어입니다. 고급 언어는 읽고 쓰고 유지 관리하기 쉬운 특성을 가지고 있습니다. 그러나 코드가 실행되기 위해서는 컴파일러에 의해 번역되거나 기계어로 해석되어야 합니다. 기계어는 숫자로 구성되어 인간에게는 읽을 수 없기 때문입니다.
위 그림처럼 운영 체제 위에 JVM이 자바 프로그램을 실행하기 위해 필요하다는 점에 유의하세요. JVM은 Java Virtual Machine의 약자로, 자바 프로그램을 실행할 수 있도록 컴퓨터를 지원하는 추상적인 컴퓨팅 머신입니다. 이것은 자바 코드를 기계어로 변환하고 실행하는 플랫폼 독립적인 실행 환경입니다.
그렇다면 자바와 다른 고급 언어의 차이점은 무엇일까요? 다른 고급 언어는 원시 코드를 특정 마이크로프로세서 아키텍처나 운영 체제(ex. Windows, UNIX)에서 실행되도록 설계된 기계어로 직접 컴파일합니다. JVM이 하는 일은 자바 프로세서를 모방하여 자바 프로그램이 운영 체제에 상관없이 어떤 프로세서에서도 일련의 동작이나 운영 체제 호출로 해석될 수 있게 하는 것입니다.
물론 컴파일 단계는 C++와 같은 순수 컴파일 언어보다 자바를 느리게 만들지만, 그 이점은 여전하며 여전히 매력적입니다. 또한 자바는 JVM 언어 가족의 유일한 구성원이 아닙니다. Groovy, Scala, Kotlin, Clojure 모두 JVM에서 실행되는 매우 인기 있는 프로그래밍 언어들입니다.
자바 컴파일러가 언급되었기 때문에, Java 1.1로 돌아가야 합니다. 이는 새로운 버전이 출시되었음에도 광범위하게 사용되었습니다. 이는 개선된 Abstract Window Toolkit (AWT) 그래픽 API (애플릿을 만들기 위해 사용되는 컴포넌트들), 내부 클래스, 데이터베이스 연결 클래스 (JDBC 모델), 원격 호출을 위한 클래스 (RMI), 마이크로소프트 플랫폼 전용 JIT (Just In Time) 컴파일러, 국제화 및 유니코드 지원과 함께 제공되었습니다. Java가 출시된 지 얼마 되지 않아 마이크로소프트가 이를 라이선스하여 Java를 사용하는 애플리케이션을 만들기 시작했습니다. 피드백은 Java의 추가 개발에 도움이 되었고, 따라서 Java 1.1은 당시 모든 브라우저에서 지원되었으며, 그래서 많이 배포되었습니다.
개발자가 작성한 자바 코드는 실제로 실행될 때까지 무슨 과정을 거칠까요? 위 그림 다이어그램은 자바 코드 실행 과정을 묘사하고 있습니다.
"자바 코드는 컴파일되어 바이트코드로 변환되고, 그 후 JVM에 의해 기본 운영 체제에서 해석되고 실행됩니다."
이제 자바 코드가 실행되는 방법을 살펴봤으니, 이제 또 다른 역사 이야기를 해 봅시다.
6. 썬 마이크로시스템즈의 자바 버전
JAVA 1.0.2
Sun Microsystems에서 릴리스한 첫 번째 안정적인 Java 버전은 JDK라는 아카이브로 웹사이트에서 다운로드할 수 있었으며, 당시 버전은 1.0.2였습니다. JDK는 Java Development Kit의 약자입니다. 이는 Java 애플리케이션 및 애플릿을 개발하는 데 사용되는 소프트웨어 개발 환경입니다. JDK에는 Java Runtime Environment (JRE), 인터프리터(로더), 컴파일러, 아카이버, 문서 생성기 및 Java 개발에 필요한 기타 도구들이 포함되어 있습니다. JDK를 컴퓨터에 설치하는 방법에 대한 부분에서 더 자세히 다룰 것입니다.
JAVA 1.2
1998년에 릴리스된 버전 1.2부터 Java 버전에는 코드명이 부여되었습니다. Java 버전 1.2의 코드명은 Playground였습니다. 이는 대규모 릴리스였으며, 사람들이 Java 2 플랫폼에 대해 논의하기 시작한 시점입니다. 이 버전부터 J2SE 5.0까지의 릴리스에서는 JDK 대신 J2SE가 사용되었습니다. 이는 Java 플랫폼이 세 부분으로 구성되었음을 의미합니다:
- J2SE (Java 2 Platform, Standard Edition): 이후 JSE가 되었으며, 데스크탑 및 서버 환경을 위한 이식 가능한 코드의 개발 및 배포를 위한 컴퓨팅 플랫폼입니다.
- J2EE (Java 2 Platform, Enterprise Edition): 이후 JEE가 되었으며, 분산 컴퓨팅과 웹 서비스와 같은 엔터프라이즈 기능을 위한 명세로 Java SE를 확장한 명세의 집합입니다.
- J2ME (Java 2 Platform, Micro Edition): 이후 JME가 되었으며, 임베디드 및 모바일 장치용 이식 가능한 코드의 개발 및 배포를 위한 컴퓨팅 플랫폼입니다.
이 릴리스로 JIT 컴파일러가 Sun Microsystems의 JVM 일부가 되었고(이는 기본적으로 코드를 실행 가능한 코드로 변환하는 작업이 더 빨라졌으며 생성된 실행 코드가 최적화되었음을 의미합니다), AWT에 대한 멋진 대안으로 Swing 그래픽 API가 도입되었으며(새로운 컴포넌트를 통해 멋진 데스크탑 애플리케이션을 만들 수 있게 되었습니다), Java Collections Framework(데이터 집합 작업을 위한)가 도입되었습니다.
JAVA 1.3
J2SE 1.3은 2000년에 코드명 Kestrel과 함께 출시되었습니다(아마도 새롭게 도입된 Java 사운드 클래스에 대한 참조일 것입니다). 이 릴리스는 Java XML API도 포함하고 있습니다.
JAVA 1.4
J2SE 1.4는 2002년에 Merlin이라는 코드명으로 출시되었습니다. 이 해는 Java Community Process 회원들이 릴리스에 포함될 기능을 결정하는 데 참여한 첫 해였으며, 따라서 릴리스가 상당히 일관성이 있었습니다. 이는 Java Community Process하에 JSR 59로 개발된 Java 플랫폼의 첫 번째 릴리스입니다. 언급할 만한 기능으로는 다음과 같습니다:
- IPv6 지원: 기본적으로 네트워크 상에서 실행되는 애플리케이션은 이제 네트워크 프로토콜 IPv6를 사용하여 작동하도록 작성될 수 있습니다.
- Nonblocking IO: IO는 입력-출력의 약자로, 데이터를 읽고 쓰는 작업을 의미하며, 매우 느린 작업입니다. IO를 논블로킹으로 만들면 이러한 작업이 최적화되어 실행 속도가 빨라집니다.
- Logging API: 실행된 작업은 실패 시 원인을 파악하고 해결책을 찾기 위해 파일이나 리소스에 보고되어야 합니다. 이 과정을 로깅이라고 하며, 이 버전에서 이러한 작업을 지원하는 컴포넌트가 도입되었습니다.
- 이미지 처리 API: 개발자가 이미지를 Java 코드로 조작하기 위해 사용할 수 있는 컴포넌트입니다.
Java의 커피 컵 로고는 2003년 JavaOne 컨퍼런스에서 처음 등장했습니다. 2004년에 출시된 J2SE 5.0은 Tiger라는 코드명을 가졌습니다. 처음에는 일반적인 버전 번호 체계를 따랐고 1.5로 명명되었지만, 이는 J2SE의 성숙도, 안정성, 확장성, 보안성을 크게 향상시키는 주요 릴리스였기 때문에 5.0으로 라벨링되어 공개되었습니다. 이 버전과 그 다음 두 버전은 1.x = x.0으로 간주되었습니다. 이 책에서 대부분의 기능이 다루어지므로 그 기능을 나열해 보겠습니다:
- 제네릭 (Generics)은 컴파일 시 타입 안전성을 보장하며 불필요한 타입 변환을 줄여줍니다. 이는 특정 문맥에서 사용되는 타입이 애플리케이션 실행 중에 결정된다는 것을 의미합니다.
- 어노테이션 (Annotations)은 클래스와 메서드를 태그하여 메타데이터 인식 유틸리티가 이를 처리할 수 있도록 합니다. 이는 다른 컴포넌트가 인식하여 특정 작업을 수행할 수 있는 태그로 레이블링하는 것을 의미합니다.
- 오토박싱/언박싱 (Autoboxing/unboxing)은 기본 타입과 해당 객체 타입(랩퍼) 간의 자동 변환을 의미합니다.
- 열거형 (Enumerations)은 enum 키워드를 사용하여 고정된 순서의 값 집합을 정의합니다. 이는 4장에서 다룹니다.
- 가변 인자 (Varargs)는 임의의 수의 동일한 타입 매개변수를 지원하는 메서드의 단축 표기법을 제공합니다. 메서드의 마지막 매개변수는 타입 이름과 뒤에 오는 세 개의 점(예: String...)을 사용하여 선언되며, 이는 해당 타입의 임의 개수의 인수를 제공할 수 있음을 의미하며 배열로 배치됩니다.
- 향상된 for each 루프 (Enhanced for each loop)는 컬렉션 및 배열을 반복하는 데 사용됩니다.
- 멀티스레드 Java 프로그램의 의미론이 개선되었습니다.
- 정적 임포트도 4장에서 다룹니다.
- RMI(책에 포함되지 않음), Swing(10장), 동시성 유틸리티(7장) 및 Scanner 클래스(11장)의 도입에 대한 개선이 있었습니다.
JAVA 1.5
Java 5는 Apple Mac OS X 10.4에서 처음 사용할 수 있었고, Apple Mac OS X 10.5에 기본 설치된 버전이었습니다. 보안 및 성능과 관련된 문제를 해결하기 위해 2015년까지 이 버전에 대해 많은 업데이트가 배포되었습니다. 이는 상당히 버그가 많은 릴리스였고, 불과 2년 만에 많은 기능이 개발되었기 때문에 이해할 만합니다.
JAVA 1.6
2006년에 Java SE 6는 Mustang이라는 코드명으로 약간의 지연과 함께 출시되었습니다. 당연히, 이는 또 하나의 명칭 변경이었으며, 짧은 시간 내에 상당한 수의 기능이 구현되었습니다. 기존 문제들을 해결하기 위한 많은 업데이트가 그 후 필요했습니다. 이는 Sun Microsystems가 출시한 마지막 주요 Java 릴리스로, 오라클이 2010년 1월에 이 회사를 인수했습니다. 이번 릴리스의 가장 중요한 기능은 다음과 같습니다:
- 코어 플랫폼의 극적인 성능 향상 (애플리케이션이 더 빨리 실행되고, 실행에 필요한 메모리와 CPU가 감소).
- 웹 서비스 지원 개선 (웹 애플리케이션 개발에 필요한 최적화된 컴포넌트).
- JDBC 4.0 (데이터베이스를 사용하는 애플리케이션 개발에 필요한 최적화된 컴포넌트).
- Java Compiler API (코드에서 컴파일에 사용되는 컴포넌트를 호출할 수 있습니다).
- 많은 GUI 개선, 예를 들어 API에 SwingWorker 통합, 테이블 정렬 및 필터링, 실제 Swing 더블 버퍼링(회색 영역 효과 제거); 전체적으로 데스크탑 애플리케이션용 인터페이스를 만드는 데 사용되는 컴포넌트의 개선.
자바 관점에서 얼마 지나지 않은 2008년 12월, JavaFX 1.0 SDK가 출시되었습니다. JavaFX는 모든 플랫폼에서 그래픽 사용자 인터페이스를 생성할 수 있는 적합한 도구입니다. 초기 버전은 스크립팅 언어였습니다. 2008년까지 Java에서 사용자 인터페이스를 만드는 두 가지 방법이 있었습니다:
- AWT (Abstract Window Toolkit) 컴포넌트를 사용하여, 이는 기본 운영 체제에 특화된 네이티브 피어 컴포넌트에 의해 렌더링되고 제어됩니다; 그래서 AWT 컴포넌트는 종종 중량급 컴포넌트라고 불립니다.
- Swing 컴포넌트를 사용하는 것으로, 운영 체제의 윈도우 툴킷에서 네이티브 리소스 할당을 요구하지 않기 때문에 경량급으로 불립니다. Swing API는 AWT의 보완적인 확장입니다.
초기 버전에서는 JavaFX가 실제로 미래가 있을지, 그리고 Swing을 대체하게 될지에 대한 명확한 판단이 어려웠습니다. Sun 내부의 경영 혼란은 이 프로젝트를 위한 명확한 경로를 정의하는 데에도 도움이 되지 않았습니다.
7. Oracle 자바를 인수하다!
Sun Microsystems는 Microsoft와의 소송에서 승소하여 Microsoft가 Java 1.1 표준을 완전히 구현하지 않은 대가로 2천만 달러를 지불하기로 합의했지만, 2008년에는 회사의 상황이 너무나 나빠져 IBM 및 Hewlett-Packard와의 합병 협상이 시작되었습니다. 2009년, Oracle과 Sun은 Oracle이 주당 9.50달러에 Sun을 인수하기로 합의했는데, 이는 총 56억 달러의 제안이었습니다. 그 영향은 엄청났습니다. Java의 아버지인 제임스 고슬링을 포함하여 많은 엔지니어들이 퇴사했고, 이는 많은 개발자들이 Java 플랫폼의 미래에 대해 의문을 품게 만들었습니다.
JAVA 1.7
Java 7 Java SE 7, 코드명 Dolphin은 2011년에 Oracle이 출시한 첫 번째 Java 버전이었습니다. 이는 OpenJDK 커뮤니티와 Java Community Process(JCP)와 같은 전 세계 Java 커뮤니티 구성원과 Oracle 엔지니어들 간의 광범위한 협력의 결과였습니다. 여러 변화가 있었지만, 개발자들의 기대에 비해서는 적었습니다. 릴리스 간의 오랜 기간을 고려할 때 기대가 매우 높았습니다. 람다 표현식을 Java에서 사용할 수 있도록 하는 Project Lambda와 JVM과 Java 애플리케이션을 모듈화하는 Jigsaw 프로젝트는 삭제되었습니다. 이 두 기능은 이후 버전에 출시되었습니다.
Java 7의 가장 주목할 만한 기능은 다음과 같습니다:
- 새로운 invoke dynamic bytecode로 동적 언어에 대한 JVM 지원(Python, Ruby, Perl, Javascript, Groovy 등과 같은 비-Java 언어로 구현된 코드를 Java 코드가 사용할 수 있음).
- 64비트 포인터 압축(JVM의 내부 최적화로 메모리 소비가 줄어듦).
- 프로젝트 Coin에 그룹화된 작은 언어 변화:
- switch 구문에서 문자열 사용
- try-문에서 자동 리소스 관리
- 제네릭에 대한 개선된 타입 추론—다이아몬드 <> 연산자
- 2진수 정수 리터럴: 숫자를 2진수로 직접 나타낼 수 있으며, 0b(또는 0B) 뒤에 하나 이상의 이진수(0 또는 1)를 사용하여 나타낼 수 있음(5장에서 다룸).
- 다중 예외 처리 개선(5장에서 다룸)
- 동시성 향상
- 새로운 I/O 라이브러리(파일에서 데이터를 읽고 쓰기 위한 새로운 클래스 추가, 8장에서 다룸)
- 더 나은 성능으로 인해 병합 정렬 대신 컬렉션 및 객체 배열을 정렬하는 Timsort 알고리즘이 도입되었습니다. 더 나은 성능은 일반적으로 소비 자원(메모리 및/또는 CPU) 감소 또는 실행에 필요한 시간 단축을 의미합니다.
원래 개발팀이 거의 참여하지 않은 프로젝트를 계속 개발하는 것은 매우 어려운 일이었을 것입니다. 이는 뒤이어 나타난 161건의 업데이트에서 분명합니다. 대부분의 업데이트는 보안 문제 및 취약점을 수정하는 데 필요했습니다.
Java 7과 함께 JavaFX 2.0이 출시되었습니다. 이는 JavaFX 프로젝트가 Oracle과 함께 미래를 가지고 있음을 확인시켰습니다. 큰 변화로 JavaFX는 스크립팅 언어에서 Java API로 전환되었습니다. 이는 Java 언어 구문에 대한 지식만으로 사용하고자 그래픽 인터페이스를 구축할 수 있음을 의미합니다. JavaFX는 렌더링을 더 잘하는 Prism이라는 하드웨어 가속 그래픽 엔진 덕분에 Swing보다 인기를 끌기 시작했습니다.
Java 7부터 오픈소스 Java SE 플랫폼 에디션의 참조 구현인 OpenJDK가 시작되었습니다. 이는 Oracle이 JDK로부터 이익을 창출하기 위해 더 엄격한 라이선스를 도입할 것으로 예상되었기 때문에, Java 개발자 커뮤니티의 노력으로 Oracle 라이선스가 없는 JDK 버전을 제공하고자 한 것입니다.
JAVA 1.8
Java SE 8, 코드명 Spider는 2014년에 출시되었으며, 원래 Java 7의 일부로 포함되려던 기능들이 포함되었습니다. 버전이 늦었어도 안 나오는 것보다는 낫겠죠? 3년 동안 개발된 Java 8는 다음과 같은 주요 기능을 포함하고 있습니다:
- 언어 구문 변경
- 람다 표현식에 대한 언어 수준 지원(함수형 프로그래밍 기능)
- 인터페이스에서 기본 메서드 지원
- 새로운 날짜 및 시간 API
- 스트림을 사용하여 병렬 처리를 수행하는 새로운 방법
- JavaScript와의 통합 개선(Nashorn 프로젝트). JavaScript는 개발 커뮤니티에서 많이 사랑받는 웹 스크립팅 언어이기 때문에, Java에서 이를 지원하는 것은 Oracle에 몇몇 새로운 지지자를 가져다주었을 것입니다.
- 가비지 수집 프로세스의 개선
Java 8부터는 상표 법적 문제를 피하기 위해 코드명이 삭제되었으며, 대신 주요, 소규모, 보안 업데이트 릴리스를 쉽게 구분할 수 있는 시맨틱 버전 관리가 채택되었습니다. 버전 번호는 다음 패턴에 따라 맞춰집니다 :
$MAJOR.$MINOR.$SECURITY.
터미널에서 java -version을 실행하면(자바 8이 설치되어 있을 경우) Listing 1-3과 유사한 로그를 볼 수 있습니다.
$ java -version
java version "1.8.0_162"
JavaTM SE Runtime Environment build 1.8.0_162-b12
Java HotSpotTM 64-Bit Server VM build 25.162-b12, mixed mode
[Java 8의 java -version 실행 로그]
이 로그에서, 버전 번호는 다음과 같은 의미를 가집니다:
- 1은 자바 SE 플랫폼 사양의 새로운 판에서 지정된 중요한 새로운 기능을 포함하는 주요 릴리스를 위한 주요 버전 번호입니다.
- 8은 호환 가능한 버그 수정, 표준 API에 대한 개정 사항 및 기타 작은 기능을 포함할 수 있는 소규모 업데이트 릴리스를 위한 마이너 버전 번호입니다.
- 0은 보안 수준을 나타내며, 보안 향상을 위한 중요한 수정 사항을 포함하는 보안 업데이트 릴리스를 위한 버전입니다. $MINOR가 증가할 때 $SECURITY는 0으로 재설정되지 않으므로, 사용자에게 이 버전이 더 안전한 버전임을 알립니다.
- 162는 빌드 번호입니다.
- b12는 추가적인 빌드 정보를 나타냅니다.
이 버전 관리 스타일은 Java 애플리케이션에서 매우 일반적이며, 업계 일반 관행에 맞춰 이 버전 관리 스타일이 채택되었습니다.
JAVA 1.9
Java SE 9는 2017년 9월에 출시되었습니다. 오랫동안 기다려온 Jigsaw 프로젝트가 마침내 도입되었고, Java 플랫폼이 모듈화되었습니다. 이는 Java 세계에 큰 변화입니다. 구문이나 새로운 기능의 변화가 아닌, 플랫폼 디자인의 변화입니다. Java 초창기부터 사용해온 몇몇 경험 많은 개발자들은 적응하기 어렵다고 느꼈습니다. 이는 장기간 Java가 겪어온 심각한 문제를 해결하기 위한 것입니다(3장에서 다룹니다). 초보자인 당신은 다행히 처음부터 시작하므로 애플리케이션 개발 방식을 바꿀 필요가 없습니다.
Java 모듈 외에도 가장 중요한 기능은 다음과 같습니다:
- Java Shell 도구: 자바로 작성된 선언문, 명령문 및 식을 평가하는 대화형 명령줄 인터페이스(3장에서 다룸)
- 다수의 보안 업데이트
- 인터페이스에서 private 메서드 지원(4장에서 다룸)
- 개선된 try-with-resources: 이제 최종 변수를 리소스로 사용할 수 있음(5장에서 다룸)
- 식별자 이름에서 "_" 삭제(4장에서 다룸)
- Garbage-First(G1) 가비지 컬렉터 개선; 이는 기본 가비지 컬렉터가 됨(13장에서 다룸)
- 내부적으로 더 컴팩트한 문자열 표현이 사용됨(5장에서 다룸)
- 동시성 업데이트(병렬 실행 관련, 5장에서 언급)
- 컬렉션을 위한 팩토리 메서드(5장에서 다룸)
- 이미지 처리 API 최적화 업데이트
Java 9는 Java 8과 같은 버전 관리 방식을 따르지만, 약간의 변화가 있었습니다. JDK 이름에 포함된 Java 버전 번호가 버전 관리 체계의 $MAJOR 숫자가 되었습니다. Java 9가 설치된 경우, 터미널에서 java -version을 실행하면 Listing 1-4와 유사한 로그를 볼 수 있습니다.
$ java -version
java version "9.0.4"
Java(TM) SE Runtime Environment build 9.0.4+11
Java HotSpot(TM) 64-Bit Server VM build 9.0.4+11, mixed mode
[Java 9의 java -version 실행 로그]
JAVA 10
Java 10 Java SE 10(일명 Java 18.3)은 2018년 3월 20일에 출시되었습니다. Oracle은 새로운 버전이 6개월마다 출시되도록 Java 릴리스 방식을 변경했습니다. Java 10은 Oracle이 설정한 새로운 버전 관리 관습 또한 사용합니다: 버전 번호는 $YEAR.$MONTH 형식을 따릅니다. 이러한 릴리스 버전 관리 스타일은 개발자와 최종 사용자가 릴리스의 나이를 파악하기 쉽게 하여 최신 보안 수정 및 추가 기능이 포함된 새로운 릴리스로 업그레이드할지 판단할 수 있도록 합니다.
다음은 Java 10의 몇 가지 기능입니다:
- 로컬 변수 타입 추론: 언어를 향상시켜 로컬 변수에 대한 타입 추론을 확장(5장에서 다룸)
- 가비지 수집 최적화(13장에서 다룸)
- 애플리케이션 클래스 데이터 공유: 프로세스 간 공통 클래스 메타데이터 공유로 공간 절약(책에 포함되지 않음)
- 동시성 업데이트(병렬 실행 관련, 5장에서 언급)
- 대체 메모리 장치에서 힙 할당(JVM이 Java 프로그램을 실행하는 데 필요한 메모리—힙 메모리라 함—를 대체 메모리 장치에 할당할 수 있으며, 따라서 힙은 변동성 및 비변동성 RAM 간에 분할될 수 있음. Java 애플리케이션에서 사용하는 메모리에 대한 자세한 내용은 5장에서 확인할 수 있습니다.)
JDK 10이 설치된 경우, 터미널에서 java -version을 실행하면 Listing 1-5와 유사한 로그를 볼 수 있습니다.
$ java -version
java version "10" 2018-03-20
Java(TM) SE Runtime Environment 18.3 build 10+46
Java HotSpot(TM) 64-Bit Server VM 18.3 build 10+46, mixed mode
[Java 10의 java -version 실행 로그]
JAVA 11
Java SE 11(일명 Java 18.9)은 2018년 9월 25일에 출시되었으며, 다음과 같은 기능이 포함되어 있습니다:
- 엔터프라이즈 Java 애플리케이션 빌드에 사용되는 JEE 고급 컴포넌트 및 Corba(오래된 원격 호출 기술로, 다른 컴퓨터에 설치된 애플리케이션과 통신 가능하게 함) 모듈 제거.
- 람다 매개변수에 대한 로컬 변수 문법을 통해 암시적 타입 람다 표현식의 형식 매개변수를 선언할 때 var 키워드 사용 가능.
- Epsilon, 저비용 가비지 수집기(가비지 컬렉션 없이 애플리케이션 실행 가능), 기본적으로 가비지 컬렉션을 위한 최적화가 추가됨.
- 더 많은 동시성 업데이트(병렬 실행과 관련).
- Nashorn JavaScript 스크립트 엔진과 API는 향후 릴리스에서 제거될 예정으로 사용 중단(deprecated) 표시됨. ECMAScript 언어 구조는 매우 빠르게 진화하므로, Nashorn 유지보수가 어려워짐.
이러한 변화 외에도, $YEAR.$MONTH 형식이 개발자들에게 잘 맞지 않았기 때문에 새로운 버전 관리 변경이 도입되어야 한다는 추측이 있었습니다. 새로운 버전 관리 변경안은 Java 9에서 소개된 것과 유사합니다.
JDK 11이 설치된 경우, 터미널에서 java -version을 실행하면 아래와 같이 유사한 로그를 볼 수 있습니다.
$ java -version
java version "11.0.3" 2019-04-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.3+12-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.3+12-LTS, mixed mode)
[Java 11의 java -version 실행 로그]
JDK 11은 장기 지원 릴리스로, 여러 해 동안 지원이 계획되어 있습니다. 이는 버전 이름의 LTS가 의미하는 바입니다.
JDK 11의 릴리스와 함께, Oracle은 Java SE 8 라이선스를 과금할 것이라고 발표했고, 소프트웨어 비용 절감을 원하는 소규모 기업들은 대안을 찾기 시작했습니다. AdoptOpenJDK는 여러 플랫폼용으로 완전히 오픈소스 빌드 스크립트와 인프라에서 사전 빌드된 OpenJDK 바이너리를 제공합니다.
OpenJDK는 사용하는 공급자에 따라 OracleJDK와 같은 코드를 가지고 있습니다.
또한, Oracle JDK는 비즈니스 애플리케이션의 요구에 맞게 수정할 수 없지만, OpenJDK는 GNU 일반 공중 사용 허가서(GNU General Public License)로 라이선스가 허용되어 있어 수정 가능합니다.
또한, 비용이 문제가 되지 않는다면, Amazon의 Coretto, Azul Zulu, GraalVM 같은 최적화된 대체 JDK들도 있습니다.
JAVA 12
Java SE 12는 2019년 3월 29일에 출시되었으며, 다음과 같은 중요한 기능이 포함되어 있습니다:
- Shenandoah라 불리는 새로운 실험적 가비지 컬렉터(GC) 알고리즘, GC 일시 중지 시간을 줄입니다.
- switch 구문의 문법 수정으로, 이를 표현식으로도 사용 가능하게 되었으며, break 문이 필요 없어졌습니다.
- JVM Constants API로, 주요 클래스 파일과 런타임 아티팩트에 대한 명목상의 설명 모델화. 이 API는 클래스와 메소드 조작 도구에 유용할 수 있습니다.
- G1 가비지 컬렉터에 대한 사소한 개선.
- JDK 빌드 프로세스 개선을 위한 CDS 아카이브.
- 약 100개의 미세 벤치마크가 JDK 소스에 추가됨.
JDK 12가 설치된 경우, 터미널에서 java -version을 실행하면 아래와 같이 유사한 로그를 볼 수 있습니다.
$ java -version
java version "12.0.2" 2019-07-16
Java(TM) SE Runtime Environment (build 12.0.2+10)
Java HotSpot(TM) 64-Bit Server VM (build 12.0.2+10, mixed mode, sharing)
[Java 12 Log for Execution of java -version]
JDK 12는 2017년 9월 JDK 9와 함께 도입된 Oracle의 6개월 릴리스 주기의 일환입니다. JDK 12는 기능 릴리스로, 지원 기간이 짧습니다. 이 버전에는 이미 두 개의 패치가 출시되었습니다.
JAVA 13
Java SE 13은 2019년 9월 17일에 출시되었으며, 몇 가지 중요한 기능과 수백 개의 소규모 개선 및 수천 개의 버그 수정을 포함하고 있습니다. 이 버전의 가장 중요한 기능은 다음과 같습니다:
- 동적 CSD 아카이브(JDK 12에 추가된 CDS 아카이브 지원의 개선)
- Z 가비지 컬렉터 강화(13장에서 다룸)
- 레거시 소켓 API의 새로운 구현
- switch 표현식의 개선(7장에서 다룸)
- 텍스트 블록 지원(5장에서 다룸)
JDK 13이 설치된 경우, 터미널에서 java -version을 실행하면 Listing 1-8과 유사한 로그를 볼 수 있습니다.
$ java -version
java version "13.0.2" 2020-01-14
Java(TM) SE Runtime Environment (build 13.0.2+8)
Java HotSpot(TM) 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)
Listing 1-8 Java 13의 java -version 실행 로그
JDK 13 역시 기능 릴리스로, 지원 기간이 짧습니다. 이 버전에는 이미 두 개의 패치가 출시되었습니다.
JAVA 14
Java SE 14는 2020년 3월 17일에 출시되었으며, 중요한 기능, 개선사항 및 버그 수정을 많이 포함하고 있습니다. 이 버전의 가장 중요한 기능은 다음과 같습니다:
- instanceof 연산자를 위한 패턴 매칭
- 실행 중인 Java 애플리케이션 및 JVM에 대해 프로파일링 및 진단 데이터를 수집하기 위한 JFR 이벤트 스트리밍 API
- G1 가비지 컬렉터의 추가적인 개선
- CMS(Concurrent Mark Sweep) 가비지 컬렉터가 제거됨
- macOS에 대한 Z 가비지 컬렉터 지원
- 얕게 불변 데이터에 대한 투명한 홀더로 클래스 선언을 위한 간결한 구문을 제공하기 위한 레코드 도입
- Java 힙 외부의 외부 메모리에 안전하게 효율적으로 접근할 수 있는 외부 메모리 접근 API 지원
- NullPointerException 클래스의 개선으로 변수가 null인지 쉽게 식별할 수 있도록 더 정확한 세부 정보 제공
- 최종 사용자에게 자연스러운 설치 경험을 제공하는 네이티브 패키징 형식을 지원하기 위해 jpackage 도구 도입
JDK 14가 설치된 경우, 터미널에서 java -version을 실행하면 Listing 1-9와 유사한 로그를 볼 수 있습니다.
$ java -version
java version "14.0.2" 2020-07-14
Java(TM) SE Runtime Environment (build 14.0.2+12-46)
Java HotSpot(TM) 64-Bit Server VM (build 14.0.2+12-46, mixed mode, sharing)
[Java 14의 java -version 실행 로그]
이 릴리스에는 많은 새로운 기능들이 포함되어 있지만, 대부분은 프리뷰 모드로만 제공되거나 인큐베이션 단계에 있어, 이 릴리스는 불안정하며 장기 지원 후보로 적합하지 않습니다.
JAVA 15
Java SE 15은 2020년 9월 15일에 출시되었으며, 이전 버전에 추가된 프로젝트에 대한 상당한 개선 사항을 포함하고 있습니다. 이 버전의 가장 주목할 만한 기능은 다음과 같습니다:
- Nashorn JavaScript 엔진 제거
- 봉인된 클래스와 숨겨진 클래스 추가
- 암호화 서명을 위한 Edwards-Curve Digital Signature Algorithm (EdDSA) 지원
- 레거시 DatagramSocket API에 대한 추가적인 개선
- 편향된 락킹(Biased Locking)이 비활성화되고 사용 중단되어 멀티스레드 애플리케이션의 성능이 향상됨
JDK 15가 설치된 경우, 터미널에서 java -version을 실행하면 Listing 1-10과 유사한 로그를 볼 수 있습니다.
$ java -version
java version "15" 2020-09-15
Java(TM) SE Runtime Environment (build 15+36-1562)
Java HotSpot(TM) 64-Bit Server VM (build 15+36-1562, mixed mode, sharing)
[java -version 실행 로그]
JDK 15는 단기 릴리스로, JDK 16이 2021년 3월에 나오기 전까지 6개월 동안 Oracle Premier Support를 받았습니다.
JAVA 16
Java SE 16은 2021년 3월 16일에 출시되었으며, JDK 15를 잇는 표준 Java 버전의 참조 구현입니다. 이는 JDK 15의 모든 불안정함이 JDK 16에서 더 안정적이게 될 것임을 의미합니다. 그 외에도 이 버전의 가장 주목할 만한 기능은 다음과 같습니다:
- 지원되는 CPU 아키텍처에서 최적의 벡터 하드웨어 명령어로 컴파일되는 벡터 계산을 표현하기 위해 Vector API 도입하여 스칼라 계산과 동등한 탁월한 성능 달성
- JDK 내부의 강력한 캡슐화 기본값
- 정적 타입의 순수 Java 네이티브 코드 접근을 제공하기 위한 Foreign linker API 도입
- 사용되지 않은 HotSpot 클래스 메타데이터(즉, 메타스페이스) 메모리를 운영 체제로 더 빨리 반환하도록 촉진하는 Elastic Metaspace 도입
- C++ 14 언어 기능에 대한 지원 추가
JDK 16이 설치된 경우, 터미널에서 java -version을 실행하면 아래 메시지와 유사한 로그를 볼 수 있습니다.
$ java -version
openjdk version "16-ea" 2021-03-16
OpenJDK Runtime Environment (build 16-ea+30-2130)
OpenJDK 64-Bit Server VM (build 16-ea+30-2130, mixed mode, sharing)
[Java 16의 java -version 실행 로그]
JDK 16은 단기 릴리스로, JDK 17이 2021년 9월에 나오기 전까지 6개월 동안 Oracle Premier Support를 받았습니다. 이 장이 작성될 당시 JDK 16은 조기 액세스 프로그램으로만 제공되었기 때문에 버전 이름에 "ea" 문자열이 포함되어 있습니다.
JAVA 17
JDK 17은 다음 장기 지원 릴리스로, 8년 동안 Oracle의 지원을 받을 예정입니다. 2021년 9월 14일 Java SE 버전의 6개월 릴리스 주기에 맞춰 출시되었습니다.
이 장이 작성될 당시, JDK 17은 조기 액세스 프로그램을 통해서만 제공되고 있었기 때문에 버전 이름에 "ea" 문자열이 포함되어 있었습니다. 이는 초기에 접근할 수 있음을 의미합니다. 아직 어떤 에디터나 빌드 도구에서도 지원되지 않아 사용하기가 꽤 어려웠습니다. 기능 목록 또한 아직 완성되지 않았고, 버그 수정과 기능에 대한 제안이 Java 커뮤니티로부터 여전히 환영받고 있습니다.
이제 이 릴리스의 중요한 안정적 기능들을 모두 다룰 것입니다. 사전 보기 기능은 이 프로젝트의 안정성에 위험을 초래할 수 있기 때문에 포함되지 않았습니다.
- JDK 16에서 도입된 Vector API의 성능 및 구현 향상
- 봉인된 클래스 및 인터페이스의 세부사항 개선
- switch 표현식을 위한 패턴 매칭 도입(기능 미리 보기)
- macOS 특정 개선사항
- 의사 난수 생성기(PRNGs)에 대한 개선: 점프 가능한 PRNGs 및 새로운 splititable PRNG 알고리즘 클래스(LXM) 포함하는 새로운 인터페이스 및 구현 도입
- JDK 내부 캡슐화 개선
- Applet API 사용 중단(JDK 18에서 제거 준비)
- 보안 관리자 사용 중단(JDK 18에서 제거 준비)
- Foreign Function & Memory API는 이전의 두 개의 인큐베이팅 API 외부 메모리 접근 API와 Foreign Linker API를 통합하여 개발자가 JNI의 위험 없이 네이티브 라이브러리를 호출하고 네이티브 데이터를 처리할 수 있게 함
JDK 17의 기능 목록은 성능을 향상하고 오래된 API를 사용 중단/제거하기 위한 JVM 내부에 초점을 맞추고 있습니다.
JDK 17이 설치된 경우, 터미널에서 java -version을 실행하면 Listing 1-12와 유사한 로그를 볼 수 있습니다.
openjdk version "17" 2021-09-14
OpenJDK Runtime Environment (build 17+35-2724)
OpenJDK 64-Bit Server VM (build 17+35-2724, mixed mode, sharing)
[Java 17의 java -version 실행 로그]
더 자세한 세부 사항은 여기서 마치며, 자바의 중우한 25년의 역사를 체험하거나 관심있다면 인터넷에서 쉽게 찾을 수 있습니다.
사전 요구사항
이 장을 끝내기 전에, Java를 배우기 위해 필요한 몇 가지 사항을 알려드리는 것이 공정할 것입니다:
- Windows, Linux, 또는 macOS 같은 운영 체제를 잘 다룰 수 있어야 합니다.
- 검색 기준을 세분화할 수 있어야 합니다. 실제로 운영 체제와 관련된 정보를 다루지 않기 때문입니다. 자바로 개발하면서 생기는 문제 발생 처리는 스스로 해결해야 합니다.
- 인터넷 연결
이미 Java를 알고 있고 호기심이나 모듈 챕터를 구현하고자 할 때 Maven이나 Gradle 같은 빌드 도구에 대해 아는 것이 유용합니다. 왜냐하면 소스 코드가 하나의 명령으로 완전히 빌드될 수 있는 다중 모듈 프로젝트로 구성되어 있기 때문입니다. 이러한 빌드 도구 없이는 Java를 배우는 것이 말이 되지 않기 때문에 빌드 도구를 사용하기로 했습니다. 구독자들은 이제 지원할 어떤 회사든지 이러한 도구 중 하나를 사용하기 마련입니다.
열거한 필수 사항 외에도, JDK와 Java Editor를 설치해야 합니다. 이는 2장에서 다룹니다. 모든 수학, 알고리즘, 또는 디자인 패턴을 알 필요는 없습니다(다만, 이 블러그를 읽고 나면 몇 가지는 알게 될 것입니다).
이상이 언급된 사항들이고, 이제 시작해볼까요.
https://namu.wiki/w/Java/%EB%B2%84%EC%A0%84#s-28
Java/버전
프로그래밍 언어 Java 의 버전에 관해 정리한 문서이다. JDK 1.0a 1994년 발표. JDK 1.0a2
namu.wiki
잠깐!! 자바 개발자들은 버전을 선택할 때 반드시 집고 넘어가야 하는 것이 하나 있습니다. 바로 스프링 버전과 연관되어 개
발해야 합니다.
Spring Framework로 개발하는 경우 : JDK17 + Spring 6.1.x
Spring Boot로 개발하는 경우 : JDK 17 + Spring Boot 3.2.x
출처: https://kghworks.tistory.com/197 [kghworks:티스토리]
그럼으로 자바 스프링 프레임워크 6.X 버전으로 개발하고자 하는 분들은 jdk 17 설치하여 세팅하시길 바라며, 스프링 부트로 개발하시려는 개발자분들은 Spring Boot 3.2.x 로 준비하시면 개발 질주에 착오 없습니다.
Java 17 for Absolute Beginners: Learn the Fundamentals of Java Programming
Sign In : Toronto Public Library
login.ezproxy.torontopubliclibrary.ca
'자바' 카테고리의 다른 글
자바 17 (3) - 자바 언어, 첫 발 내딛기!!! (0) | 2024.09.30 |
---|---|
자바 17 (2) - 자바 설치 및 환경 세팅 (3) | 2024.09.26 |