본문 바로가기
개발자의삶/Java

Java 버전별 특징 및 GC 의 변화

by 트라네스 2022. 11. 17.
728x90
반응형

 한 2년 전쯤 N사에 면접을 볼 기회가 생겼으나 그 당시 의미를 잘 이해하지 못해서 답변을 못했던 것을 좀 정리해보고자 한다. 그중 하나가 바로 Java의 버전별 특징에 대한 내용이었다. 정작 지인에게 물어보자 아마 상세 특징보다는 Major 변화 정도는 체크하고 있는지만 확인하는 것이었을 것이라고 했던 것 같다. 여하튼 당시에 대답을 잘 준비하지 못해서 좀 당황했던 내용을 정리하고자 한다. 사실 여기저기 널려있는 자료들을 취합해서 정리한 것이라 100% 정확도는 아님을 먼저 이야기한다. 하지만 크로스체크를 거쳤으니 대부분은 사실일 것이다.

 

Java 버전별 업데이트 중요기능 확인

1.8의 특징(LTS)

 여태껏 재직했던 회사에서 대부분 사용하고 있는 Java의 버전인 것으로 알고 있다. 아직까지 왜인지는 모르겠지만 잘 위로 올라가지 않는 조직의 습성이나 레퍼런스의 부족과 다 같이 쓰기로 한 표준이 업데이트가 안 되는 것으로 보인다.

 

 여하튼 가장 중요한 기능들 몇가지만 정리해보고자 한다.

1. 오라클 인수 이후로 Oracle JDK와 Open JDK 두 가지로 나뉘었다.
2. Lambda, new Date and Time API(LocalDateTime, …) 등을 지원한다.
3. Optional
4. Stream
5. PermGen 영역 제거
6. 32비트를 지원하는 마지막 공식 Java 버전으로, 이후 버전의 32비트 지원은 오직 서드파티를 통해서만 지원한다.

9의 특징

1. 모듈 시스템 등장(jigsaw)
jigsaw 란 무엇일까? 아래 글을 참조하면 좋았습니다. 모듈화를 통하여 배포의 경량화 및 캡슐화 지원을 통하여 내부용 API의 호출을 캡슐화합니다. 즉, 사용자가 외부 lib를 가져와서 사용할 때 내부용을 호출하는지 외부용을 호출하는지를 잘 모르고 사용하지 않도록 하여 라이브러리 업데이트 시 외부용 API 만 호출하도록 되어있다면 내부용 API는 수정하더라도 크게 문제가 발생하지 않도록 유지보수성을 높여줍니다. 
https://greatkim91.tistory.com/197

 

10 의 특징

1. var 키워드 추가(타입 추론)
2. 병렬 가비지 컬렉션으로 GC 성능 향상
// Java 10 이전
String kkul = "Kkul";

// Java 10 에서는
var kkul = "Kkul"

 

11의 특징(LTS)

1. Oracle JDK와 Open JDK의 통합(Oracle JDK의 구독 서비스로 변경)
2. Epsilon 와 ZGC의 추가
Epsilon GC는 제한된 메모리 영역을 할당하여 GC 가 일어나게 되면 JVM을 Stop 시키는 경량화 프로그램에 적합
ZGC는 그동안 프로그램의 골치거리인 "Stop the World"를 10ms 이내로 성능을 대폭 강화한 GC 

GC에 대해서 좀 더 공부하고 싶다면 아래 URL 을 참고하면 좋습니다.

https://beststar-1.tistory.com/16

 

가비지 컬렉터(Garbage Collector) - 가비지 컬렉션 종류와 알고리즘

배경 지난번 가비지 컬렉션의 개념과 힙 영역에서의 가비지 컬렉션 프로세스에 대해 알아봤다. beststar-1.tistory.com/15 JVM(Java Virtual Machine) - 5. 실행 엔진 - 가비지 컬렉터(Garbage Collector) - 가비지 개

beststar-1.tistory.com

 

12의 특징

1. Switch 문의 확장 
 case 문의 : 를 ->로 대체할 수 있게 되었으며 break의 생략이 가능해졌다.
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(1);
    case TUESDAY                -> System.out.println(2);
    case THURSDAY, SATURDAY     -> System.out.println(3);
    case WEDNESDAY              -> System.out.println(4);
}

 

13의 특징

