hanker

[JAVA] java 11 버전과 java 17 버전의 핵심 차이점 본문

JAVA

[JAVA] java 11 버전과 java 17 버전의 핵심 차이점

hanker 2025. 5. 29. 01:00
반응형

Java 17은 2021년 9월에 릴리스된 LTS(Long Term Support) 버전으로, Java 11 이후 가장 중요한 업데이트이다.

이번 글에서는 Java 11 버전과 Java 17 버전의 핵심 변경점에 대해서 알아보자.

 


1. 언어 기능 개선

 

1.1 텍스트 블록 (Text Blocks) - Java 15에서 정식 도입

기존 Java에서 멀티라인 문자열을 작성할 때 발생하던 가독성 문제와 복잡한 이스케이프 시퀀스 문제를 해결하기 위해 개발되었다.

        // Java 11 (기존 방식)
        String json = "{\n" +
                "  \"name\": \"홍길동\",\n" +
                "  \"age\": 30,\n" +
                "  \"city\": \"서울\"\n" +
                "}";

        // Java 17 (텍스트 블록)
        String json2 = """
                    {
                      "name": "홍길동",
                      "age": 30,
                      "city": "서울"
                    }
                    """;

텍스트 블록 예시

 

 

 

 

1.2 Switch 표현식 - Java 14에서 정식 도입

switch문이 갖고 있던 코드 중복, break 누락 오류, 가독성 저하 문제를 해결하기 위해 개발되었다.

 

1-2-1. 화살표 연산자 (->)

  • 기존 콜론(:) 대신 화살표 사용으로 명확한 매핑 관계 표현
  • break문 자동 처리로 fall-through 오류 방지
  • 코드 간결성과 가독성 극대화

1-2-2. 값 반환 기능

  • switch 구조 자체가 값을 반환하는 표현식으로 동작
  • 변수 선언과 동시에 값 할당 가능
  • 함수형 프로그래밍 패러다임 지원

1-2-3. 다중 케이스 처리

// Java 11 (기존 switch문)
        char grade = 'A';
        String result;
        switch (grade) {
            case 'A':
                result = "우수";
                break;
            case 'B':
                result = "양호";
                break;
            case 'C':
                result = "보통";
                break;
            default:
                result = "미흡";
                break;
        }

        // Java 17 (switch 표현식)
        String result2 = switch (grade) {
            case 'A' -> "우수";
            case 'B' -> "양호";
            case 'C' -> "보통";
            default -> "미흡";
        };

switch 표현식 예시

 

 

 

 

1.3 패턴 매칭 for instanceof - Java 16에서 정식 도입

instanceof 사용 시 발생하던 중복 코드, 타입 캐스팅 오류, 가독성 저하 문제를 해결하기 위해 개발되었다.

// Java 11
if (obj instanceof String) {
    String str = (String) obj;
    System.out.println("문자열 길이: " + str.length());
}

// Java 17
if (obj instanceof String str) {
    System.out.println("문자열 길이: " + str.length());
}

패턴 매칭 예제

 

 


2. 새로운 타입 시스템

 

2.1 Records - Java 16에서 정식 도입

POJO(Plain Old Java Object) 클래스 작성 시 발생하던 보일러플레이트 코드, 실수 가능성, 유지보수 복잡성 문제를 근본적으로 해결하기 위해 개발되었다.

* 보일러 플레이트 코드 : 프로그래밍에서 특정 작업을 수행하기 위해 반복적으로 사용되는 표준화된 코드 조각

 

2-1-1. 자동 생성되는 메서드들

  • 생성자: 모든 필드를 매개변수로 받는 public 생성자 자동 생성
  • 접근자 메서드: 각 필드에 대한 getter 메서드 (필드명과 동일한 이름)
  • equals(): 모든 필드 값 비교하는 equals 메서드
  • hashCode(): 모든 필드 기반 해시코드 계산
  • toString(): 모든 필드 값을 포함하는 문자열 표현
// Java 11 (전통적인 데이터 클래스)
public class Student {
    private final String name;
    private final int age;
    private final String major;
    
