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
이다.이것이 자바다 책