java는 다양한 버전이 존재한다 그중 많이 쓰이는 버전은 java 8, 11, 17이 세 가지 버전이 많이 쓰이는 이유는 LTS(Long Term Support) 버전으로 LTS버전이란 장기간 보안업데이트와 버그 수정을 지원해 주는 버전이다.

 

JET BRAINS에 웹페이지에서 2021년도 2022년도 사용 통계를 확인

 


 

1. java8

  • 오라클이 자바 인수 후 출시한 첫 번째 LTS 버전
  • 32bit를 지원하는 마지막 공식 Java 버전
  • Oracle JDK(Oracle사에서 지원하는 버전으로 유료) , Open JDK(오픈소스 기반의 무료)로 나뉨
  • 새로운 날짜와 시간 API(LocalDateTime 등)
  • 람다식(Lambda), Stream API
  • PermGen 영역 삭제
  • Static Link JNI Library

 

람다식(Lambda)

함수를 간단한 식으로 표현하는 방법이다. 메서드 이름과 반환값이 생략되서 익명함수(anonymous function)이라고도 불림

int max(int a, int b) {
    return a > b ? a : b;
}

//람다식으로 변환
(a, b) -> a > b ? a : b;

 

Stream API

컬렉션의 저장 요소를 하나씩 순회하면서 처리할 수 있는 코드패턴으로 람다식을 지원하고 내부 반복자를 사용하기 때문에 병렬 처리가 쉽다는 특징이 있음

List<String> lowercase = Arrays.asList("a", "b", "c", "d", "e");
lowercase.stream()
        .map(String::toUpperCase)
        .forEach(System.out::println);

 

interface default method

java 8 이전의 인터페이스는 메서드 정의만 할 수 있고 구현 할 수  없었지만 8 버전부터는 default method라는 개념이 생기면서 구현 내용도 인터페이스에 포함시킬 수 있게

public interface TestInterface {
    void doSomething();
    default void doSomethingDefault() {
        System.out.println("doing something default");
    }
}

//implements the interface
public class TestClass implements TestInterface {
    @Override
    public void doSomething() {
        System.out.println("doing something");
    }
}

TestClass testClass = new TestClass();
testClass.doSomething();          // Output: "doing something"
testClass.doSomethingDefault();   // Output: "doing something default"

 

optional class

optional<T>는 nul이 올 수 있는 값을 감싸는 Wrapper 클래스로 참조하더라도 NPE(Null Pointer Exception)가 발생ㅈ하지 않도록 도와주는 역할을 한다 따라서 예상치 못한 NPE(Null Pointer Exception)이 발생될 상황에서도 예시와 같이 제공되는 메서드를 통해 간단히 예외 처리 가능

//create an optional that contains a value
Optional<String> optional = Optional.of("Hello, world!");
//check if a value is present
if (optional.isPresent()) {
	String value = optional.get();
	System.out.println(value);    // Output: "Hello, world!"
}
		
//create an empty optional
Optional<String> emptyOptional = Optional.empty();
//get a default value if the optional is empty
String value = emptyOptional.orElse("default value");
System.out.println(value);    // Output: "default value"
		
//throw exception
emptyOptional.orElseThrow(() -> new RuntimeException("throw Exception"));

 

2. java 11

  • Oracle JDK와 Open JDK 통합되고 Oracle JDK가 구독형 유료 모델로 전환
  • 람다 지역 변수 사용 방법 변경
  • Third Party JDK로의 이전 필요
  • HTTP 클라이언트 표준화 기능
  • 앱실론 가비지 컬렉터 (Epsilon GC)

 

람다 지역변수 사용 방법 변경

var 키워드는 java 10에서 추가 var 키워드를 사용하는 경우 데이터 유형을 지정하지 않고 변수를 선언하고 정의할 수 있으며 컴파일러는 할당된 데이터 유형에 따라 데[이터 유형을 결정하게 

(var s1, var s2) -> s1 + s2

 

HTTP Client

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

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());

 

3. java 17

  • 봉인 클래스(Seald Class) 정식 추가
  • 패턴 매칭 프리뷰 단계
  • Incubator (Foreign Function & Memory API)
  • 애플 M1 및 이후 프로세서 탑재 제품군에 대한 정식 지원
  • 의사난수 생성기를 통해 예측하기 어려운 난수를 생성하는 API 추가
  • 컨텐츠 기반의 역직렬화 필터링
  • Record Data Class 추가
  • Spring Boot 3.0부터는 자바 17 이상을 지원 

 

Seald Class

17 버전에서 추가된 Seald Class, Interface는 상속하거나(extends), 구현(implements)할 클래스를 지정해 두고, 해당 클래스들만 상속 또는 구현을 허용하는 키워드
개발자는 seald 키워드를 통해 어떤 클래스가 해당 클래스를 상속 또는 구현하는지를 쉽게 알 수 있고, 또 제한할 수 있다.

public sealed class Shape permits Circle, Square {
    // common fields and methods
}

public final class Circle extends Shape {
    // circle-specific fields and methods
}

public final class Square extends Shape {
    // square-specific fields and methods
}

 

Record Data Class

Record 클래스는 불변 데이터를 객체 간에 전달하는 작업을 간단하게 만들어주며 record를 사용함으로 불필요한 코드를 제거할 수 있고 적은 코드로 명확한 의도(data carrier)를 표현할 수 있다.

//Lombok 사용 예시
@EqualsAndHashCode
@ToString
@AllArgsConstructor
@Getter
public class Person {
    private final String name;
    private final String address;
}

//record class 예시
public record Person (String name, String address) { }

 

텍스트 블록(Text Blocks)

멀티라인의 문자열을 이스케이프 시퀸스 없이 사용하여 소스코드 작성을 편리하게 하고 코드의 가독성을 높이는데 주된 목적을 지님

String html1 = "<html>\n" +
        "           <body>\n" +
        "               <p>Hello, world</p>\n" +
        "           </body>\n" +
        "       </html>\n";

// Text Blocks
String html2 = """
        <html>
            <body>
                <p>Hello, world</p>
            </body>
        </html>
        """;

 

 

[결과]

자바의 버전별 사용량을 보았을 때 LTS 버전을 주로 사용하고 Spring Boot 3.0부터는 java17 이상을 지원하여 많은 사용자가 java17로 이전

 

[느낀 점]

자바는 하위호환성이 매우 높아서 상위버전에서 하위버전의 기능을 컴파일이 가능하다 java8에서 공부를 하고 상위 버전에 추가된 기능을 공부하는 것이 좋을 것 같다

 

 

 

 

 

참조 사이트

https://wildeveloperetrain.tistory.com/287

 

Java 8, 11, 17 버전별 추가된 기능 (+ 무슨 버전을 써야할까?)

java 8, 11, 17 버전이 많이 사용되는 이유와 버전별 추가된 기능 최근 몇 년 동안 java에서 가장 많이 사용되는 버전은 'java 8'으로 저 역시 실무에서는 java 8만 계속 사용하고 있는데요. 자바는 2021년

wildeveloperetrain.tistory.com

https://code-lab1.tistory.com/253

 

[JAVA] JRE 와 JDK의 차이? Java 8, 11, 17 에 대하여

JRE, JDK란? 처음 Java를 설치하려고 보니 JRE, JDK 등이 존재하는 것을 확인할 수 있다. 둘의 차이는 무엇일까? 참고) [JAVA] 자바(JAVA)란? 자바의 특징 자바(JAVA)란? 자바는 C언어에 객체 지향적 기능을

code-lab1.tistory.com

 

+ Recent posts