ByteBuffer
Published by Woong Geun Jang,
ByteBuffer에 관한 레퍼런스는 많이 없어서 고생했는데,
알고보니 Google Android Developer(링크) 사이트에 친절하게 설명되어 있네? ㅎㅎㅎ
이해하는 것도 문젠데 기억하는 건 더 문제인 듯.
뭔가 딴 작업을 하다가 다시 이쪽으로 오면
늘 flip이랑 compact랑 헷갈리고 position이랑 limit, capacity가 어떻게 변경되는지 혼돈 그 자체.
그래서 정리한다!
ByteBuffer는 일단 바이트를 추상화한 Byte 데이터 클래스를 상속받는다. flip같은 메서드는 Byte의 기능.
일단 Java에서 Byte 클래스에 어떻게 구성했는지 개념적으로 알아보면,

capacity는 버퍼가 담을 수 있는 데이터의 크기
limit는 '개념적'으로 버퍼에 데이터가 담겨있는 상한선.
여기서 ‘개념적’이라고 한 것은 이것은 순전히 개발자가 잘 못 사용하면 의미가 달라질 수 있기 때문이다.
position은 cursor라고 보면 된다. get또는 put 명령으로 데이터를 읽거나 쓰면 한칸씩 뒤로 이동한다.
또한 position은 limit를 넘어갈 수 없다.
put은 데이터를 쓸 때,
get은 데이터를 읽을 때 사용된다.
바이트버퍼의 특징은
- 데이터를 새로 쓸 때 기존 데이터를 지우지 않고 덮어씌운다는 것.
- 읽기 모드와 쓰기 모드로 구분된다는 것
- 얼마나 큰 버퍼를 다룰지 모를 때, 효율적으로 바이트 버퍼를 핸들링하기 위해서 사용된다는 것
좀 더 쉽게 이해하고 기억하기 위해서는 스템플러를 메타포로 생각하면 편하다.
capacity는 아래 그림에서 노란색 홀더가 갈 수 있는 범위.
limit는 스템플러를 닫으면 홀더가 위치하는 곳.
buffer는 스템플러심
position은 스템플러가 찍혀서 나가는 위치
position은 약간 개념이 다를 수 있지만 전체적으로 가장 잘 설명할 수 있는 예제다.
(다른 점은 ByteBuffer는 데이터를 읽을 때 limit가 줄지 않고 position이 이동하는 반면, 스템플러는 position은 가만히 있고 limit가 줄어든다.)

이제 바이트버퍼가 제공하는 추가적인 기능을 보면,
Flip
그렇다면 플립은? 스테플러에 심을 넣고 뚜껑을 닫으면,
홀더가 앞으로 오면서 스테플러심을 확 밀어붙인다.
그러면 스테플러의 position은 맨 앞 스템플러심을 가리키고,
limit는 스템플러심의 개수만큼이 된다.
이 명령을 flip이라고 한다.
Compact
읽지 않은 버퍼의 position부터 limit까지를 position 0으로 복사하는 명령. 결과적으로 다음 프로세스에서 이 버퍼에 쓰는 작업이 수행될 때 사용하는 명령.