[Java] NIO - 버퍼 위치 속성, 메소드

kiteB·2022년 5월 12일
0

Java2

목록 보기
33/36
post-thumbnail

[ Buffer의 위치 속성 ]

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

✅ Buffer의 위치 속성

✅ 위치 속성의 크기 관계

  • markposition보다 클 수 없고, positionlimit보다 클 수 없으며, limitcapacity보다 클 수 없다.
0 ≤ mark ≤ position ≤ limit ≤ capacity

[ Buffer 메소드 ]

Buffer를 생성한 후 사용할 때에는 Buffer가 제공하는 메소드를 잘 활용해야 한다. Buffer마다 공통적으로 사용하는 메소드들도 있고, 데이터 타입별로 Buffer가 개별적으로 가지고 있는 메소드들도 있다.

공통 메소드

각 타입별 버퍼 클래스는 Buffer 추상 클래스를 상속하고 있다. Buffer 추상 클래스에는 모든 버퍼가 공통적으로 가져야 할 메소드들이 정의되어 있는데, 위치 속성을 변경하는 flip(), rewind(), clear(), reset() 도 모두 Buffer 추상 클래스에 있다.


✅ Buffer 추상 클래스가 가지고 있는 메소드들

리턴 타입메소드(매개 변수)설명
Objectarray()버퍼가 래핑(wrap)한 배열을 리턴
intarrayOffset()버퍼의 첫 번째 요소가 있는 내부 배열의 인덱스를 리턴
intcapacity()버퍼의 전체 크기를 리턴
Bufferclear()버퍼의 위치 속성을 초기화(position=0, limit=capacity)
Bufferflip()limit을 position으로, position을 0 인덱스로 이동
booleanhasArray()버퍼가 래핑(wrap)한 배열을 가지고 있는지 여부
booleanhasRemaining()position과 limit 사이에 요소가 있는지 여부(position < limit)
booleanisDirect()운영체제의 버퍼를 사용하는지 여부
booleanisReadOnly()버퍼가 읽기 전용인지 여부
intlimit()limit 위치를 리턴
Bufferlimit(int newLimit)newLimit으로 limit 위치를 설정
Buffermark()현재 위치를 mark로 표시
intposition()position 위치를 리턴
Bufferposition(int newPosition)newPosition으로 position 위치를 설정
intremaining()position과 limit 사이의 요소의 개수
Bufferreset()position을 mark 위치로 이동
Bufferrewind()position을 0 인덱스로 이동

데이터를 읽고 저장하는 메소드

버퍼에 데이터를 저장하는 메소드는 put()이고, 데이터를 읽는 메소드는 get()이다. 이 메소드들은 Buffer 추상 클래스에는 없고, 각 타입별 하위 Buffer 클래스가 가지고 있다.

get()put() 메소드는 상대적(Relative)절대적(Absolute)으로 구분된다. 버퍼 내의 현재 위치 속성인 position에서 데이터를 읽고 저장할 경우는 상대적이고, position과 상관없이 주어진 인덱스에서 데이터를 읽고, 저장할 경우는 절대적이다.

상대적 get()put() 메소드를 호출하면 position의 값은 증가하지만, 절대적 get()put() 메소드를 호출하면 position의 값은 증가되지 않는다. 만약 position 값이 limit 값까지 증가했는데도 상대적 get()을 사용하면 BufferUnderflowException 예외가 발생하고, put() 메소드를 사용하면 BufferOverflowException 예외가 발생한다.


✅ ByteBuffer와 CharBuffer에서 제공하는 get() 메소드와 put() 메소드

  • ShortBufferIntBuffer, LongBuffer, FloatBuffer, DoubleBuffer들도 데이터 타입만 다를 뿐 비슷한 메소드를 가지고 있다.

📌 상대적 메소드와 절대적 메소드를 쉽게 구분하는 방법은
index 매개 변수가 없으면 상대적이고, index 매개 변수가 있으면 절대적이다.


버퍼 예외의 종류

주로 버퍼가 다 찼을 때 데이터를 저장하려는 경우와 버퍼에서 더 이상 읽어올 데이터가 없을 때 데이터를 읽으려는 경우 예외가 발생한다.


✅ 버퍼와 관련된 예외 클래스

예외설명
BufferOverflowExceptionposition이 limit에 도달했을 때 put()을 호출하면 발생
BufferUnderflowExceptionposition이 limit에 도달했을 때 get()을 호출하면 발생
InvalidMarkExceptionmark가 없는 상태에서 reset() 메소드를 호출하면 발생
ReadOnlyBufferException읽기 전용 버퍼에서 put() 또는 compact() 메소드를 호출하면 발생
  • 이 중에서 가장 흔하게 발생하는 예외는 BufferOverflowExceptionBufferUnderflowException이다.

[ 참고자료 ]

이것이 자바다 책

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글