[Java] 주요 버전별 핵심 변경사항

슈퍼대디·2024년 12월 23일

CS면접대비

목록 보기
7/13

Java 주요 버전별 핵심 변경사항 총정리

목차

  1. Java 릴리즈 정책 이해
  2. 주요 버전별 변경사항
  3. LTS 버전 비교
  4. 면접 예상 질문

1. Java 릴리즈 정책 이해

Oracle의 Java 릴리즈 정책 변화

  • Java 8까지: 몇 년 단위의 메이저 버전 업데이트
  • Java 9 이후: 6개월 단위의 신규 버전 출시
  • LTS(Long Term Support) 버전 도입
    • Java 8, 11, 17, 21이 LTS 버전
    • 장기 지원 및 보안 업데이트 제공

2. 주요 버전별 변경사항

Java 8 (LTS)

  1. 언어적 기능

    • Lambda 표현식 도입
    List<String> list = Arrays.asList("a", "b", "c");
    list.forEach(s -> System.out.println(s));
    • 메서드 레퍼런스
    list.forEach(System.out::println);
    • Interface의 Default Method
    interface MyInterface {
        default void newMethod() {
            System.out.println("New Feature");
        }
    }
  2. 라이브러리 기능

    • Stream API
    • Optional 클래스
    • 새로운 날짜/시간 API (java.time)
    • CompletableFuture

Java 9

  1. 모듈 시스템 (Project Jigsaw)

    module com.my.module {
        requires java.base;
        exports com.my.package;
    }
  2. 컬렉션 팩토리 메서드

    List<String> list = List.of("a", "b", "c");
    Map<String, String> map = Map.of("key1", "value1", "key2", "value2");
  3. 기타 기능

    • 인터페이스의 private 메서드
    • Process API 개선
    • JShell (REPL) 도입

Java 10

  1. 지역 변수 타입 추론 (var)
    var list = new ArrayList<String>();  // 타입 추론
    var number = 42;  // int로 추론

Java 11 (LTS)

  1. 주요 기능

    • HTTP 클라이언트 표준화 (java.net.http)
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://example.com"))
        .build();
    • String 클래스 새 메서드
    String multiline = "hello\nworld";
    multiline.lines().forEach(System.out::println);
  2. 런타임 기능

    • 엡실론 GC
    • 직접 실행을 위한 소스 파일 실행

Java 14

  1. Switch 표현식 (Standard)

    • 기존 switch 문의 한계를 개선한 새로운 표현식
    • 화살표 구문(->)을 사용하여 간결한 구문 제공
    • break 문 없이도 값을 반환 가능
    • fall-through 동작 방지로 안전성 향상
    // 기존 switch 문
    switch (day) {
        case MONDAY:
        case FRIDAY:
        case SUNDAY:
            numLetters = 6;
            break;
        case TUESDAY:
            numLetters = 7;
            break;
        default:
            numLetters = 8;
    }
    
    // 새로운 switch 표현식
    int numLetters = switch (day) {
        case MONDAY, FRIDAY, SUNDAY -> 6;
        case TUESDAY -> 7;
        default -> 8;
    };
  2. Records (Preview)

    • 데이터 전달을 위한 불변 객체를 간단히 정의
    • 자동으로 equals(), hashCode(), toString() 메서드 생성
    • 모든 필드는 private final이며, public 접근자 자동 생성
    • 상속 불가능 (final 클래스)
    // 기존 방식
    public class Point {
        private final int x;
        private final int y;
    
        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    
        public int getX() { return x; }
        public int getY() { return y; }
    
        @Override
        public boolean equals(Object o) { ... }
        @Override
        public int hashCode() { ... }
        @Override
        public String toString() { ... }
    }
    
    // Record 사용
    record Point(int x, int y) {
        // 컴팩트 생성자로 유효성 검사 추가 가능
        public Point {
            if (x < 0 || y < 0) {
                throw new IllegalArgumentException();
            }
        }
    }

Java 15

  1. Sealed Classes (Preview)

    • 상속 가능한 클래스를 명시적으로 제한
    • 타입 계층 구조의 명확한 설계 가능
    • 패턴 매칭과 함께 사용 시 타입 안전성 향상
    // 상속 가능한 클래스를 Circle, Rectangle, Square로 제한
    public sealed class Shape 
        permits Circle, Rectangle, Square {
        // 공통 메서드 정의
    }
    
    // 반드시 final, sealed, non-sealed 중 하나로 선언해야 함
    public final class Circle extends Shape {
        // Circle 구현
    }
    
    public final class Rectangle extends Shape {
        // Rectangle 구현
    }
    
    public final class Square extends Shape {
        // Square 구현
    }

Java 16

  1. Pattern Matching for instanceof

    • instanceof 검사와 타입 캐스팅을 한 번에 처리
    • 코드의 간결성과 안전성 향상
    // 기존 방식
    if (obj instanceof String) {
        String s = (String) obj;
        System.out.println(s.length());
    }
    
    // 패턴 매칭 사용
    if (obj instanceof String s) {
        System.out.println(s.length());
    }

