Java를 하는 개발자로써 개발 환경마다 java의 버전이 다르다면,
이에 대해서 정확하게 구분할 줄 알아야합니다.
그래서 java 버전에 따라 어떤 차이점이 있는지 구분해 보았습니다.
어떤 서비스를 많이 사용하는가?
jetbrain에서 조사한 바에 따르면 java8이 아직 많은 개발에 사용되고 있지만 21년 기준 java 17의 사용이 월등히 많이 늘었다는 것을 비교해 볼 수 있습니다. (참고 : jetbrain 분석 )
그리고 java의 서비스 종료 기간도 확인해보면 8은 2030까지 지원하고, 17이 8과 비슷한 것을 알 수 있습니다. 아마 서비스 기간때문에 더 8과 17을 많이 사용하지 않을까 생각합니다.
그리고 최근 17을 많이 사용하게 된 이유는 2022년에 출시된 Spring Boot 3.0이 17버전 이상을 지원하기 때문입니다. 즉, 17 이전 버전을 사용하면 Spring Boot 3.0버전을 사용하지 못한다는 것입니다. (참고 : 여기 어때 개발자의 17버전 사용이유 )
그렇다면 지원하는 서비스가 어떻게 다른지도 알아보겠습니다.
서비스 별 차이점
Java 8
자바 8의 경우 이전 버전에 비해 기능적으로
- 람다식(Lambda expressions)
- 함수형 인터페이스 (Functional Interface)
- 디폴트 메서드 (Default Method)
- JVM의 변화
- 병렬 배열 정렬(Parallel Array Sorting)
- 컬렉션을 위한 대용량 데이터 처리 ( 스트림 )
- Optional 기능
- Base64 인코딩과 디코딩을 위한 표준 API
- 새로운 날짜, 시간 API (Date & Time API)
- 오라클이 java를 인수한 후 첫번째 LTS 출시 버전
- 32비트를 지원하는 공식적인 마지막 버전
- 유료버전(Oracle JDK)과 무료버전(Open JDK)으로 나뉨
- PermGem 영역 삭제(이 부분은 스레드 풀을 공부하면 알수 있습니다.)
Java 11
- Open JDK와 Oracle JDK 통합
- Oracle JDK가 구독형 유료모델로 전환
- G1 GC가 기본 GC로 설정 (GC : Garbage Collection)
- 람다 지역변수 var 키워드 사용 가능
- 컬렉션, 스트림 등에 메소드 추가
Java 17
- recode class 키워드 사용 가능
- 애플 M1 및 이후 프로세서 탑재 제품군에 대한 정식 지원
- 난수 생성 API 추가
- 봉인 클래스(Sealed Class) 정식 추가
- String 여러줄 사용시 텍스트 블록 기능 사용 가능
- NumberFormat,DateTimeFormatter 기능 향상
- Stream.toList() 사용 가능
이 기능들을 예로들어 알아보겠습니다.
변화된 기능(Java 11)
Collection Factory Method 강화
Set, List, Map 인터페이스에 Immutable 생성할 수 있는 새로운 메서드가 추가 되었습니다.
변경 전
Set<String> set = new HashSet<>();
set.add("제이든");
set.add("Jayden");
List<String> list = new ArrayList<>();
list.add("제이든");
list.add("버나드");
list.add("자이노");
list.add("메이슨");
list.add("엘빈");
Map<String, String> map = new HashMap<>();
map.put("J","Jayden");
map.put("B","Bernard");
map.put("Z","Zino");
map.put("M","Mason");
map.put("E","Elvin");
변경 후
Set<String> set = Set.of("제이든", "Jayden", "개발3팀");
List<String> list = List.of("제이든", "버나드", "자이노", "메이슨", "엘빈");
Map<String, String> map
= Map.of(
"J", "Jayden",
"B", "Bernard",
"Z", "Zino",
"M", "Mason",
"E", "Elvin");
그리고 해당 set, list, map에 추가, 수정, 삭제를 하는 경우 아래와 같이 시도할 수 있습니다.
Set<String> set = Set.of("제이든", "Jayden", "개발3팀");
Set<String> cusSet = new HashSet<>(set);
cusSet.add("여기어때컴퍼니");
List<String> list = List.of("제이든", "버나드", "자이노", "메이슨", "엘빈");
List<String> cusList = new ArrayList<>(list);
ccusList.add("여기어때");
Map<String, String> map
= Map.of(
"J", "Jayden",
"B", "Bernard",
"Z", "Zino",
"M", "Mason",
"E", "Elvin");
Map<String, String> cusMap = new HashMap<>(map);
cusMap.put("GC", "GC Company");
로컬 변수 타입 추론 “var”
로컬 변수 선언 시, “타입 추론”을 이용하여 명시적 타입 선언 없이도 변수 선언이 가능하도록 지원하는 신규 Keyword입니다.
기존 Lombok Library에서 지원하던 기능이었으나, JDK 10 버전에 등장하며Java에서 공식 지원하였습니다. 이후 LTS 버전인 JDK 11부터는 람다 타입에서도 사용 가능하도록 지원하고 있습니다.
컴파일 시 변수 타입을 추론하기 때문에 성능에 영향을 주지는 않습니다. 그러나 가독성 높은 코드 작성을 위해 무분별한 “var” Keyword 이용은 지양하는 것이 좋겠습니다.
신규 문자열 Method 추가
문자열 내 공백 확인/제거 등 JDK 11 버전부터 String에 여러 편리한 기능을 지원하는 새로운 Method들이 추가 되었습니다.
- isBlank: 문자열이 비어있거나 공백이면 True 반환
- lines: 줄 단위로 나뉘어 있는 문자를 배열로 반환
- strip: 문자열 공백 제거 (기존 “trim()”이 ‘\u0020’ 이하 공백만을 제거 하였다면, “strip()”은 유니코드의 공백들을 전부 제거)
- stripLeading: 문자열 앞의 공백을 제거
- stripTrailing: 문자열 뒤의 공백을 제거
- repeat: 문자열을 파라미터로 주어진 수 만큼 반복
변화된 기능(Java 17)
텍스트 블록
Java 15이상부터 지원하는 기능입니다.
String message = """
[
{
"type": "header",
"text": {
"type": "plain_text",
"text": "text",
"content": "content"
}
}
]
"""
TextBlock 내 데이터를 동적으로 다루게 될 경우 %s 문자와 format Method를 이용하여 구현할 수 있고, 또한 블록 내 “+” 연산자를 이용하여 구현할 수도 있습니다.
위 예시처럼 Java 문자열을 가독성 있게 관리 할수 있도록 만들어줍니다.
Switch 표현식 기능 향상
1. Switch문 값 직접 반환
2. yield 예약어 이용한 값 리턴 방식 추가
3. Case문 람다식 지원
var randomNames = new String [] {"Jayden", "Bernard", "Zino", "Mason", "Elvin"}[(int) (Math.random() * 5)];
String name = switch(randomNames) {
case "Jayden", "jayden" -> {
System.out.println("Me!");
yield "제이든";
}
case "Bernard", "bernard" -> "버나드";
case "Zino" -> "자이노";
case "Mason" -> "메이슨";
case "Elvin" -> "엘빈";
default -> "What's your name";
};
intellij에서 사용해보면 기존의 방식으로 작성했을 경우 이를 람다식으로 자동으로 변형해주는 것을 확인할 수 있습니다.
조금 더 개발자가 확인하기에 직관적이고, 알아보기 쉽도록 구현되어있습니다.
이 기능 외에도 추가적으로 더 있으며 추가로 올리도록 하겠습니다.
'기술 스텍 > Java' 카테고리의 다른 글
[Java] Record란? (0) | 2024.04.05 |
---|---|
[Java] 프로세스 vs 스레드? (0) | 2024.02.21 |
Casting 이란? (0) | 2024.02.17 |
Object 클래스란? (0) | 2024.02.07 |
직렬화란? (0) | 2024.02.03 |