ByteBuffer 공부해보기(작성중)

Bonjugi·2023년 3월 5일
0

ByteBuffer는 단점이 많다.
내부 구조도 알아야하고, immutable 하지도 않고, Thread-safe 하지도 못하다.
이런 자료형을 주고받는 코드를 작성하면 실수를 유발할수 있겠다.
그것도 아주 치명적이고 찾기도 어려운..
도대체 무슨장점이 있어서 KmsClient 는 이런 자료형을 반환하도록 설계했을까?


ByteBuffer를 사용하는 이유는 다음과 같습니다.

  1. 자료형 변환
    ByteBuffer를 사용하면 byte 배열을 다른 자료형으로 변환할 수 있습니다. ByteBuffer에서 제공하는 get() 메서드를 사용하여 원하는 자료형으로 데이터를 읽을 수 있습니다.

  2. Direct Memory Access
    ByteBuffer는 JVM의 메모리 공간이 아닌 직접적인 메모리에 액세스할 수 있는 Direct Buffer를 제공합니다. 이는 NIO(NIO는 non-blocking I/O를 의미합니다) 기반의 네트워크 프로그래밍에서 빠른 입출력을 위해 많이 사용됩니다.

  3. Byte Order
    ByteBuffer를 사용하면 Big-endian 또는 Little-endian과 같은 바이트 순서(Byte Order)를 지정할 수 있습니다. 이것은 네트워크 프로토콜과 같은 특정한 데이터 형식과 호환되는 바이트 순서를 사용해야 하는 경우에 유용합니다.

  4. Thread-Safe
    ByteBuffer는 Thread-Safe 하지 않지만, ByteBuffer를 사용하여 slice() 나 asReadOnlyBuffer(), duplicate() 와 같은 메소드를 사용할 경우, 버퍼의 상태를 공유하는 대신 새로운 ByteBuffer를 생성하여 다중 스레드 환경에서 안전하게 사용할 수 있습니다.


position, limit, mark?

  • position
    position은 현재 ByteBuffer에서 읽거나 쓰기가 시작될 위치를 나타냅니다. 즉, ByteBuffer에서 읽거나 쓰기를 수행할 때에는 position 값부터 읽거나 쓰기가 시작됩니다.

  • limit
    limit는 ByteBuffer에서 읽거나 쓸 수 있는 데이터의 한계치를 나타냅니다. limit 값은 ByteBuffer를 생성할 때 지정되며, 데이터를 쓸 때에는 limit 값까지만 쓸 수 있습니다. 또한, 데이터를 읽을 때에는 limit 값까지만 읽을 수 있습니다.

  • mark
    mark는 ByteBuffer에서 position 값을 저장하는 역할을 합니다. mark() 메서드를 호출하면 현재의 position 값을 mark 값으로 설정할 수 있으며, reset() 메서드를 호출하면 mark 값으로 position 값을 변경할 수 있습니다.

0개의 댓글