1. Switch 문에 람다 형식으로 사용이 가능하다.
2. Switch 문에 yield 키워드를 추가하여 좀 더 간결하게 사용이 가능해졌다.(13과 14의 경계가 모호하다.)
// condition3 에 해당하면 day 의 length 에 1을 더해서 반환한다.
public void checkDay(String day) {
        int cnt = switch (day) {
            case condition1 -> 0;
            case condition2 -> 1; 
            case condition3 -> {
                // yield는 block 안에서만 유효하다.(Block {} 을 벗어나면 에러 발생하니 주의)
                int length = day.length();
                int result = length+1;
				yield result;
            }
            default -> 0;
        };
}

 

14의 특징

1. Instanceof 패턴 매칭(캐스팅 생략 가능 - Preview 단계)
2. record 선언 기능 추가(Preview 단계)
 => 보통은 spring에서 제공하는 @Data로 해결하지만 getter와 setter를 생략해주는 record 가 추가됨
//14 이전 
class Point(int x, int y){
    private int x;
    private int y;
    Point(int x, int y){
        this.x = x;
        this.y = y;
    }
    int getX(){
        return this.x;
    }
    int getY(){
        return this.y;
    }
    void setX(int x){
        this.x = x;
    }
    void setY(int y){
        this.y = y;
    }
}
//14 에서
record Point(int x, int y) { }

 

15의 특징

1. EdDSA 암호화 알고리즘 추가
2. 패턴 매칭 (2차 Preview)
3. 스케일링 가능한 낮은 지연의 가비지 컬렉터 추가(ZGC) - 정식 도입
4. Solaris 및 SPARC 플랫폼 지원 제거
5. 외부 메모리 접근 API (인큐베이팅)
6. 레코드 (2차 Preview)
7. 클래스 봉인 (Preview)
8. 다중 라인 텍스트 편집
// 다중 텍스트 편집(예전에는 줄 바꿈과 공백을 특수문자로 삽입했으나 그럴 필요가 없어짐)
String kkulbung = """
              <html>
                  <body>
                      <p>Hello, kkulbung</p>
                  </body>
              </html>
              """;

 

16의 특징(Major 업데이트이긴 하나 LTS는 아님)

1. Vector API
2. 자바 네이티브(JNI 등) 개발 시 C++14 규격을 지원하기 시작
3. 자바 11부터 시작했으며 15부터 정식으로 도입한 ZGC 기능이 향상
4. 유닉스 도메인 소켓이 지원
5. 자바 8부터 제거된 악명 높은 PermGen 대신 Metaspace 방식을 지원하기 시작
6. 값 유형의 클래스를 동기화에 사용 시 경고 메시지가 개선
7. jpackage 명령어를 통해 각 운영체제별 자바 프로그램을 설치 패키지(pkg, deb, msi 등)로 생성하는 기능이 정식으로 추가
8. 패턴 매칭이 정식 기능으로 추가
9. Record 형식 정식 지원

 

17 의 특징(LTS)

1. 패턴 매칭은 여전히 Preview 
2. 애플릿이 완전히 제거될 예정으로 Deprecated
3. 봉인 클래스가 정식 추가(Sealed Classes)
4. 어려운 난수를 생성하는 API 정식 추가(RandomGenerator)

 

 마치며

 생각보다도 많은 기능들이 추가가 되어있으며 jdk를 업그레이드하지 않아서 누리지 못한 혜택도 있었다고 생각한다. 사실 왜 jdk를 이 버전을 골라야 하는가를 생각해본 적이 없었는데 기능과 GC 등을 보면서 그동안 운영되고 있는 프로그램에 배치성으로 데이터 연산을 수행할 경우 Stop the world 등으로 JVM이 뻗는 경우가 많았는데 ZGC를 이용하면 좀 더 안정적으로 돌릴 수 있지 않을까?라는 생각을 하게 되었고 jdk를 올리게 되면서 겪을 수 있는 문제점(없어지는 API 등을 고려한다던지하는)들을 한 번쯤 고민해보는 시간이 되었던 것 같다. 도움이 필요로 하는 이들이 이 글을 읽으며 약간이나마 도움이 되었으면 좋겠다. 읽어주셔서 감사합니다. 오늘도 공부합니다.

728x90
반응형

댓글


TOP

TEL. 02.1234.5678 / 경기 성남시 분당구 판교역로