레이아웃과 구조체
네이티브 메모리 레이아웃을 설명합니다
레이아웃과 구조체은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
네이티브 메모리 설명하기
네이티브 데이터가 단일 값인 경우는 드뭅니다. C에서는 구조체, 배열, 유니언을 사용합니다. FFM은 이러한 형태를 메모리 레이아웃으로 모델링하여 구조화된 네이티브 메모리를 안전하게 읽고 쓸 수 있게 합니다.
레이아웃 종류
레이아웃 타입은 다음과 같은 작은 계층을 이룹니다.
ValueLayout: 기본 값(정수, 긴 정수, 배정밀도 실수, 주소)SequenceLayout: 레이아웃 하나를 고정된 크기의 배열로 표현StructLayout: 필드를 순서대로 배치UnionLayout: 필드가 서로 겹쳐 배치됨
값 레이아웃
가장 단순한 레이아웃은 기본 제공 값 레이아웃입니다. 값 레이아웃에는 크기, 정렬, 바이트 순서가 포함됩니다.
import java.lang.foreign.ValueLayout;
public class Main {
public static void main(String[] args) {
System.out.println("int size: " + ValueLayout.JAVA_INT.byteSize());
System.out.println("double size: " + ValueLayout.JAVA_DOUBLE.byteSize());
}
}구조체 정의하기
MemoryLayout.structLayout(...)으로 C 구조체를 모델링하고, withName으로 각 필드의 이름을 지정합니다. C의 struct Point { int x; int y; }를 예로 들어 보겠습니다.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
StructLayout point = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("x"),
ValueLayout.JAVA_INT.withName("y"));
System.out.println("Point size: " + point.byteSize());
}
}필드용 VarHandle
이름이 지정된 필드를 읽거나 쓰려면 경로 표현식을 사용해 VarHandle을 만듭니다. groupElement("x")는 이름으로 필드를 선택합니다.
import java.lang.foreign.*;
import java.lang.invoke.VarHandle;
public class Main {
public static void main(String[] args) {
StructLayout point = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("x"),
ValueLayout.JAVA_INT.withName("y"));
VarHandle xHandle = point.varHandle(
MemoryLayout.PathElement.groupElement("x"));
System.out.println("Built VarHandle for x: " + xHandle);
}
}구조체 읽고 쓰기
레이아웃에 맞는 크기로 세그먼트를 할당한 다음, VarHandle을 사용해 필드를 설정하고 가져옵니다. 이는 C 구조체를 채우는 작업과 같습니다.
import java.lang.foreign.*;
import java.lang.invoke.VarHandle;
public class Main {
public static void main(String[] args) {
StructLayout point = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("x"),
ValueLayout.JAVA_INT.withName("y"));
VarHandle xh = point.varHandle(MemoryLayout.PathElement.groupElement("x"));
VarHandle yh = point.varHandle(MemoryLayout.PathElement.groupElement("y"));
try (Arena arena = Arena.ofConfined()) {
MemorySegment p = arena.allocate(point);
xh.set(p, 0L, 3);
yh.set(p, 0L, 4);
System.out.println("Point = (" + xh.get(p, 0L) + ", " + yh.get(p, 0L) + ")");
}
}
}패딩과 정렬
C 컴파일러는 필드가 정렬되도록 패딩을 삽입합니다. FFM은 패딩을 자동으로 추가하지 않으므로 C 레이아웃과 정확히 일치하도록 MemoryLayout.paddingLayout(n)을 포함해야 합니다.
정렬을 잘못 지정하면 간격 뒤에 있는 모든 필드가 손상됩니다.
명시적 패딩 예제
struct { char c; int n; }에서는 정수 필드가 4바이트 경계에 맞춰야 하므로 char 뒤에 패딩 바이트 3개가 이어집니다.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
StructLayout s = MemoryLayout.structLayout(
ValueLayout.JAVA_BYTE.withName("c"),
MemoryLayout.paddingLayout(3),
ValueLayout.JAVA_INT.withName("n"));
System.out.println("Aligned struct size: " + s.byteSize());
}
}시퀀스 레이아웃
SequenceLayout은 배열을 설명합니다. MemoryLayout.sequenceLayout(count, element)을 사용하면 예를 들어 배정밀도 실수 10개로 이루어진 배열을 모델링할 수 있습니다.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
SequenceLayout arr = MemoryLayout.sequenceLayout(10, ValueLayout.JAVA_DOUBLE);
System.out.println("Array bytes: " + arr.byteSize());
}
}중첩 레이아웃
레이아웃은 서로 조합할 수 있습니다. 구조체에는 시퀀스가 포함될 수 있고, 시퀀스에는 구조체가 포함될 수 있습니다. sequenceElement() 및 groupElement(name)과 같은 경로 표현식으로 중첩된 데이터 안쪽까지 탐색할 수 있습니다.
이 방식은 복잡성에 제한이 없는 실제 C 데이터 구조를 처리합니다.
오프셋과 슬라이싱
경로에서 필드의 byteOffset을 조회하고 segment.asSlice(offset, size)를 사용해 하위 세그먼트를 얻을 수 있습니다. 이는 구조체의 특정 필드 하나를 네이티브 함수에 전달할 때 유용합니다.
빠른 확인
구조체를 사용할 때 흔히 발생하는 문제를 떠올려 보세요.
복습
네이티브 데이터를 설명하는 방법을 배웠습니다.
- 레이아웃 종류:
ValueLayout,SequenceLayout,StructLayout,UnionLayout withName으로 필드 이름을 지정하고VarHandle과 경로 요소로 접근- 올바른 정렬을 위해 명시적인
paddingLayout추가 - 중첩 레이아웃을 조합하고
asSlice로 슬라이스
이로써 외부 함수 및 메모리 API 과정을 모두 마쳤습니다.
자주 묻는 질문
“레이아웃과 구조체” 강의는 무료인가요?
네 — “레이아웃과 구조체” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“레이아웃과 구조체”에서 뭘 배우나요?
네이티브 메모리 레이아웃을 설명합니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“레이아웃과 구조체” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.