이번에 바이트 버퍼를 공부하면서 자주 쓰는 메서드들을 정리해 보겠습니다.

먼제 바이트 버퍼의 생성은 ByteBuffer.allocate(buffer size)를 이용합니다.

또한 다이렉트 바이트 버퍼는 밑의 그림과 같이 생성하고, 확인해볼 수 있습니다.


버퍼는 객체 생성 시 크기가 결정 되며 한번 결정된 크기는 변하지 않습니다.

따라서 크기를 늘이고자 한다면 다시 객체를 생성해 주어야 합니다.


버퍼를 다루기 위한 중요한 값이 있는데 position, limit, capacity 입니다.

  • position : 현재 읽거나 쓸 버퍼의 위치값 입니다.

  • limit : 버퍼에서 읽거나 쓸 수 있는 위치의 한계값 입니다.

  • capacity : 버퍼의 메모리 크기 즉, 사용 가능한 데이터 갯수를 나타냅니다.

  • mark : reset 메서드를 실행했을 때 돌아오는 위치를 지정하는 인덱스입니다.


이들의 관계는…

0 <= mark <= position <= limit <= capacity 입니다.

다른 값들은 모두 이 관계 안에서 변경 가능하지만 capacity는 변경 할 수 없습니다.


이런 버퍼에 읽고 쓰기 위해 제공 되는 메소드는 get()과 put() 이 있습니다.

버퍼에 읽고 쓸 때마다 position이 limit을 향해 증가해 가는데 position = limit 이 되면 더이상 읽고 쓸 수 없습니다.


이때, get() 메서드를 사용한다면 BufferUnderFlowException이 발생하며,

put() 메서드를 사용했다면 BufferOverflowException이 발생하게 됩니다.


이번엔 Buffer 클래스에서 제공하는 메서드를 알아보겠습니다.

  • public final int capacity() : 버퍼의 용량을 리턴합니다.

  • public final int position() : 버퍼의 position 위치를 리턴합니다

  • public final Buffer position( int newPosition ) : 버퍼의 위치를 설정합니다.

  • public final int limit() : 버퍼의 limit 위치를 리턴합니다.

  • public final Buffer limit( int newLimit ) : 버퍼의 limit위치를 설정합다.

  • public final Buffer clear() : 버퍼의 position은 0으로 limit은 capacity 값과 같게 설정합다.

  • public final Buffer flip() : 버퍼의 position은 0으로  limit은 position이 0이 되기 전의 위치와 같게 설정합니다. 이 메서드는 읽기 후 쓰기를 할 때 쓰기 후 읽기를 할 때 사용합니다.

  • public final Buffer rewind() : 버퍼의 position을 초기화 한 후, 데이터를 다시 읽을 때 사용합니다.

  • public final int remaining() : position에서 limit사이에 읽거나 쓸 수 있는 남은 데이터 크기를 반환합니다.

  • public final boolean hasRemaining() : 버퍼가 position = limit 인지 아닌지를 검사해 결과값을 true / false로 반환합니다.

  • compact() : 현재 position과 limit 사이에 남아있는 데이터를 모두 버퍼의 맨 앞으로 이동시킵니다.

이 외에도 여러가지가 있지만 오늘은 여기까지만 정리해 보았습니다.

감사합니다.