Java 8부터 17까지 차이점

박지찬·2023년 8월 14일

프로젝트를 진행하며 여러 요구사항 때문에 Java 11에서 17로 변경하였다. 근데 정확히 어떤 차이점이 있는지 알지 못해 17에서 제공하는 기능들을 활용하지 못하는거 같아 11과 17에는 어떤 차이점이 있는지 알아보기로 하였다.

Java Distribution

OracleJDK 과 OpenJDK의 차이

  • OracleJDK는 상용(유료)이지만, OpenJDK는 오픈소스(무료)
  • OracleJDK는 LTS 업데이트 지원, OpenJDK는 LTS 없이 6개월마다 새로운 버전 배포
  • OracleJDK는 Sun Microsystems에서 개발한 자바 플러그인 (브라우저에서 Java Applet을 실행시킬 수 있게 해주는 플러그인)를 사용할 수 있지만 OpenJDK에서는 사용불가)
  • OracleJDK는 OpenJDK보다 CPU 사용량과 메모리 사용량이 적고, 응답시간이 빠르다

Adoptium (전 AdoptOpenJDK)

  • 2017년에 시작
  • 더 가용성이 높고 긴 업데이트 지원을 제공하는 무료 OpenJDK

각 Java 버전별 차이

LTS

LTS는 Long Term Support의 약자로, 오랜 기간 지원하는 특별한 버전의 에디션이다.

Java 8

  • Lambda
    • 8 이전에는 익명 클래스를 사용, 람다를 사용하여 직관적으로 구현 가능
  • stream
    • 컬렉션을 처리하면서 발생하는 모호함과 반복전인 코드멀티코어 활용 어려움이라는 문제를 해결
  • interface default method
    • interface 안에 default를 앞에 붙인 메서드를 정의하여 구현을 interface 안에서 할 수 있다
    • 그동안 막아왔던 인터페이스 안에서 함수의 구현을 부분적으로 허용
    • interface에 method 를 추가하려면 interface를 구현한 모든 클래스에서도 해당 method 를 구현해야 하는 문제를 해결
  • Optional
    • NPE (NullPointerException)을 null 여부 검사를 위한 번잡한 코드를 추가하지 않고 방지할 수 있다
  • new Date and Time API(LocalDateTime, ...)

Java 9

  • 컬렉션 List, set map을 쉽게 구성할 수 있는 몇가지 추가 기능
    • List.of(), Set.of(), Map.of()

Java 10

  • var 키워드
    • 컴파일러가 타입을 추론
    • 메서드 내부의 변수에만 적용 가능
  • 병렬처리 가비지 컬렉션 도입으로 인한 성능 향상

Java 11

  • String and Files에 새로운 메서드 추가
    • isBlank(), lines() : return streams of lines, strip()

JAVA 14

  • Switch 표현식
    • Switch 표현식에서 값을 반환할 수 있고, fall-through/break 문제 없이 표현식에 람다 스타일 구문을 사용할 수 있다
          int numLetters = switch (day) {
              case MONDAY, FRIDAY, SUNDAY -> 6;
              case TUESDAY                -> 7;
              default      -> {
                String s = day.toString();
                int result = s.length();
                yield result;
              }
          };
  • NullPointerExceptions가 정확히 어떤 변수가 null인지 설명한다
        author.age = 35;
        ---
        Exception in thread "main" java.lang.NullPointerException:
             Cannot assign field "age" because "author" is null
  • Record (Preview)
    • Immutable 데이터 클래스
    • 필드의 이름과 타입만 필요
    • 14 이전 클래스
          public class Person {

              private final String name;
              private final String address;

              public Person(String name, String address) {
                  this.name = name;
                  this.address = address;
              }

              @Override
              public int hashCode() {
                  return Objects.hash(name, address);
              }

              @Override
              public boolean equals(Object obj) {
                  if (this == obj) {
                      return true;
                  } else if (!(obj instanceof Person)) {
                      return false;
                  } else {
                      Person other = (Person) obj;
                      return Objects.equals(name, other.name)
                        && Objects.equals(address, other.address);
                  }
              }

              @Override
              public String toString() {
                  return "Person [name=" + name + ", address=" + address + "]";
              }

              // standard getters
          }

                  14 이후 Record 사용 가능

 		 public record Person (String name, String address) {}

Java 15

  • Text-Blocks/Multiline Strings
    • 쌍따옴표 (") 세개로 선언
        public String textBlocks() {
            return """
                Get busy living
                or
                get busy dying.
                --Stephen King""";
        }
  • Sealed Classes (Preview)
    • 상속 가능한 클래스를 지정할 수 있는 봉인 클래스
  public abstract sealed class Shape
    permits Circle, Rectangle, Square {...}

Java 17

  • Pattern Matching for switch (Preview)
    • 객체를 전달하여 기능을 전환하고 특정 유형을 확인할 수 있다
          public String test(Object obj) {

              return switch(obj) {

              case Integer i -> "An integer";

              case String s -> "A string";

              case Cat c -> "A Cat";

              default -> "I don't know what it is";

              };

          }

1개의 댓글

comment-user-thumbnail
2023년 8월 14일

감사합니다. 이런 정보를 나눠주셔서 좋아요.

답글 달기