[Java] Java 8,11,17 특징

LDB·2025년 2월 9일
0

Java

목록 보기
3/7
post-thumbnail

작성계기

작성 계기는 내가 면접을 봤을 때로 돌아가야 한다. 면접 때 자바 11과 17의 차이점에 대해 말해보라는 질문을 받았는데 그때 솔직히 잘 모르기도 했고 당황해서 대답을 못 했던 기억이 난다. 그래서 알아봤는데 괜히 11과 17을 비교하는 것이 아니었다. 간략하게 알아보니 두 버전은 큰 차이점이 있었는데 지식을 정리하는 동시에 나중에 면접을 볼 때를 대비해서 작성하기로 했다.


왜 8,11,17일까?

그런데 자바는 버전 1부터 작성일 기준으로 23버전까지 출시되었는데 어째서 8,11,17을 주로 비교하는가 그것은 8,11,17버전들이 LTS (Long Term Support) 그러니까 장기적 지원을 해주는 버전이기 때문이다. 그리고 무엇보다 대한민국에서 가장많이 쓰고있다.

(참고 : https://www.jetbrains.com/ko-kr/lp/devecosystem-2023/java/)


앞에서 장기적 지원을 해준다고 작성했는데 실제 JDK 릴리즈를 확인해보면 다음과 같이 확인 할 수 있다.

위의 End Of Support Life를 보면 다음과 같이 지원하는 것을 볼 수 있다.

  • Java 8 : 2030년 12월
  • Java 11 : 2026년 9월
  • Java 17 : 2029년 9월

(자바 21버전도 LTS버전 이지만 해당 게시글에서는 언급하지 않겠습니다.)


Java 8버전의 특징

  1. Oracle이 Sun microsystems를 인수 후 출시한 첫번째 LTS버전이다.
  2. 32bit를 지원하는 마지막 공식 Java버전이다.
  3. Oracle에서 지원하는 유료버전 Oracle JDK와 무료버전 오픈소스 기반인 Open JDK로 나뉘게 되었다.
  4. LocalDateTime과 같은 새로운 날짜, 시간 API가 추가되었다.
  5. Lambda, Stream API가 추가되었다.
  6. JVM에서 PermGem 영역이 삭제 되었다.
  7. Unsigned Integer 계산추가
  8. Static Link JNI Library
  9. Optional class추가
  10. Annotation on Java Types

Java 8 : Lambda, Stream API

Lambda
일명 람다식이라고 하여 다른이름으로는 익명함수(anonymous function)라고 불리며 람다식은 메서드의 역할을 대신할 수 있으며, 메서드의 매개변수로 전달하는 것도 가능하고, 메서드의 결과로 반환 될 수도 있다. 그래서 람다식을 사용하면 기존의 불필요한 코드를 줄여주고 가독성을 높여준다.

// 인터페이스 상속 방식

interface Cal {
    int add(int x, int y);
    int del(int x, int y);
}

class Test implements Cal{
    public int add(int x, int y){
        return x + y;
    }
    
    public int del(int x, int y){
        return x - y;
    }
}

class Main {
    public static void main(String[] args) {
        Test test = new Test();
        System.out.println(test.add(10,20)); // 30
        System.out.println(test.del(10,20)); // -10
    }
}
// 람다식을 활용한 방식

interface Cel {
    int cel(int x, int y);
}

class Main {
    public static void main(String[] args) {
        Cel lambdaAdd = (x,y) -> { return x + y; };
        Cel lambdaDel = (x,y) -> { return x - y; };
        
        System.out.println(lambdaAdd.cel(10,20)); // 30
        System.out.println(lambdaDel.cel(10,20)); // -10
    }
}

Stream API
Stream은 컬렉션의 저장 요소를 하나씩 순회하면서 처리할 수 있는 코드 패턴이다, 람다식을 지원한다는 점과 내부 반복자를 사용하기에 병렬처리가 쉽다, 그래서 멀티쓰레드 환경에서 주로 사용한다.

class Main {
    public static void main(String[] args) {
        List<String> lowercase = Arrays.asList("a", "b", "c", "d", "e");

        // for문을 활용한 출력방식
        for(int i = 0; i < lowercase.size(); i++){
            System.out.println(lowercase.get(i).toUpperCase());
        }

        // Stream을 활용한 방식
        lowercase.stream().map(String::toUpperCase)
                          .forEach(item -> System.out.println(item));
    }
}

Java 8 : JVM에서 Perm Gem 영역이 삭제

Perm영역은 보통 클래스, 메서드의 메타 정보, static 변수와 상수 정보들이 저장되는 공간으로 메타데이터 저장영역이다, 하지만 Java 8버전에서 Perm 영역이 Metaspace 영역으로 전환되면서 사라지게 되었다. 그로인해 Metaspace영역은 Java Heap영역이 아닌 Native메모리 영역이 되었다.

(다만, 기존 Perm 영역에 존재하던 Static Object는 Heap 영역으로 옮겨져서 GC의 대상이 최대한 될 수 있도록 하였다.)

Java 7Java 8
Class 메타 데이터저장저장
Method 메타 데이터저장저장
Static Object 변수, 상수저장Heap 영역으로 이동
메모리 튜닝Heap, Perm 영역 튜닝Heap 튜닝, Native 영역은 OS가 동적 조정

Java 8 : Unsigned Integer 계산추가

Unsigned Integer는 쉽게 말하면 0과 양수만(4,294,967,295 까지) 표현이 가능하도록 만들어진 타입이다.

C/C++등 네이티브 코드를 호출할 수 있다. 일반적으로 JNI를 사용하면, 네이티브 라이브러리는 동적 라이브러리(.so, .dll, .dylib)로 로드된다. 하지만 Static Link JNI Library를 사용하면 정적 라이브러리(.a, .lib)를 사용하여 네이티브 코드와 Java 애플리케이션을 정적으로 연결할 수 있게 되었다.

(Chat GPT로 검색한 결과 입니다.)


Java 8 : Optional class추가

옵셔널은 null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 참조하더라도 NullPointerException이 발생하지 않도록 도와주는 역할을 한다.

Java 8 : Annotation on Java Types

Java 8에서는 자바 타입이 사용되는 곳에 어노테이션(@)이 적용 가능해졌는데 Java 8 이전에는 어노테이션은 오직 선언문에만 가능했다. 이기능은 타입 어노테이션이라 불리며 어노테이션을 이용하여 타입체크를 더욱 강력하게 할 수있게 되었다.


Java 11버전의 특징

  1. Oracle JDK와 Open JDK가 통합되고 Oracle JDK가 구독형 유료 모델로 전환
  2. 람다 지역 변수 사용 방법이 변경
  3. Third Party JDK로의 이전 필요
  4. HTTP 클라이언트 표준화 기능
  5. G1 가비지 컬렉터 도입

Java 11 : HTTP 클라이언트 표준화

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://test-api.com/posts"))
        .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

자바 11버전에서 도입된 Java HttpClient API는 최신 HTTP 표준의 클라이언트를 구현하며, 동기 및 비동기 프로그래밍 모델인 HTTP/1.1 및 HTTP/2를 지원한다.

(자바 11이전에는 기본적인 URL Connection 구현 또는 Apache HttpClient등의 타사 라이브러리에 의존해야했다.)


Java 11 : G1 가비지 컬렉터

엄밀히 말하자면 G1 가비지 컬렉터는 자바 9버전 부터 G1 가비지 컬렉터가 기본으로 제공되었다.

장점
1. stop-the-world 없이도 여유 메모리 공간을 압축하는 기능을 제공한다.
2. 해당 세대의 일부분에 대해서만 압축이 된다.
3. Heap 크기가 클수록 잘 동작한다.
4. CMS에 비해 개선된 알고리즘을 사용하고, 처리속도가 빠르다.
5. Garbage로 가득한 역역을 빠르게 회수하여 빈 공간을 확보하므로 GC 빈도가 줄어든다.

G1 GC의 특징을 자세히 알고 싶으면 하단의 게시글을 참고바람
https://youn0111.tistory.com/67


Java 17버전의 특징

  1. 봉인 클래스(Seald Class) 정식 추가
  2. 패턴 매칭 프리뷰 단계
  3. Incubator (Foreign Function & Memory API)
  4. 애플 M1 및 이후 프로세서 탑재 제품군에 대한 정식 지원
  5. recode class 키워드 사용 가능
  6. 난수 생성 API 추가
  7. String 여러줄 사용시 텍스트 블록 기능 사용 가능
  8. NumberFormat,DateTimeFormatter 기능 향상
  9. Stream.toList() 사용 가능

참고 사이트

https://youn0111.tistory.com/67

https://blog.naver.com/kbh3983/220769653557

https://kirkim.github.io/etc/2021/06/13/unsigned.html

https://johngrib.github.io/wiki/java8-why-permgen-removed/

https://steady-coding.tistory.com/309

https://cheerup313.tistory.com/86

https://juran-devblog.tistory.com/262

https://wildeveloperetrain.tistory.com/287

profile
가끔은 정신줄 놓고 멍 때리는 것도 필요하다.

0개의 댓글

관련 채용 정보