본문 바로가기

JAVA

Java 23: 새로운 기능과 예제 총정리

728x90
반응형

Java 23(JDK 23)은 2024년 9월 17일 정식 릴리스되며, 다양한 새로운 기능, 미리 보기 기능(Preview Features), 인큐베이터 기능, 그리고 일부 기능의 삭제 및 사용 중단이 포함되었습니다. 이 릴리스는 개발자의 생산성과 프로그램 효율성을 높이는 데 중점을 둔 업데이트입니다.

이번 블로그에서는 Java 23의 주요 신규 기능과 이를 활용한 간단한 예제를 통해 새로운 기능들을 자세히 알아보겠습니다.

반응형

 

Primitive 타입 지원 확대 - instanceof와 switch

Java 23에서는 instanceof와 switch 구문에서 **Primitive(기본 타입)**을 지원합니다. 이를 통해 보다 간결하고 명확한 코드를 작성할 수 있습니다.

주요 개선 사항

  1. instanceof가 Primitive 타입에서 동작:
    • 기존에는 참조 타입만 지원.
    • Java 23부터는 int, byte, double 등의 Primitive 타입에도 사용 가능.
  2. switch 표현식에서 모든 Primitive 타입 사용 가능:
    • 기존에는 byte, short, char, int만 지원.
    • 이제 long, float, double, boolean까지 확대.

예제: instanceof에서 Primitive 타입 활용

int value = 10;
if (value instanceof int i && i > 5) {   // Java 23 가능
    System.out.println("Value는 5보다 큰 정수입니다: " + i);
}
 

예제: switch에서 Primitive 타입 활용

float rating = 2.5f;
switch (rating) {
    case 0f -> System.out.println("0 별점");
    case 2.5f -> System.out.println("평균 별점");
    case 5f -> System.out.println("최고 별점");
    default -> System.out.println("유효하지 않은 별점");
}

Markdown 문서화 주석

Java 23부터는 JavaDoc에서 Markdown 문법을 지원하여 개발자가 더 직관적이고 간결한 문서를 작성할 수 있습니다.

전통적인 주석 (Java 22 이하)

/**
 * 이 메소드는 숫자의 팩토리얼을 계산합니다.
 * @param n 계산할 숫자
 * @return 팩토리얼 결과
 */
public static int factorial(int n) {
    // ...
}

Markdown 기반 주석 (Java 23)

/// 이 메소드는 숫자의 팩토리얼을 계산합니다.
///
/// Parameters:
/// * `n`: 계산할 숫자
///
/// Returns:
/// 팩토리얼 결과
public static int factorial(int n) {
    // ...
}

모듈 임포트 선언

**모듈 임포트 선언(JEP 476)**은 전체 모듈을 한 번에 임포트할 수 있게 하여 코드의 간결성을 높입니다.

기존 방식

import java.util.List;
import java.util.Map;
import java.util.Set;

새로운 방식

import module java.util;  // java.util의 모든 클래스와 인터페이스 임포트

List<String> list = new ArrayList<>();
Map<String, String> map = new HashMap<>();

유연한 생성자 본문

Java 23에서는 생성자 내부에서 super() 호출 이전에 코드를 실행할 수 있는 유연성이 제공됩니다.

예제

public class Parent {
    Parent(int value) {
        System.out.println("Parent 생성자 호출: " + value);
    }
}

public class Child extends Parent {
    Child(int value) {
        if (value < 0) value = 0;  // super() 호출 전 유효성 검사
        super(value);  // 부모 생성자 호출
    }
}

Stream Gatherers

Stream Gatherers는 Stream API의 새로운 기능으로, 특정 조건에 따라 데이터를 그룹화하거나 맞춤형 중간 작업을 수행할 수 있습니다.

예제

Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5, 6);
Stream<List<Integer>> gathered = numbers.gather(list -> list.size() == 3);

gathered.forEach(System.out::println);  // 출력: [1, 2, 3], [4, 5, 6]

구조화된 동시성

**구조화된 동시성(Structured Concurrency)**은 여러 쓰레드를 하나의 작업 단위로 처리하여 동시성 관리와 디버깅을 단순화합니다.

예제

try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
    Future<String> task1 = scope.fork(() -> "Task 1 결과");
    Future<String> task2 = scope.fork(() -> "Task 2 결과");

    scope.join();
    scope.throwIfFailed();

    System.out.println(task1.resultNow() + " + " + task2.resultNow());
}

Scoped Values

Scoped Values는 메서드 간 데이터를 매개변수 없이 공유할 수 있도록 하여 가독성과 유지보수성을 개선합니다.

예제

public static final ScopedValue<String> USER_ID = ScopedValue.newInstance();

ScopedValue.where(USER_ID, "12345").run(() -> {
    System.out.println("사용자 ID: " + USER_ID.get());
    new Thread(() -> System.out.println("스레드 내 사용자 ID: " + USER_ID.get())).start();
});

Vector API

**Vector API(8번째 인큐베이터)**는 벡터 연산을 통해 대규모 데이터셋의 계산 효율성을 극대화합니다.

예제

var species = FloatVector.SPECIES_256;
var vectorA = FloatVector.fromArray(species, new float[]{1.0f, 2.0f, 3.0f, 4.0f}, 0);
var vectorB = FloatVector.fromArray(species, new float[]{5.0f, 6.0f, 7.0f, 8.0f}, 0);
var result = vectorA.add(vectorB);

System.out.println(result);  // 출력: [6.0, 8.0, 10.0, 12.0]

ZGC: 세대별 모드 기본값

Z Garbage Collector(ZGC)는 이제 세대별 모드를 기본값으로 설정하여 가비지 컬렉션의 성능을 개선했습니다.

사용법

java -XX:+UseZGC -XX:ZGenerational=true -jar MyApplication.jar

728x90

Java 23은 개발 생산성과 코드 효율성을 대폭 강화하는 기능들을 제공합니다. 새로운 instanceof 및 switch 구문, Markdown 문서화, Stream Gatherers, 구조화된 동시성 등은 Java 개발자들에게 더욱 강력하고 유연한 도구를 제공합니다.

Java 23을 사용해 여러분의 프로젝트를 업그레이드하고, 코드 작성의 편리함과 성능 최적화를 경험해 보세요!

728x90
반응형