Java 종류
1. Java SE
- Java Standard Edition / J2SE
- 가장 많이 사용하는 표준 에디션
2. Jakarta (Java EE)
- Java Enterprise Edtion / J2EE
- 기업에서 사용하는 서버에 특화된 에디션
3. Java ME
- Java Micro Edition / J2ME
- 임베디드에 특화된 에디션
4. JavaFX
- 데스크탑 어플리케이션 개발 및 배포
Java LTS 버전
- LTS란 Long-Term Support의 약자로 장기간 지원하는 버전을 의미한다
- Java 9부터는 6개월마다 버전 업데이트를 진행하기로 하여, jdk 서비스 기간이 짧다
- 즉, 6개월이 지나면 지난 버전에 대한 서비스는 지원하지 않는 것이다
- 따라서 Java 측에서는 이에 대한 대책으로 내놓은 것이 LTS 버전이다
- LTS 버전은 6개월이 지나고 새로운 버전이 나와도 몇 년간 더 지원을 한다
- LTS 버전은 3년마다 새로운 버전이 나왔으며, java 17이후로는 2년마다 출시한다고 한다
- 현재까지 출시된 LTS 버전으로는 다음과 같다
- 2014년 java 8
- 2017년 java 11
- 2021년 java 17
- 따라서 대부분의 기업들은 보다 안정적인 LTS 버전을 사용한다
📚 Java 버전
Java는 앞에서 언급했다시피 6개월마다 한번씩 새로운 버전을 내놓기 떄문에 모든 버전을 살펴보는 것은 무리가 있다
따라서 LTS 버전인 java 8, 11, 17 의 주요 기능들을 중점적으로 살펴보도록 하자!
Java 7
- Switch 문 인자로 String 허용
- 자동으로 finally에서 리소스 관리
- 제네릭 인스턴스 생성 시 type 생략이 가능
🎇 Java 8
1) Lamda 표현식 사용
- 함수형 프로그래밍을 자바에서 가능하도록 해준다
- 별도의 함수를 작성하지 않고 화살표를 통해 간단하게 코드 작성이 가능해졌다
- 함수형 프로그래밍, 스트림 API, 컬력센 프레임워크의 개선 등에 영향을 주었다
2) Stream
- 반복문 처리하는 방법 중 하나이다
- Stream API를 통해 컬렉션을 처리하면서 발생하는 모호함과 반복적인 코드 문제를 해결하였다
- 병렬 처리가 가능하다 -> 스레드 풀에 스레드가 남은 경우 해당 스레드를 이용하여 병렬처리하기 떄문에 속도가 빨라진다
3) Interface에 default 메서드 추가
- 클래스에서 인터페이스를 구현해서 사용하는데 공통 함수의 경우 매번 구현해줘야 하는 문제를 해결하기 위해 default 키워드가 추가되었다
- default를 통해 공통으로 정의되는 함수를 인터페이스 안에서 구현이 가능해졌다
4) Optional
- Optional : null이 될 수 있는 객체를 감싸는 래퍼 클래스 (rapper class)
- 이를 사용하면 null로 인한 오류(NullPointerException)를 줄일 수 있다
Java 9
1) Modules
- 우리가 사용하는 패키지가 클래스들의 묶음이라면, 모듈이란 패키지의 묶음이다
- 기존 패키지 방식의 문제점
- 기본 패키지 방식은 여러 클래스에서 공용으로 사용되는 클래스를 외부에서 숨길 수가 없었다
- 그러면 라이브러리 내부 뿐만 아니라 외부에서도 클래스에 접근이 가능하다는 문제가 있다
- 또한 런타임 시 사용하지 않는 클래스들도 모두 포함해야 했다
- Java 9부터는 모듈화를 통해 패키지를 캡슐화하고 패키지 방식의 문제점을 해결할 수 있게 되었다
- 모듈화는 이보다 훨씬 큰 개념이기 때문에 관심이 있다면 따로 공부해보길!
2) Interface private method
- Interface에서도 private 메소드를 사용할 수 있게 되었다
- private 메서드를 사용하여 메서드를 분리할 수 있고, 중복되는 코드를 재사용할 수 있게 되었다
- private static 또한 사용할 수 있게 되었다
3) 불변 컬렉션 생성
- java 9 이전에는 불변 컬렉션 생성을 위해 많은 양의 코드가 필요했다
- 그러나 자바 9 버전에서는 of() 메서드를 지원하여 불변 컬렉션을 보다 편리하게 생성할 수 있다
4) Compact String
- 자바는 내부적으로 UTF16을 사용하기 때문에 모든 문자가 2 byte로 구성되고, 1 byte로 표현할 수 있는 영어도 빈 공간을 사용하여 2 byte로 저장해야 했다
- 자바 6 버전은 VM 옵션을 활성화하여 문자열을 char 배열 대신에 byte 배열로 저장할 수 있었으나, 성능 문제로 자바 7 버전에서 삭제되었다
- 다시 자바 9 버전에서 Compact String으로 등장하여 1 byte로도 저장이 가능해졌다
5) Try-with-resource 향상
- 자바 7에 추가된 try-with-resource는 자원을 try 문 밖에서 할당하는 경우, 그 변수를 try 문 안에서 바로 사용이 불가능하였다
- 따라서 try 문 안에서 다시 초기화를 했어야 됐다
- 그러나 자바 9 버전에서는 try 문 밖에서 할당한 변수도 try 문 안에서 바로 사용이 가능해졌다
6) Optional API 추가
- or()
- orElseGet()이나 orElse()와 달리 Optional 객체를 리턴한다
- 따라서 Optional을 반환하는 코드로 연쇄적으로 사용이 가능해졌다
- ifPresentOrElse()
- Optional 객체가 비어있을 경우 처리할 내용까지 정의가 가능하다
- stream()
- Optional 객체를 Stream 객체로 변환할 수 있다
- Stream API를 통해 Optional을 보다 유연하게 사용이 가능해졌다
Java 10
1) Local variable type interface (로컬 변수 타입 추론)
- var는 키워드가 아니기 때문에 변수나 메서드 명으로 사용할 수 있다
- var는 인스턴스 변수로 사용이 불가능하고, 반드시 초기화를 해야 한다
- 자바는 불변 변수에 대한 키워드 제공을 위해 final var를 사용해야 한다
- var 형식의 지역 변수에 익명 클래스를 할당하면 부모가 아닌 익명 클래스 형식을 유추한다
- 즉, 익명 클래스에 선언된 필드를 참조할 수 있다
- 지역 변수 타입 추론만을 허용하기 떄문에 메서드 내부의 변수에만 적용이 가능하다
2) Optional.orElseThrow()
- 자바 10 버전 이전에는 반드시 예외를 명시해야 했다
- 그러나 10 버전 이후로는 인자 없이 사용이 가능해졌다
- 인자 없이 사용하여 객체가 비어 있을 경우, NoSuchElementException()을 발생하게 된다
3) Unmodifiable Collections
- 컬렉션을 복사하거나 수정 불가능한 컬렉션을 반환하는 기능들이 추가되었다
🎇 Java 11
1) String과 File API 추가
- repaet(int) : 반복할 횟수를 입력받아서 문자열을 반복해주는 메서드
- lines() : 라인 단위로 분할하여 Stream으로 변환해주는 메서드
- 위의 메서드들은 공백과 관련된 메서드들로, trim() 과는 달리 유니코드의 공백 문자를 인식한다
- strip() : 문자열 앞과 뒤의 공백을 제거하는 메서드
- stripLeading() : 문자열 앞의 공백을 제거하는 메서드
- stripTrailing() : 문자열 뒤의 공백을 제거하는 메서드
- isBlank() : 문자열이 비어있거나 공백만 있는 경우 true를 반환하는 메서드
- writeString() 과 readString() 메서드가 추가되었다
- Files의 정적 메서드를 사용하여 파일에서 String을 읽고 쓰는 것이 더욱 쉬워졌다
- 기존에는 List를 Array로 변환할 때 배열의 사이즈를 지정해서 배열로 변환하였다
- 자바 11버전에서는 toArray() 메서드를 통해 인자로 IntFunction을 받아서 보다 편리하게 사용할 수 있도록 변경되었다
2) Local-Variable Syntax for Lambda
var를 lambda 표현식의 매개변수로 사용할 수 있도록 확장되었다
var를 매개변수로 사용하게 되면, 위와 같이 어노테이션을 사용할 수 있게 된다
var를 통해 굳이 클래스 타입을 정의해주지 않아도 알아서 판단해준다
3) HttpClient
자바에서도 Http 통신 요청을 보낼 수 있는데, 이전에는 자바에서는 공식적으로 지원하지 않았다
그래서 그동안은 아파치에서 만든 라이브러리를 사용했다
그러나 이제 지원해서 Java 표준 Http Client가 생기고 성능도 좋아졌다
Java 12
- 자바 12 버전에도 여러가지 기능이 추가되었지만, 언급할 가치가 있는 것은 유니코드 11 지원과 새로운 스위치 표현식의 preview 뿐이다
Java 13
- 자바 13 버전에도 많은 기능이 업데이트 되었지만, 유니코드 12.1 지원과 개선된 2가지의 preview 기능만 보도록 하자
1) 스위치 표현식 (preview)
- 이제 스위치 표현식이 값을 반환이 가능해졌다
- 그리고 fall-through/break 문제 없이 표현식에 람다 스타일 구문을 사용할 수 있게 되었다
2) Multiline Strings (preview)
Java 14
- 자바 14 버전에서 주목할 만한 부분은 스위치 표현식의 표준화와 preview 기능인 instanceof 패턴 매칭, record 선언 기능 추가가 있다
1) 스위치 표현식 (standard)
- 자바 버전 12와 13에서 preview 였던 스위치 표현식이 표준화되었다
2) record (preview)
- record는 불변 데이터 객체를 쉽게 생성할 수 있도록 해주는 클래스이다
- record는 데이터 클래스로, 순수하게 데이터를 보유하기 위한 특수한 종류의 클래스이다
- 데이터의 유형만 나타내는 느낌이기 떄문에 훨씬 간결하고 가볍다
- 주로 Entity 혹은 DTO 클래스를 생성할 때 사용하면 좋을 듯 싶다
- record는 final 클래스이기 때문에 상속이 불가능하며, 각 필드는 private final로 정의된다
- 또한 각 필드의 getter는 getXXX 가 아닌, 필드명을 딴 getter가 생성된다 -> x(), y()
3) Pattern Matching For InstanceOf (preview)
4) 유용한 NullPointerExceptions
- NullPointerExceptions는 정확히 어떤 변수가 null인지 설명하는 것이 추가되었다
Java 15
1) Text-Blocks / Multiline Strings
- Java 13의 실험 기능으로 도입된 여러 줄 문자열은 이제 프로덕션 준비가 완료되었다
- Multiline Strings 형식을 통해 Java 문자열을 보다 가독성 있게 작성하도록 도와준다
2) Sealed Classes (preview)
- 상속 가능한 클래스를 지정할 수 있는 봉인 클래스가 제공된다
- 상속 가능한 대상은 상위 클래스 또는 인터페이스 패키지 내에 속해 있어야 한다
- 즉, 클래스가 public인 동안 하위 클래스로 허용되는 유일한 Shape 클래스들은 Circle, Rectangle 및 Square 이다
이 외에도 다음과 같은 기능들이 추가되었다
- 스케일링 가능한 낮은 지연의 가비지 컬렉터 추가 (ZGC) : Stop-the-world로 인한 성능 저하 개선 목적
- Nashorn JavaScript Engine 제거
Java 16
1) Unix-Domain Socket Channels
- 이제 Unix 도메인 소켓에 연결할 수 있다 (macOS 및 Windows(10+)에서도 지원됨)
2) Foreign Linker API - Preview
- JNI(Java Native Interface)에 대한 계획된 교체로, 기본 라이브러리에 바인딩할 수 있다(C 생각)
이 외에도 다음과 같은 기능들이 추가되었다
- Pattern Matching for instanceof
- Records & Pattern Matching
🎇 Java 17
1) Pattern Matching for switch (Preview)
이제 객체를 전달하여 기능을 전환하고 특정 유형을 확인할 수 있다
2) Sealed Classes (Finalized)
- Java 15에서 preview 제공되었던 기능 완료
3) Foreign Function & Memory API (Incubator)
Java Native Interface(JNI)를 대체한다. 기본 함수를 호출하고 JVM 외부의 메모리에 액세스할 수 있다. 지금은 C가 C++, 포트란과 같은 추가 언어 지원 계획을 가지고 있다고 생각
4) Deprecating the Security Manager
자바 1.0 이후로 보안 관리자가 존재해 왔었지만 현재는 더 이상 사용되지 않으며 향후 버전에서는 제거될 예정
🤔 JDK 17 버전 사용을 고려해볼만한 이유
1) Java Supprot 기간이 길다
현재까지 자바에서 공식적으로 발표한 내용에 따르면 8버전의 지원기간이 17버전보다 상대적으로 조금 더 길긴 하다
그러나 17버전의 지원 기간이 절대적으로 짧지는 않으며, 17 버전의 기간 만료 전 또 다른LTS 버전을 공개할 것으로 예상된다
2) 신규 버전을 위한 대비
Java 8 버전의 지원 기간이 늘어나긴 했지만, 지원 종료일이 도래하여 다른 최신 LTS 버전으로 전환하는 것보다 현재까지 출시된 17버전까지의 기술 적응을 완료한 후 전환하는 것이 영향의 최소화가 되어 17 버전으로의 전환을 고려하는 기업들도 있다고 한다
3) 다음 세대 플랫폼 호환 준비
현재까지 나온 스프링 공식 로드맵 상, 2022년 11월 출시 예정인 Spring Boot 3.0 부터는 JDK 17 이상을 지원한다고 한다
참고)
https://yummy0102.tistory.com/511
요건 JDK, JRE, JVM이 헷갈릴 때 참고하면 좋은 글~^^
JDK 버전이 곧 Java 버전이라고 생각하면 된다!
https://www.youtube.com/watch?v=_6YP2FNTt80
https://www.youtube.com/watch?v=LcIyHlE2NlA
https://developercc.tistory.com/6
https://highright96.tistory.com/70
https://intrepidgeeks.com/tutorial/differences-and-features-of-different-java-versions
'야미스터디 > Java' 카테고리의 다른 글
[Java] JPA 1차 캐시 📌 (1) | 2022.10.18 |
---|---|
[Java] Checked Exception vs Unchecked Exception 📌 (1) | 2022.10.14 |
[Java] JDK, JRE, JVM (0) | 2022.09.04 |
[Java] Java 컴파일 과정 📌 (0) | 2022.09.04 |
[Java] 스네이크, 카멜, 파스칼 케이스 📌 (0) | 2022.09.03 |
댓글