[ java ] ByteBuffer

JAVA/JAVA IO 2016. 3. 9. 19:56
728x90
반응형
ByteBuffer
byte 타입의 원소들을 저장하는 버퍼이다.
boolean 타입을 제외하고 다른 모든 타입의 값을 저장할수 있다.
(다른 모든 타입들은 숫자로 나타낼 수 있기 때문에...)

ex 
char : 2byte
int : 4byte
...

기존의 Java IO 에 비해 오버헤드가 적게 걸리는 NIO의 장점을 살리려면,
반드시 ByteBuffer 를 사용을 해야한다.

왜냐하면,

NIO에서 제공하는 Buffer 클래스 중 ByteBuffer 클래스만 Direct Buffer를 지원하기 때문이다.
다시 말해서, 커널 버퍼에 직접 접근할 수 있도록 개선된 NIO의 장점을 이용하기 위해서는 
ByteBuffer의 allocateDirect()라는 메소드를 이용해서 ByteBuffer를 만들어 내야 커널버퍼에 직접 접근 할수 있는
DirectBuffer가 생성된다.

ex
int capacity = 1024;
ByteBuffer b = ByteBuffer.allocateDirect(capacity);

그냥 allocate() 메소드를 사용하면 평범한 버퍼가 생성되므로, 속도향상을 전혀 기대할 수 없다.

그래서 CharBuffer와 같은 익숙한 데이터 타입의 Buffer를 이용하지 못하고, 
불편하더라도 어쩔 수 없이 ByteBuffer를 이용해야 한다.

아래는 viewBuffer 클래스이다.
charBuffer,shortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer


버퍼의 속성 및 메서드

capacity() 메서드 
버퍼객체의 용량을 int 형으로 리턴한다.
버퍼가 수용할 수 있는 최대 원소의 갯수


position
버퍼의 읽히거나 쓰여질 다음 원소의 인덱스

limit
버퍼의 읽히거나 쓰여져서는 안되는 첫번째 원소의 인덱스

※ 최초 버퍼 생성시 상태
position = 0  , limit = 버퍼의 용량


position( int newposition) 
메서드가 호출된 Buffer 타입의 객체를 리턴한다.

limit(int new limit)
메서드가 호출된 Buffer 타입의 객체를 리턴한다.

ex
ByteBuffer newBuf =  buf.limit(512).position(256) ;

hasRemaining() :
포지션과 리미트 사이에 공간이 있는지 확인하여 boolean 타입으로 리턴

duplicate()
Creates a new byte buffer that shares this buffer's content.

원래의 버퍼와 같은 타입의 새로운 객체를 리턴하지만,
독립된 데이터 저장소를 가지고 있지는 않다.

즉, 메모리는 원래의 버퍼와 공유하면서 독립된 positionrhk limit를 가지고 있는 새로운 버퍼를 리턴한다.

slice()
Creates a new byte buffer whose content is a shared subsequence of this buffer's content.
현재 position ~ (limit -1) 까지 매핑


버퍼클래스의 인스턴스 생성
모든 버퍼 클래스는 생성자를 사용해 직접 인스턴스를 생성할 수 없다.
대신, 정적 factory 메서드를 사용해서 인서턴스를 얻는다.

ex
ByteBuffer bBuf = ByteByffer.allocate(1024);  일반 버퍼 생성
ByteBuffer bBuf = ByteByffer.allocateDirect(1024);  커널 버퍼 생성

이 때 생성된 버퍼는 position = 0 , limit = 버퍼용량


ex
FloatBuffer fBuf = FloatBuffer.allocate(100);
※ float 타입이기 때문에 데이터는 400 바이트가 된다.
float 타입 원소가 100개가 들어가며,
float 타입 1개는 4Byte 죠~

※ ByteBuffer 만 이런식으로 생성하고, 다른 버퍼타입은
    ByterBuffer 로 부터 필요한 ViewBuffer 를 생성한다.

[출처] [ java ] ByteBuffer|작성자 GENERAL

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,