200===Dev Language/Java

자바 8과 자바 18의 주요 차이점

블로글러 2024. 6. 27. 12:27

자바 8과 자바 18의 주요 차이점

  1. 람다 표현식 (Java 8)

    Java 8에서 도입된 람다 표현식은 함수형 프로그래밍을 가능하게 합니다.

    // Java 8 이전
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("Hello, World!");
        }
    };
    
    // Java 8 이후
    Runnable runnable = () -> System.out.println("Hello, World!");
  2. 스트림 API (Java 8)

    컬렉션을 보다 효율적으로 처리할 수 있게 해줍니다.

    List<String> names = Arrays.asList("John", "Jane", "Adam", "Eve");
    
    // Java 8 이전
    List<String> filteredNames = new ArrayList<>();
    for (String name : names) {
        if (name.startsWith("J")) {
            filteredNames.add(name.toUpperCase());
        }
    }
    
    // Java 8 이후
    List<String> filteredNames = names.stream()
        .filter(name -> name.startsWith("J"))
        .map(String::toUpperCase)
        .collect(Collectors.toList());
  3. 디폴트 메소드 (Java 8)

    인터페이스에 구현을 포함할 수 있게 되었습니다.

    interface Vehicle {
        default void start() {
            System.out.println("Vehicle starting...");
        }
    }
    
    class Car implements Vehicle {
        // start() 메소드를 오버라이드하지 않아도 됨
    }
  4. 새로운 날짜/시간 API (Java 8)

    기존의 Date와 Calendar의 문제점을 해결한 새로운 API가 도입되었습니다.

    // Java 8 이전
    Date date = new Date();
    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.DAY_OF_MONTH, 1);
    
    // Java 8 이후
    LocalDate today = LocalDate.now();
    LocalDate tomorrow = today.plusDays(1);
  5. var 키워드 (Java 10)

    지역 변수 타입 추론을 지원합니다.

    // Java 10 이전
    String message = "Hello, World!";
    
    // Java 10 이후
    var message = "Hello, World!";
  6. 스위치 표현식 개선 (Java 12, 13, 14)

    스위치문을 더 간결하게 작성할 수 있습니다.

    // Java 12 이전
    String result;
    switch (day) {
        case MONDAY:
        case FRIDAY:
        case SUNDAY:
            result = 6;
            break;
        case TUESDAY:
            result = 7;
            break;
        case THURSDAY:
        case SATURDAY:
            result = 8;
            break;
        case WEDNESDAY:
            result = 9;
            break;
        default:
            throw new IllegalStateException("Invalid day: " + day);
    }
    
    // Java 12 이후
    String result = switch (day) {
        case MONDAY, FRIDAY, SUNDAY -> "6";
        case TUESDAY                -> "7";
        case THURSDAY, SATURDAY     -> "8";
        case WEDNESDAY              -> "9";
        default -> throw new IllegalStateException("Invalid day: " + day);
    };
  7. 텍스트 블록 (Java 13, 14, 15)

    여러 줄의 문자열을 더 쉽게 작성할 수 있습니다.

    // Java 13 이전
    String json = "{\n" +
                  "  \"name\": \"John Doe\",\n" +
                  "  \"age\": 30\n" +
                  "}";
    
    // Java 13 이후
    String json = """
                  {
                    "name": "John Doe",
                    "age": 30
                  }
                  """;
  8. 레코드 (Java 14, 15, 16)

    불변 데이터 객체를 간단히 만들 수 있습니다.

    // Java 14 이전
    public class Person {
        private final String name;
        private final int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        // getters, equals, hashCode, toString
    }
    
    // Java 14 이후
    public record Person(String name, int age) {}
  9. 패턴 매칭 for instanceof (Java 14, 15, 16)

    타입 검사와 캐스팅을 한 번에 할 수 있습니다.

    // Java 14 이전
    if (obj instanceof String) {
        String s = (String) obj;
        // s 사용
    }
    
    // Java 14 이후
    if (obj instanceof String s) {
        // s 바로 사용 가능
    }
  10. 봉인 클래스 (Java 15, 16, 17)

    클래스의 상속을 제한할 수 있습니다.

    public sealed class Shape
        permits Circle, Rectangle, Square {
        // ...
    }
    
    public final class Circle extends Shape {
        // ...
    }
    
    public final class Rectangle extends Shape {
        // ...
    }
    
    public final class Square extends Shape {
        // ...
    }

이러한 새로운 기능들은 코드를 더 간결하고, 읽기 쉽게 만들며, 개발자의 생산성을 향상시킵니다. 또한 Java 8 이후의 버전들은 성능 개선, 보안 강화, API 개선 등 다양한 측면에서 지속적으로 발전해 왔습니다.

728x90