Programming/Java

Java ByteBuffer Slice, Position, Array, ArrayOffset

라우드니스 2015. 7. 3. 19:40

C++로 치면 특정 메모리 구간의 중간을 새로운 entry 포인트로 가지는 pointer 변수를 만드는 일과 동일한 것을 할 수 있다.


가령


int a[20];

int *b = a[10];


과 같은 코드가 있다고 한다면 b는 a의 10번째 주소값을 기준으로 가리키는 포인터라고 생각할 수 있다.


ByteBuffer의 경우 기본적으로 position이라는 offset을 가지고 있다.


이 position값은 별도로 지정해 주지 않는다면 put 과 같은 method 이용 시 자동으로 가장 최종 값을 가지고 있게 된다.


다음과 같은 경우:


ByteBuffer byteBuffer = ByteBuffer.allocate(60);


// ...

byteBuffer.position() // 0

byteBuffer.putInt(1)

byteBuffer.position() // 4


이렇게 position은 자동으로 증가하게 된다.


이때 byteBuffer에 대해서 slice를 호출하면


byteBuffer2 = byteBuffer.slice();


byteBuffer.position() // 4

byteBuffer2.position() // 0

byteBuffer2.arrayOffset() // 4


byteBuffer2.putInt(2); // byteBuffer2에 put을 하지만 byteBuffer, byteBuffer2 둘 다 동일하게 값을 가지게 된다.


와 같은 형식으로 만들어 진다.


즉 같은 주소값의 buffer를 공유하지만 position만 초기화되는 ByteBuffer를 만들 수 있는 기능이다. 여기서 arrayOffset을 사용하면 언제든지 자신이 위치한 buffer에서 실제 위치의 값을 구할 수 있는 구조이다.