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에서 실제 위치의 값을 구할 수 있는 구조이다.
'Programming > Java' 카테고리의 다른 글
SparkSQL on HBase 사용방법 (0) | 2015.11.23 |
---|---|
Spark on HBase 컴파일 시 의존성 문제 (0) | 2015.11.23 |
Java ByteBuffer to Hex (0) | 2015.07.03 |
Java ByteBuffer에 스스로 Memcpy 하기 (0) | 2015.07.02 |
YARN Distributed Shell Application - Client - 주석 (0) | 2015.03.23 |