    public Student(String name, int age, String major) {
        this.name = name;
        this.age = age;
        this.major = major;
    }
    
    public String getName() { return name; }
    public int getAge() { return age; }
    public String getMajor() { return major; }
    
    @Override
    public boolean equals(Object o) { /* 구현 필요 */ }
    @Override
    public int hashCode() { /* 구현 필요 */ }
    @Override
    public String toString() { /* 구현 필요 */ }
}

// Java 17 (Records)
public record Student(String name, int age, String major) {}

Record 타입 생성 가능

 

 

 

2.2 Sealed Classes - Java 17에서 정식 도입

기존 상속 시스템의 무제한 확장 가능성, 타입 안전성 부족, 패턴 매칭 최적화 어려움 문제를 해결하기 위해 설계되었다.

 

2-2-1. 제한된 상속 구조

  • sealed 키워드로 클래스 봉인
  • permits 절로 허용된 하위 클래스 명시
  • 컴파일 타임에 상속 구조 검증

2-2-2. 하위 클래스 제약 조건

  • 허용된 하위 클래스는 반드시 final, sealed, non-sealed 중 하나여야 함
  • 같은 모듈 또는 패키지에 위치해야 함
  • 봉인된 클래스를 직접 상속해야 함

2-2-3. 패턴 매칭 최적화

 

public sealed class Vehicle 
    permits Car, Truck, Motorcycle {
}

public final class Car extends Vehicle {
    private final int doors;
    public Car(int doors) { this.doors = doors; }
}

public final class Truck extends Vehicle {
    private final double capacity;
    public Truck(double capacity) { this.capacity = capacity; }
}

public final class Motorcycle extends Vehicle {
    private final boolean hasSidecar;
    public Motorcycle(boolean hasSidecar) { this.hasSidecar = hasSidecar; }
}

 

 


3. Stream API 개선

 

점진적으로 도입된 함수형 프로그래밍 기능 강화로, 기존 Stream API의 한계를 넘어, 더욱 정교한 데이터 처리를 해준다.

조건부 처리 부족, Null 안전성 문제, 복잡한 데이터 필터링 어려움 등의 문제를 해결한다.

// Java 17에서 사용 가능한 Stream 개선사항
List<String> names = List.of("김철수", "이영희", "박민수", "최지영");

// takeWhile, dropWhile (Java 9에서 도입)
names.stream()
     .takeWhile(name -> name.length() <= 3)
     .forEach(System.out::println);

// Stream.ofNullable (Java 12에서 개선)
String nullableString = null;
Stream.ofNullable(nullableString)
      .forEach(System.out::println); // 아무것도 출력되지 않음

 


4. JVM 및 성능 개선

 

Java 11부터 Java 17까지 도입된 혁신적인 가비지 컬렉션 기술과 런타임 최적화로, 애플리케이션의 지연 시간 단축, 처리량 향상, 메모리 효율성 증대를 목표로 한다.

// Java 11: G1GC가 기본
// 실행 옵션: -XX:+UseG1GC (기본값)

// Java 17: 추가 GC 옵션들
// ZGC: -XX:+UseZGC (초저지연)
// Shenandoah: -XX:+UseShenandoahGC (동시 수집)
// Parallel GC: -XX:+UseParallelGC

 

 


5. HTTP Client 개선 - Java 11에서 도입, Java 17에서 안정화

 

기존 URLConnection의 한계를 극복하고 비동기 처리, HTTP/2 지원, 반응형 스트림 기능을 제공한다.

// Java 11과 17 모두 지원하지만 17에서 더 안정적
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Duration;

public class HttpExample {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newBuilder()
                .connectTimeout(Duration.ofSeconds(10))
                .build();
        
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.github.com/users/octocat"))
                .timeout(Duration.ofSeconds(30))
                .header("Accept", "application/json")
                .GET()
                .build();
        
        HttpResponse<String> response = client.send(request, 
                HttpResponse.BodyHandlers.ofString());
        
        System.out.println("Status: " + response.statusCode());
        System.out.println("Body: " + response.body());
    }
}

 

 


 

반응형