[Java] Java 버전별 정리

minhyeok·2023년 8월 13일
0

Java 개념 정리

목록 보기
2/8
post-thumbnail

Java 버전 ?

자바 버전에는 여러가지 버전이 있지만, 그 중 많이 쓰이는 버전은 8,11,17 이다.
JAVA 8 이상 이라는 문구를 많이 보았을 것이다.
이러한 이유는, 해당 버전들이 LTS 이기 때문이다.

LTS

Long Term Support는 출시 후 8년이라는 긴 기간을 보안 업데이트와 버그 수정을 지원하는 버전이라는 뜻이다.

버전별 차이

JAVA 8

Java 8 (was released on March 18, 2014)

  • Oracle이 Sun Microsystems 인수 후 출시한 첫 번째 LTS 버전의 자바
  • 32bit를 지원하는 마지막 공식 Java 버전
  • Oracle사에서 지원하는 유료 버전인 Oracle JDK와 오픈소스 기반의 무료 버전인 Open JDK로 나뉨
  • new Date and Time API(LocalDateTime 등)
  • Lambda, Stream API
  • PermGen Area 삭제
  • Static Link JNI Library
  • Unsigned Integer 계산
  • Annotation on Java Types
  • Interface Default Method
  • Optional class
  • Nashorn JavaScript engine 탑재

Lamda

int max(int a, int b) {
    return a > b ? a : b;
}
//람다식으로 변환
(a, b) -> a > b ? a : b;

'람다식(Lambda Expression)'이란 함수를 간단한 식으로 표현하는 방법을 말한다.
메서드의 이름과 반환값(return)이 생략된다는 점에서 '익명 함수(anonymous function)'라고도 불린다.

Stream API

List<String> lowercase = Arrays.asList("a", "b", "c", "d", "e");
lowercase.stream()
        .map(String::toUpperCase)
        .forEach(System.out::println);

Steam은 컬렉션의 저장 요소를 하나씩 순회하면서 처리할 수 있는 코드 패턴.
람다식을 지원한다는 점과 내부 반복자를 사용하기 때문에 병렬 처리가 쉽다는 특징이 있다.

interface default method

public interface TestInterface {
    void doSomething();
    default void doSomethingDefault() {
        System.out.println("doing something default");
    }
}

//implements the interface
public class TestClass implements TestInterface {
    @Override
    public void doSomething() {
        System.out.println("doing something");
    }
}

TestClass testClass = new TestClass();
testClass.doSomething();          // Output: "doing something"
testClass.doSomethingDefault();   // Output: "doing something default"

java 8 이전의 인터페이스는 메서드 정의만 할 수 있었고 구현은 할 수 없었다.
8 버전부터 default method라는 개념이 생기면서 구현 내용도 인터페이스에 포함시킬 수 있게 되었다.

Optional class

//create an optional that contains a value
Optional<String> optional = Optional.of("Hello, world!");
//check if a value is present
if (optional.isPresent()) {
	String value = optional.get();
	System.out.println(value);    // Output: "Hello, world!"
}
		
//create an empty optional
Optional<String> emptyOptional = Optional.empty();
//get a default value if the optional is empty
String value = emptyOptional.orElse("default value");
System.out.println(value);    // Output: "default value"
		
//throw exception
emptyOptional.orElseThrow(() -> new RuntimeException("throw Exception"));

Optional는 null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 참조하더라도 NPE(Null Pointer Exception)가 발생하지 않도록 도와주는 역할을 한다.
따라서 예상치 못한 Null Pointer Exception이 발생될만한 상황에서도 예시와 같이 제공되는 메서드를 통해 간단하게 예외 처리를 할 수 있다.

JAVA 11

  • Oracle JDK와 Open JDK 통합되고 Oracle JDK가 구독형 유료 모델로 전환
  • 람다 지역 변수 사용 방법 변경
  • Third Party JDK로의 이전 필요
  • HTTP 클라이언트 표준화 기능
  • 앱실론 가비지 컬렉터 (Epsilon GC)

JAVA 17

  • 봉인 클래스(Seald Class) 정식 추가
  • 패턴 매칭 프리뷰 단계
  • Incubator (Foreign Function & Memory API)
  • 애플 M1 및 이후 프로세서 탑재 제품군에 대한 정식 지원
  • 의사난수 생성기를 통해 예측하기 어려운 난수를 생성하는 API 추가
  • 컨텐츠 기반의 역직렬화 필터링
  • Record Data Class 추가

Seald class

public sealed class Shape permits Circle, Square {
    // common fields and methods
}

public final class Circle extends Shape {
    // circle-specific fields and methods
}

public final class Square extends Shape {
    // square-specific fields and methods
}

17 버전에서 추가된 Seald Class, Interface는 상속하거나(extends), 구현(implements) 할 클래스를 지정해 두고, 해당 클래스들만 상속 또는 구현을 허용하는 키워드이다.
개발자는 seald 키워드를 통해 어떤 클래스가 해당 클래스를 상속 또는 구현하는지를 쉽게 알 수 있고, 또 제한할 수 있다.

그래서 무슨 버전을 써야할까?

'그래서 무슨 버전을 쓰는 것이 좋은가?'라고 한다면, 단순히 사용할 버전만 생각하는 것이 아니라 개발 환경과 여러 요소들이 모두 고려되어야 하는 문제이기 때문에 정답은 없다고 생각된다.

하지만 스프링 부트 3.0에서 java 17 이상을 사용해야 한다는 점과 java 8의 사용 비율이 줄어들고 있는 추세를 봤을 때, 11 버전 또는 17 버전을 사용하는 것에 큰 문제가 없다면 신규 프로젝트에서는 11 이상의 버전을 도입해 보는 것도 좋을 것 같다.

0개의 댓글