Buffer를 사용하려면 먼저 Buffer의 위치 속성 개념과 위치 속성이 언제 변경되는지 알고 있어야 한다.

mark는 position보다 클 수 없고, position은 limit보다 클 수 없으며, limit은 capacity보다 클 수 없다.0 ≤ mark ≤ position ≤ limit ≤ capacity
Buffer를 생성한 후 사용할 때에는 Buffer가 제공하는 메소드를 잘 활용해야 한다. Buffer마다 공통적으로 사용하는 메소드들도 있고, 데이터 타입별로 Buffer가 개별적으로 가지고 있는 메소드들도 있다.
각 타입별 버퍼 클래스는 Buffer 추상 클래스를 상속하고 있다. Buffer 추상 클래스에는 모든 버퍼가 공통적으로 가져야 할 메소드들이 정의되어 있는데, 위치 속성을 변경하는 flip(), rewind(), clear(), reset() 도 모두 Buffer 추상 클래스에 있다.
| 리턴 타입 | 메소드(매개 변수) | 설명 |
|---|---|---|
| Object | array() | 버퍼가 래핑(wrap)한 배열을 리턴 |
| int | arrayOffset() | 버퍼의 첫 번째 요소가 있는 내부 배열의 인덱스를 리턴 |
| int | capacity() | 버퍼의 전체 크기를 리턴 |
| Buffer | clear() | 버퍼의 위치 속성을 초기화(position=0, limit=capacity) |
| Buffer | flip() | limit을 position으로, position을 0 인덱스로 이동 |
| boolean | hasArray() | 버퍼가 래핑(wrap)한 배열을 가지고 있는지 여부 |
| boolean | hasRemaining() | position과 limit 사이에 요소가 있는지 여부(position < limit) |
| boolean | isDirect() | 운영체제의 버퍼를 사용하는지 여부 |
| boolean | isReadOnly() | 버퍼가 읽기 전용인지 여부 |
| int | limit() | limit 위치를 리턴 |
| Buffer | limit(int newLimit) | newLimit으로 limit 위치를 설정 |
| Buffer | mark() | 현재 위치를 mark로 표시 |
| int | position() | position 위치를 리턴 |
| Buffer | position(int newPosition) | newPosition으로 position 위치를 설정 |
| int | remaining() | position과 limit 사이의 요소의 개수 |
| Buffer | reset() | position을 mark 위치로 이동 |
| Buffer | rewind() | position을 0 인덱스로 이동 |
버퍼에 데이터를 저장하는 메소드는 put()이고, 데이터를 읽는 메소드는 get()이다. 이 메소드들은 Buffer 추상 클래스에는 없고, 각 타입별 하위 Buffer 클래스가 가지고 있다.
get()과 put() 메소드는 상대적(Relative)과 절대적(Absolute)으로 구분된다. 버퍼 내의 현재 위치 속성인 position에서 데이터를 읽고 저장할 경우는 상대적이고, position과 상관없이 주어진 인덱스에서 데이터를 읽고, 저장할 경우는 절대적이다.
상대적 get()과 put() 메소드를 호출하면 position의 값은 증가하지만, 절대적 get() 과 put() 메소드를 호출하면 position의 값은 증가되지 않는다. 만약 position 값이 limit 값까지 증가했는데도 상대적 get()을 사용하면 BufferUnderflowException 예외가 발생하고, put() 메소드를 사용하면 BufferOverflowException 예외가 발생한다.
ShortBuffer와 IntBuffer, LongBuffer, FloatBuffer, DoubleBuffer들도 데이터 타입만 다를 뿐 비슷한 메소드를 가지고 있다.

📌 상대적 메소드와 절대적 메소드를 쉽게 구분하는 방법은
index매개 변수가 없으면 상대적이고,index매개 변수가 있으면 절대적이다.
주로 버퍼가 다 찼을 때 데이터를 저장하려는 경우와 버퍼에서 더 이상 읽어올 데이터가 없을 때 데이터를 읽으려는 경우 예외가 발생한다.
| 예외 | 설명 |
|---|---|
| BufferOverflowException | position이 limit에 도달했을 때 put()을 호출하면 발생 |
| BufferUnderflowException | position이 limit에 도달했을 때 get()을 호출하면 발생 |
| InvalidMarkException | mark가 없는 상태에서 reset() 메소드를 호출하면 발생 |
| ReadOnlyBufferException | 읽기 전용 버퍼에서 put() 또는 compact() 메소드를 호출하면 발생 |
BufferOverflowException과 BufferUnderflowException이다.이것이 자바다 책