5가지 새로운 자바 기능에 대해 배울 것입니다:
1. Sealed Classs
2. 스위치의 패턴 매칭
3. FFI(Foreign Function Interface)
4. 메모리 API
5. Text Block
가장 인기 있는 프로그래밍 언어 중 하나인 Java는 새로운 버전이 출시될 때마다 계속해서 진화하고 향상되고 있습니다. 최신 LTS(Long-Term Support) 버전인 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의 표준 기능이 되었습니다.
'SW > Java' 카테고리의 다른 글
Javax에서 Jakarta 마이그레이션을 처리하기 위한 모범 사례 (0) | 2024.01.08 |
---|---|
Java 21, Java의 주요 단계: Non-blocking IO 및 업그레이드된 ZGC (0) | 2024.01.06 |
Java 21 레코드 및 패턴 매칭: 마스터 데이터 지향 프로그래밍 (0) | 2023.12.25 |
Java 배압(Backpressure) : 개념, 실제 사례, 구현 (0) | 2023.12.20 |
올바른 Java 예외 처리 (0) | 2023.12.16 |