✏️ [Java] 내가 Java17을 선택한 이유

박상민·2025년 1월 14일
0

JAVA

목록 보기
5/6

24년도에 진행한 두 개의 프로젝트 Sucat, 스스LAW에서 나는 모두 Java17을 선택해서 사용했다.
이번 글에서는 Java8, Java11, Java14, Java17 ... 등 많은 버전에서 Java17을 선택한 이유를 작성해보려고 한다.

참고로 Spring Boot 3.0부터는 Java17부터 지원하고 있기 때문에 Spring Boot 3.0 이후 버전을 고려하고 있다면 Java17 이상을 도입해야 한다.

⭐️ Java17? 다른 버전과 차이가 뭔데?

Java11
Java8과 경쟁 상대로 가장 많이 언급되었던 것은 Java11이다. 그 이유는 우선 LTS였기 때문이다.
Oracle에서 Java8을 사용한 레거시 프로젝트들이 너무 많은 것을 고려하여 Java8이 Java11보다 더 긴 지원기간을 갖게 되었다.

Java11은 26년 9월 이후부터 기술적 지원이 종료된다.

📌 Java8

  • Lambda
  • Stream
  • interface default Method
  • Optional
  • LocalDataTime

interface default Method
기존 interface는 추상 메서드만을 정의할 수 있었는데 default 선언을 통해 method를 미리 정의해둘 수 있다. 또한 정의된 default method는 상속된 class에서 오버라이딩 될 수 있다.

public interface Calculator {
    public int plus(int i, int j);
    public int multiple(int i, int j);
    default int exec(int i, int j){      //default로 선언함으로 메소드를 구현할 수 있다.
        return i + j;
    }
}

//Calculator인터페이스를 구현한 MyCalculator클래스
public class MyCalculator implements Calculator {

    @Override
    public int plus(int i, int j) {
        return i + j;
    }

    @Override
    public int multiple(int i, int j) {
        return i * j;
    }
}

public class MyCalculatorExam {
    public static void main(String[] args){
        Calculator cal = new MyCalculator();
        int value = cal.exec(5, 10);
        System.out.println(value);
    }
}

default method로 선언되면 상속받은 class에서 따로 구현하지 않아도 exec method를 사용할 수 있으며, 필요시 오버라이드하여 사용할 수 있다.

📌 Java9

  • 모듈화(Jigsaw)
  • stream
    • takeWhile, dropWhile, iterate 등 추가
  • optional
    • inPresentOrElse 추가
  • interface
    • private method 추가

📌 Java10

  • var 추가
  • Garbage Collector(GC) 병렬 처리 도입으로 인한 성능 향상
  • JVM heap 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당 가능

📌 Java11

  • LTS
  • Oracle JDK와 OpenJDK 통합
  • Oracle JDK가 구독형 유료 모델로 전환
  • Lambda에 var 사용 가능
  • Java10부터 Java 소스 파일을 먼저 컴파일 하지 않고도 실행할 수 있다.
    • 이전 java는 소스를 컴파일하여 class로 뽑은 후 class를 실행했는데 바로 실행할 수 있게 되었다.

📌 Java12

  • 유니코드 11 지원
  • swich문 확장

확장된 swich 문

//java 12 이전
String time;
switch (weekday) {
    case MONDAY:
    case FRIDAY:
        time = "10:00-18:00";
        break;
    case TUESDAY:
    case THURSDAY:
        time = "10:00-14:00";
        break;
    default:
        time = "휴일";
}
//java12 이후
String time = switch (weekday) {
    case MONDAY, FRIDAY -> "10:00-18:00";
    case TUESDAY, THURSDAY -> "10:00-14:00";
    default -> "휴일";
};

📌 Java13

  • 유니코드 12.1 지원
  • switch 개선
  • Multi line String 개선

개선된 switch

boolean result = switch (status) {
    case SUBSCRIBER -> true;
    case FREE_TRIAL -> false;
    default -> throw new IllegalArgumentException(*"something is murky!"*);
};

개선된 switch

//Java 13 이전
String htmlBeforeJava13 = *"<html>\n"* +
              *"    <body>\n"* +
              *"        <p>Hello, world</p>\n"* +
              *"    </body>\n"* +
              *"</html>\n"*;

//Java 13 이후
String htmlWithJava13 = *"""
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """*;

📌 Java14

  • switch 표준화
  • instanceof 개선
  • record 선언 기능 추가
  • NullPointerException 개선

record에 대하여 정리한 글

switch 표준화

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    default      -> {
      String s = day.toString();
      int result = s.length();
      yield result;
    }
};

instanceof 개선

//Java 14 이전
if (obj instanceof String) {
    String s = (String) obj;
}

//Java 14 이후
if (obj instanceof String s) {
    System.out.println(s.contains(*"hello"*));
}

record

// Java 14 이전
// Java 14 이전에는 다음과 같이 선언 시 equals/hashcode, toString 잠재적으로 포함되었다.
final class Point {
    public final int x;
    public final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

// Java 14 이후
record Point(int x, int y) { }

📌 Java15

  • 스케일링 가능한 낮은 지연의 가비지 컬렉터 추가(ZGC)
  • Sealed Classes
  • Nashorn JavaScript Engine 제거
    • Java에서 JavaScript를 실행할 수 있었던 Engine

📌 Java16

  • Unix-Domain Socket Channels 사용 가능 (Mac 및 Windows(10+)에도 지원)

📌 Java17

  • Java11 이후 새로운 LTS
  • Pattern Matching for switch
  • Sealed Classes (Finalized)
    • Java15에서 제공되었던 Sealed Classes 기능 완료
  • Foreign Function & Memory API
    • Java Native Interface(JNL)를 대체
  • Deprecating the Security Manager

Pattern Matching for switch

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"*;
    };
}

객체를 전달하여 기능을 전환하고 특정 유형을 확인할 수 있다.

⭐️ Java17 버전을 선택한 이유

  • Java11과 마찬가지로 LTS이다.

  • 새로운 기능과 개선된 API

    • Java17에서는 다양한 새로운 기능과 API 개선이 이루어졌다. 예를 들어, 'Sealed Classes'가 도입되어 클래스의 상속을 제한하고, 'Pattern Matching for switch'가 확장되어 패턴 매핑 기능이 향상되었다.
  • 암호화 관련 업데이트

    • Java17에서는 암호화와 보안 관련 업데이트가 이루어졌다. 암호화 알고리즘과 보안 기능의 업데이트로 애플리케이션의 보안성이 향상되었다.
  • 언어 및 컴파일러 개선

    • Java17에서는 언어 및 컴파일러 개선이 이루어져 더 나은 코드 작성이 가능해졌다.
  • Deprecation과 Removal

    • Java17에서는 일부 구식된 기능들이 표시되어 Deprecated 상태로 변경되거나, 더 이상 사용되지 않는 기능들이 제거되었다.
  • 성능 개선

    • Java17은 전반적으로 성능 개선이 이루어져 더 빠르고 효율적인 실행이 가능해졌다.

위와 같은 이유들이 있지만 가장 큰 이유는 Spring Boot 3.0 이후부터는 Java17 이후 버전만 지원하기 때문이다.

profile
스프링 백엔드를 공부중인 대학생입니다!

0개의 댓글

관련 채용 정보