본문 바로가기

자바

Java 8, 11, 17

 

Java  8, 11, 17 버전 설명 및 추가 기능

 

java에서 가장 많이 사용되고 있는 버전은 `java 8`로 필자도 실무에서는 java 8을 사용하고 있습니다.

2019년 9월 공개된 LTS버전 java 17이후로도 현 2024년 4월 기준으로 JAVA 21 또한 추가적으로 공개되었습니다.

 

JAVA 버전 사용 조사

Jetbrains 에코시스템 2023 자바 버전 사용 조사 (출처 : https://www.jetbrains.com/lp/devecosystem-2023/java/)


작년 기준으로 자바 생태게에서는 8, 11, 17가 많이 사용되고 있으며 각 버전별 특징 및 추가 기능을 정리해보겠습니다.

위 세 버전 LTS(Long Term Support)로 장기간에 걸쳐 지원하도록 고안된 소프트웨어 버전을 뜻합니다.

 

 

JAVA 8 에서 JAVA 17로

해가 지날 수록 Java 8에서 java 17로 사용량이 변화되고 있는것으로 보이며 java 17의 사용량은 이전 LTS버전인 11보다 급격히 증가하고 있습니다.

 

이러한 이유를 몇가지를 정리하자면

 

1. JAVA서포트 기간이 길다. (LTS)

아래 표를 보면 java 8이 가장 서포트 기간을 가지고 있으나, 11보다 17의 버전의 서포트 기간이 길며 이는 버전 변경에 17이 우위를 가질 수 있는 장점이 됩니다.

java LTS

 

2. 신규 버전을 위한 대비용으로 도입이 됩니다.

최신 버전을 도입보다는 마이그레이션이 수월할 것으로 보임

 

3. Spring Boot3, Spring 6는 자바 17부터 지원이 됩니다.

스프링 프레임워크는 많은 사랑을 받고 있는 프레임워크로 해당 버전을 이요하는 많은 개발자들은 버전 업을 위하여 17로 많이 사용하게 되는것으로 보입니다.

spring 6.0 -java version

 

버전 선택은?

`어떤 버전을 사용하는것이 좋을까?` 이는 각 자의 개발 환경에 맞춰 최선의 선택을 진행하기에 우선순위를 정할 수는 없습니다.

 

전체적인 자바 생태계의 변화에 따라서는 `spring boot 3.0`이 java 17을 사용해야하는 이유 및 java 8의 사용량이 줄어는 것으로 보아, 신규 프로젝트 경우는 17을 도입해보는것도 좋은 선택으로 생각됩니다.

 

※ 현실적으로 버전 업그레이드가 어려운 경우는 최소한 java 8로는 진행하여 사용하는것을 권장한다. 이는 java 8부터 지원되는 람다, 함수형 인터페이스, 스트림 등의 다양한 기능을 포기하는것이다!

 

 

Java 8 에서 추가된 기능

  • 오라클사의 유료 버전인 Oracle JDK와 오픈소스 기반의 무료 버전인 Open JDK로 나뉨
  • new Date and Time API (LocalDateTime 등)
  • Lambda, Stream API
  • Option class
  • Interface Default Method

 

람다 (Lambda)

람다식(Lambda Expression)을 이용하여 간단한 식으로 표현할 수 있다. 메서드의 이름과 반환값(return)이 생략되므로 '익명 함수(anonymous function)'로 불린다. 코드가 간결해진다는 장점이 있지만, 람다식을 남용하면 오히려 코드를 이해하기 어려울 수 있다.

// 전통적인 방식
int max (int a, int b) {
    return a > b ? a : b;
}

// 람다식 방식
(a, b) -> a > b ? a : b;
// 전통적인 방식
for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

// 람다식 방식
IntStream.range(0, 10).forEach((int value) -> System.out.println(value));

 

스트림 (Stream API)

스트림(Steam)은 컬렉션의 저장 요소를 하나씩 순회하면서 처리할 수 있는 코드 패턴이다. 람다식을 지원한다는 점과 내부 반복자를 사용하기 때문에 병렬 처리가 쉽다는 특징이 있다. (스트림을 처음 봤을때 저게 무슨 소스인가 매우 난해한 기분이 들었다)

// 전통적인 방식
List<String> list = Arrays.asList("franz", "ferdinand", "fiel", "vom", "pferd");

// Stream으로 표현
list.stream()
    .filter(name -> name.startsWith("f"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

 

interface default method

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

// 인터페이스 선언
public interface TestInterface {
    void doSomething();
    default void doSomethingDefault() {
        System.out.println("doing something default");
    }
}

// 인터페이스 구현
public class TestClass implements TestInterface {
    @Override
    public void doSomething() {
        System.out.println("doing something");
    }
}

TestClass testClass = new TestClass();
testClass.doSomething();          // 출력 결과 : doing something
testClass.doSomethingDefault();   // 출력 결과 : doing something default

 

Optional

Optional 클래스는 예상치 못한 NullPointerException이 발생될만한 상황에서 사용할 수 있다. null이 올 수 있는 값을 감싸는 Wrapper 클래스라서, NullPointerException이 발생하지 않도록 도와준다.

// 문자열로 Optional 객체 생성
Optional<String> optional = Optional.of("Hello world!");

// 문자열을 present로 체크
if (optional.isPresent()) {
	String value = optional.get();
	System.out.println(value);    // 출력 결과 : Hello world!
}
		
// 비어있는 Optional 객체 생성
Optional<String> emptyOptional = Optional.empty();

// optional이 빈 경우 디폴트값을 가져온다.
String value = emptyOptional.orElse("default value");
System.out.println(value);    // 출력 결과 : default value
		
// 예외 발생
emptyOptional.orElseThrow(() -> new RuntimeException("throw Exception"));

 

Java 11 에서 추가된 기능

  • 람다 지역 변수 사용방법 변경
  • Third Party JDK로의 이전 필요
  • HTTP 클라이언트 표준화 기능
  • 앱실론 가비지 컬렉터 (Epsilon GC)
  •  

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

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

자바 11부터는 람다식에서 var 키워드를 사용할 수 있게 되면서 파라미터 어노테이션도 적용할 수 있게 되었다.

// 자바 10에서 추가된 기능
(var s1, var s2) -> s1 + s2

// 자바 11에서 추가된 기능
(@NonNull var s1, @Nullable var s2) -> s1 + s2

 

HTTP Client

자바 11 이전에는 기본적인 URLConnection 구현 또는 Apache HttpClient 등의 타사 라이브러리에 의존해야 했지만, 자바 11 버전부터는 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());

 

 

Java 17 에서 추가된 기능

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

 

봉인 클래스 (Seald Class)

봉인 클래스, 인터페이스는 상속하거나(extends), 구현(implements)할 클래스를 지정해 두고, 해당 클래스들만 상속 또는 구현을 허용하는 키워드이다. 개발자는 seald 키워드를 통해 어떤 클래스가 해당 클래스를 상속 또는 구현하는지를 쉽게 알 수 있고, 또 제한할 수 있다.

public sealed class Shape permits Circle, Square {
    // 공통 필드, 공통 메서드
}

public final class Circle extends Shape {
    // Circle 클래스의 필드, 메서드
}

public final class Square extends Shape {
    // Square 클래스의 필드, 메서드
}

 

Record Data Class

Record 키워드는 14 버전에서 프리뷰 기능으로 추가되었고, 16 버전에서 공식 기능이 되었다. Record 클래스는 불변 데이터를 객체 간에 전달하는 작업을 간단하게 만들어주며, record를 사용함으로써 불필요한 코드(boilerplate code)를 제거할 수 있고, 적은 코드로도 명확한 의도(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)

텍스트 블록은 java 13, 14 버전에서 프리뷰로 추가되었고 15 버전에서 정식으로 발표되었다. 멀티 라인의 문자열을 에스케이프 시퀀스(\n) 없이 사용하므로 소스코드 작성이 편리하고, 코드 가독성을 높일 수 있다.

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

// 텍스트 블록 적용
String html2 = """
        <html>
            <body>
                <p>Hello, world</p>
            </body>
        </html>
        """;

 

 

 

참고 자료

https://techblog.gccompany.co.kr/%EC%9A%B0%EB%A6%AC%ED%8C%80%EC%9D%B4-jdk-17%EC%9D%84-%EB%8F%84%EC%9E%85%ED%95%9C-%EC%9D%B4%EC%9C%A0-ced2b754cd7

https://kghworks.tistory.com/197

https://velog.io/@jinyeong-afk/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-Java-11-vs-Java-17-%EC%B0%A8%EC%9D%B4

https://devpad.tistory.com/99

'자바' 카테고리의 다른 글

Spring Boot 2와 3은 무엇이 다를까?  (0) 2024.06.01
소프트웨어 배포 전략  (0) 2024.04.07
Log4j, Logback, Log4j2 정리  (1) 2024.03.21