Java 21

  1. String Templates (Preview)

    • 문자열 보간(interpolation)을 위한 새로운 기능
    • 복잡한 문자열 연산을 더 읽기 쉽게 표현
    • SQL 쿼리나 JSON 생성 시 유용
    String name = "world";
    // 기존 방식
    String message = "Hello " + name + "!";
    
    // String template 사용
    String message = STR."Hello \{name}!";
    
    // JSON 생성 예시
    String json = STR."""
        {
            "name": "\{name}",
            "age": \{age},
            "city": "\{city}"
        }
        """;
  2. Sequenced Collections

    • 순서가 있는 컬렉션을 위한 새로운 인터페이스
    • 처음/마지막 요소에 대한 통일된 접근 방법 제공
    • 역순 순회 기능 제공
    SequencedCollection<String> list = new ArrayList<>();
    list.addFirst("first");
    list.addLast("last");
    
    String first = list.getFirst();
    String last = list.getLast();
    
    // 역순 순회
    SequencedCollection<String> reversed = list.reversed();
  3. Record Patterns

    • Record의 구조 분해를 패턴 매칭과 결합
    • 중첩된 데이터 구조를 쉽게 처리
    record Point(int x, int y) {}
    record Rectangle(Point upperLeft, Point lowerRight) {}
    
    // 기존 방식
    if (obj instanceof Rectangle) {
        Rectangle r = (Rectangle) obj;
        Point ul = r.upperLeft();
        Point lr = r.lowerRight();
        // 좌표 처리
    }
    
    // Record Pattern 사용
    if (obj instanceof Rectangle(Point(int x1, int y1), Point(int x2, int y2))) {
        // 직접 x1, y1, x2, y2 사용 가능
    }

3. LTS 버전 비교

Java 8 (2014)

  • 가장 혁신적인 변화 도입 (Lambda, Stream)
  • 현재도 많은 기업에서 사용 중
  • 안정성과 생태계 성숙도가 높음

Java 11 (2018)

  • 모듈 시스템의 안정화
  • HTTP 클라이언트 등 네트워크 기능 강화
  • GC 개선 및 성능 향상

Java 17 (2021)

  • 봉인 클래스 등 객체지향 기능 강화
  • 패턴 매칭 개선
  • GC 및 성능 추가 개선

Java 21 (2023)

  • Virtual Thread로 동시성 프로그래밍 혁신
  • String Templates 등 편의 기능 추가
  • Record Pattern Matching 등 패턴 매칭 강화

4. 면접 예상 질문

Q: Java 8에서 가장 중요한 변화는 무엇이며, 이것이 Java 생태계에 미친 영향을 설명해주세요.
A: Java 8의 가장 중요한 변화는 Lambda 표현식과 Stream API의 도입입니다. 이는 Java에 함수형 프로그래밍의 개념을 도입한 것으로, 코드의 간결성과 가독성을 크게 향상시켰습니다. 특히 컬렉션 처리에서 선언적 프로그래밍이 가능해졌으며, 이는 현대적인 Java 프로그래밍의 기초가 되었습니다. 또한 병렬 처리를 쉽게 구현할 수 있게 되어 성능 개선에도 크게 기여했습니다.

Q: Java 9의 모듈 시스템 도입 목적과 장점은 무엇인가요?
A: Java 9의 모듈 시스템(Project Jigsaw)은 Java 플랫폼의 확장성과 보안을 개선하기 위해 도입되었습니다. 주요 목적은 강력한 캡슐화를 통한 보안 강화, 의존성의 명시적 선언을 통한 애플리케이션 구조 개선, 그리고 JDK 자체의 모듈화를 통한 더 작은 런타임 구성 가능성 제공입니다. 이를 통해 애플리케이션의 크기를 줄이고, 시작 시간을 개선하며, 전체적인 보안성을 향상시킬 수 있게 되었습니다.

Q: Java의 LTS 버전들의 특징과 차이점을 설명해주세요.
A: Java의 LTS 버전들은 각각 중요한 특징을 가지고 있습니다. Java 8은 Lambda와 Stream API를 통해 함수형 프로그래밍을 도입했고, Java 11은 HTTP 클라이언트 등 모던 애플리케이션 개발에 필요한 기능들을 표준화했습니다. Java 17은 봉인 클래스와 패턴 매칭 등 언어적 기능을 강화했으며, Java 21은 Virtual Thread를 통해 동시성 프로그래밍의 새로운 패러다임을 제시했습니다. 각 LTS 버전은 이전 버전의 개선사항을 포함하면서도, 새로운 기능과 성능 개선을 제공하여 점진적인 발전을 이루어왔습니다.

참고 자료

profile
성장하고싶은 Backend 개발자

0개의 댓글