SW/Java

Java 17의 흥미로운 새로운 기능 예를 들어 보기

얇은생각 2024. 1. 3. 07:30
반응형

5가지 새로운 자바 기능에 대해 배울 것입니다:

1. Sealed Classs

2. 스위치의 패턴 매칭

3. FFI(Foreign Function Interface)

4. 메모리 API

5. Text Block

 

가장 인기 있는 프로그래밍 언어 중 하나인 Java는 새로운 버전이 출시될 때마다 계속해서 진화하고 향상되고 있습니다. 최신 LTS(Long-Term Support) 버전인 Java 17은 해당 언어에 몇 가지 흥미로운 기능과 향상된 기능을 제공합니다. 이 글에서는 Java 17의 주목할 만한 새로운 기능 중 일부를 살펴보고 효과적인 사용 방법을 이해하는 데 도움이 되는 실용적인 예를 제공할 것입니다.

 

 

Java 17의 흥미로운 새로운 기능 예를 들어 보기

 

 

봉인된 클래스

봉인된 클래스는 어떤 클래스나 인터페이스가 확장되거나 구현될 수 있는지를 제한할 수 있게 해줍니다. 이 기능은 봉인된 클래스에서 누가 상속받을 수 있는지를 제어함으로써 캡슐화를 향상시키고 코드 무결성을 유지하는 데 도움이 됩니다. 예를 들어 보겠습니다:

public sealed class Shape permits Circle, Square, Triangle {
    // Common properties and methods for all shapes
}

final class Circle extends Shape {
    // Circle-specific properties and methods
}

final class Square extends Shape {
    // Square-specific properties and methods
}

final class Triangle extends Shape {
    // Triangle-specific properties and methods
}

 

Shape 클래스를 확장하려는 다른 클래스(Circle, Square 및 Triangle과 같은 허용 클래스는 제외)는 컴파일 오류가 발생합니다

 

 

스위치의 패턴 일치

 자바 17은 스위치 문에 패턴 매칭을 도입하는데, 이것은 변수의 선언과 조건부 검사를 결합함으로써 코드를 단순화합니다. 다음의 예는 다음과 같습니다:

public String getDayOfWeek(int day) {

            String dayOfWeek = switch (day) {

            case 1 -> "Monday";

            case 2 -> "Tuesday";

            case 3 -> "Wednesday";

            case 4 -> "Thursday";

            case 5 -> "Friday";

            default -> "Unknown";

        };

        return dayOfWeek;

    }

 

 

 

외부 기능 인터페이스(FFI)

FFI는 자바와 같은 상위 프로그래밍 언어가 C나 C++와 같은 하위 언어로 작성된 함수나 라이브러리와 상호 작용할 수 있게 해줍니다. 자바는 이를 위해 자바 네이티브 인터페이스(JNI)를 가지고 있습니다. JNI는 자바 응용 프로그램이 네이티브 응용 프로그램과 라이브러리에 의해 호출되고 호출되도록 해줍니다. JNI를 사용하면 C나 C++와 같은 언어로 작성된 동적 링크 라이브러리(DLL) 또는 공유 객체 파일(SO)에 함수를 로드하고 호출할 수 있습니다.

자바에서 JNI를 사용하는 기본 개요는 다음과 같습니다:

네이티브 키워드를 지정하여 네이티브 메서드 선언이 포함된 Java 클래스를 작성합니다.

이러한 네이티브 메서드를 C 또는 C++로 구현하여 공유 라이브러리에 컴파일합니다.

공유 라이브러리를 로드하려면 Java에서 System.load Library 또는 System.load 메서드를 사용합니다.

Java 코드에서 네이티브 메서드를 호출합니다.

예제:

 

 

1단계: Java 클래스 쓰기

먼저 네이티브 메서드를 선언하는 자바 클래스를 만듭니다. 이 예에서는 NativeSum.java라고 부릅니다.

public class NativeSum {
    // Load the shared library containing the native function
    static {
        System.loadLibrary("NativeSum");
    }

    // Declare the native method to add two integers
    public native int add(int a, int b);

    public static void main(String[] args) {
        NativeSum nativeSum = new NativeSum();
        int result = nativeSum.add(5, 7);
        System.out.println("Sum: " + result);
    }
}

 

 

2단계: 네이티브 C 코드 작성

다음으로 네이티브 메소드를 구현하는 C 파일을 생성합니다. 이 예에서는 NativeSum.c라고 부릅니다.

#include <jni.h>

JNIEXPORT jint JNICALL Java_NativeSum_add(JNIEnv *env, jobject obj, jint a, jint b) {
    return a + b;
}

 

 

3단계: 네이티브 코드 컴파일

네이티브 C 코드를 공유 라이브러리에 컴파일합니다. 이 작업을 수행하는 정확한 단계는 개발 환경과 플랫폼에 따라 달라집니다. 유닉스 계열 시스템에서 GCC를 사용하는 간단한 예는 다음과 같습니다:

