Java & Spring Boot

Java를 버전 별로 비교해보자

둘기덕 2022. 8. 1. 22:47
반응형

Java로 프로젝트를 진행하려면 우선 어떤 버전으로 만들 것인지(모든 언어가 그렇지만) 정해야 합니다. Java는 대표적으로 8 버전부터 혁신적으로 언어가 변화했다고 여겨지고 있습니다. 그러나 구체적인 버전 별의 세세한 차이까지는 알지 못하는 사람들이 대부분입니다. 

 

이번 포스팅에서는 Java 1.8 이전 부터 최근에 릴리즈 된 Java 17 버전까지의 차이점을 다루어 보겠습니다.

Java 1.8 이전

가장 혁신적으로 바뀌어진 변경점들이 Java 8 에서 나타났기에, 그 이전 버전들은 모두 통으로 묶어서 알아보겠습니다.

 

우선 Java는, 썬 마이크로 시스템즈에서 C++의 단점을 극복하고자 만든 언어입니다. 그 단점이라 함은, 메모리 할당/해제의 복잡함다중 상속으로 인한 실수 유발 등을 말합니다. 항상 Java는 왜 다중 상속을 지원 안 하는지 궁금했었는데, 애초에 그러한 목적으로 만들어진 언어니 지원이 안됐던 거군요.

 

Java 6 버전에서는 가비지 컬렉터를 지원하기 시작했으며, Java 7에서는 switch문에서 문자열 허용(이게 안 됐단 말이야?), generics 내 타입 내 추론이 가능하게 되었습니다.

 

generics 내 타입 내 추론이 가능하게 됐다는 의미는, Java 7 이전 버전에서는 아래의 코드가 불가했다는 것입니다.

Map<String, Object> member = new HashMap<>();

Java 7이전에서는 타입을 명시해줬어야 했겠네요. 타입 명시를 강제하지 않는, 유용한 변화라고 생각합니다. 

Map<String, Object> member = new HashMap<String, Object>();

Java 1.8 (Java 8)

  • Lambda,
  • stream
  • interface default method
  • Optional
  • new Date and Time API

이 버전부터 JDK는 Oracle JDK와 오픈소스용으로 배포된 Open JDK의 두 개의 버전으로 나뉩니다. 이 버전부터 개발자들은 Lambda 및 함수형 프로그래밍을 사용할 수 있게 되었으며, NullPointerException을 예방하기 위한 "Optional"등의 기능이 추가됩니다. 

 

또한 Default Interface Method 기능이 생겼는데, 기존의 인터페이스는 메서드 정의만 할 수 있고 구현은 할 수 없었습니다. 다만 Java 8부터 디폴트 메서드라는 개념이 생겨 구현 내용도 인터페이스에 포함시킬 수 있었습니다.

public interface Vehicle {
    public default void doSomething(int n) {
        System.out.println("doSomething(Vehicle)");
    }
}

Java 11

  • Oracle JDK와 OpenJDK 통합
  • Oracle JDK가 구독형 유료 모델로 전환
  • 서드파티 JDK 로의 이전 필요
  • lambda 지역변수 사용법 변경

Java 11버전은, 8 버전 17 버전과 함께 많은 개발자들이 선택하는 버전입니다. 람다 파라미터에 대한 지역 변수 문법이 바뀌었습니다.

(var x, var y) -> x.process(y) => (x, y) -> x.process(y)

또한 Oracle JDK와 OpenJDK가 통합되었으며, Oracle JDK가 구독형 유료 모델로 전환되었다는 것이 큰 특징입니다. 

Java 15

  • Text-Blocks / Multiline Strings
  • Records & Pattern Matching
  • 스케일링 가능한 낮은 지연의 가비지 컬렉터 추가(ZGC)
  • Sealed Classes - Preview
  • Nashorn JavaScript Engine 제거

이제 여러 줄 문자열이 사용 가능해졌습니다. Java 13에서 실험 기능으로 도입되었는데, 15 버전에서는 기능이 구현 완료된 것 같습니다.

String text = """
                Hello, I am 2giduck. \
                I am Backend Developer. \
                Nice to meet you.\
                """;

Java 17

  • Pattern Matching for switch (Preview)
  • Sealed Classes (Finalized)
  • Foreign Function & Memory API (Incubator)
  • Deprecating the Security Manager

또한 상속 가능한 클래스를 지정할 수 있는 봉인 클래스가 제공되었습니다. Java 15버전에서 실험적으로 제공한 기능이었는데, 이제 실용적으로 쓸 수 있게 된 모양입니다. 

public sealed interface Developer permits Frontend, Backend{}

예시 코드에서 Frontend, Backend가 아닌 다른 클래스가 Developer 클래스를 상속받으려 하면 에러가 발생합니다.

그럼 어떤 버전을 사용해야 할까?

그렇다면 실무에서는 어떤 버전을 사용해야 할까요? 기업의 기존 프로젝트에서는 아직도 Java 8 버전을 많이 사용하고 있지만, 저는  17 버전을 추천해드리고 싶습니다. 그 이유는 비교적 가장 최신의 버전이며, 또한 18 버전에 비해 안정화되어있기 때문입니다. 그리고 그 전 버전들에 비해 많은 기능들이 새로 생겨나기도 하였구요.

 

물론 선택의 가장 중요한 근거는, 본인의 프로젝트의 요구사항과 시스템 사양일 것입니다. 

반응형