gcc -shared -o libNativeSum.so -I$JAVA_HOME/포함 -I$JAVA_HOME/포함/리눅스 NativeSum.c

$JAVA_HOME을 Java 설치 경로로 대체합니다.

 

 

4단계: Java 프로그램 실행

이제 자바 프로그램을 실행할 수 있습니다

java NativeSum

 

 

이 프로그램은 libNativeSum.so 공유 라이브러리를 로드하고 두 개의 정수를 더하고 결과를 반환하는 add 메서드를 호출합니다. 이 경우 5와 7을 더하고 "Sum: 12"를 인쇄합니다

 

 

메모리 API

자바는 자체 메커니즘을 통해 메모리 관리를 제공하며, 자바 개발자들은 일반적으로 메모리 할당이나 할당 해제를 직접 처리할 필요가 없습니다. 자바의 메모리 관리에는 자동 가비지 컬렉션(garbage collection)이 포함되어 있어 더 이상 사용하지 않는 메모리를 정리해 줍니다. 자바 가상 머신(JVM)이 메모리 관리를 대신해 줍니다.

그러나 메모리 관련 특정 요구 사항이 있거나 오프-heap 메모리를 사용해야 하는 경우 Java의 NIO(New I/O 패키지)와 같은 타사 라이브러리 또는 기능을 사용할 수 있습니다. NIO를 사용하면 메모리 매핑 파일, 버퍼 및 채널을 포함하여 보다 직접적이고 효율적인 메모리 조작이 가능합니다. 특정 로우 레벨 작업 및 고성능 I/O에 유용할 수 있습니다.

Java의 NIO(New I/O) 패키지를 사용하여 메모리 매핑 파일 및 메모리 버퍼와 함께 작동하는 예는 다음과 같습니다.

 

 

1단계

이 예에서는 메모리 버퍼를 사용하여 메모리 매핑 파일에 데이터를 읽고 쓰는 간단한 프로그램을 만들 것입니다.

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class MemoryMappedFileExample {
    public static void main(String[] args) throws Exception {
        // Create a random access file for read and write operations
        RandomAccessFile file = new RandomAccessFile("example.txt", "rw");

        // Get the file channel
        FileChannel channel = file.getChannel();

        // Map the file into memory
        MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 1024);

        // Write data to the memory-mapped file
        String data = "Hello, Memory-Mapped File!";
        buffer.put(data.getBytes());

        // Read data from the memory-mapped file
        buffer.flip();
        byte[] readData = new byte[data.length()];
        buffer.get(readData);

        System.out.println(new String(readData));

        // Close the file and channel
        channel.close();
        file.close();
    }
}

 

이 예에서, we create a memory-maped file called "예.txt,"write some data to, read back, and print.

 

 

2단계: 컴파일 앤 런

자바 프로그램을 컴파일하고 실행한다. 'It will create a example'.txt" in the current directory and write "안녕, 메모리 매핑 파일!" 지붕 메모리 맵 파일 및 프린트에서 데이터를 가져옵니다.

메모리 매핑된 파일은 운영체제의 가상 메모리 시스템을 사용하기 때문에 물리 메모리보다 클 수 있습니다. 전체 파일을 명시적으로 메모리에 로드하지 않고 매핑된 데이터를 파일에서 직접 읽고 씁니다.

 

 

텍스트 블록

자바 17에서, "Text Blocks"는 긴 텍스트 콘텐츠로 읽기 쉬운 코드를 단순화하고 만들기 위해 도입되었다. 텍스트 블록은 더 자연스럽고 간결한 방법으로 다중 라인 스트링에 대해 이야기합니다. 티야는 트리플 더블 쿼터와 함께 intention is preserved를 가지고 있다. 여기 텍스트 블록의 예시가 있습니다.

public class TextBlocksExample {
    public static void main(String[] args) {
        String longText = """
            This is a text block in Java 17.
            It allows you to write multi-line strings
            without needing to escape newline characters.
            
            You can also preserve leading whitespace for formatting.
            \tIndented text is also preserved.
            """;

        System.out.println(longText);
    }
}

 

 

​이 예제에서는 텍스트 블록을 사용하여 여러 줄의 문자열을 만듭니다. 들여쓰기가 유지되고, \n으로 새 줄 문자를 수동으로 피할 필요가 없음을 알 수 있습니다. 따라서 코드 내에서 큰 블록의 텍스트를 작성하고 유지하는 것이 훨씬 쉬워집니다.

텍스트 블록은 SQL 쿼리, JSON, HTML, XML 또는 여러 줄에 걸쳐 있는 텍스트 기반 콘텐츠를 사용할 때 특히 유용합니다. 이들은 코드 가독성과 유지 관리성을 향상시키는 데 도움이 됩니다.

텍스트 블록은 Java 13에서 미리보기 기능으로 도입되었으며 Java 14, 15 및 16에서 더욱 향상되었으며 Java 17의 표준 기능이 되었습니다.

반응형