NATIVE

settings_applicationsObject

NATIVE

Public Notification
  • account_tree
  • bug_report

ObjectDataView

플랫폼 자체 엔디안(endian)과 별개로 ArrayBuffer 또는 SharedArrayBuffer 유형의 숫자 데이터를 읽고 쓰기 위한 저수준 인터페이스를 제공한다.

설명

DataView 객체는 ArrayBuffer 또는 SharedArrayBuffer 객체의 뷰(view) 역할을 한다. 즉, ArrayBuffer  객체가 메모리에 저장 공간을 준비하고 DataView 객체로 준비된 저장 공간에 데이터를 쓰고 읽는다. 사실 뷰 역할을 맡은 객체는 DataView만은 아니다. TypedArray 객체를 상위 클래스로 둔 타입별 뷰 객체가 존재한다. 다양한 하위 유형의 뷰 객체가 존재하므로 보통 통틀어서 TypedArray 객체라고 부른다. 뷰 역할을 하는 DataViewTypedArray 객체의 차이는 프리타입이냐 그렇지 않냐의 차이이다. 여기서 프리타입이라는 의미는 적절할지 모르겠지만 개념적으로 뷰 역할을 하기 위해서 어떠한 숫자 유형도 정해지지 않았다는 의미이다. TypedArray 객체의 하위 클래스로 다양한 숫자 유형의 뷰(view) 객체가 존재한다고 했으니 DataView 객체를 "프리스타일 뷰"로 불리어도 되지 않겠는가. 현재 섹션은 DataView 객체에 대해 다루고 있으니 TypedArray 객체는 해당 섹션을 참고하기 바란다. 

DataView 객체는 일명 "프리스타일 뷰"라고 했다. 숫자 유형을 가리지 않는 것은 장점이지만 어떤 면에서는 내부적으로 효율적이지 못한 면도 있을 수 있다. 그럼에도 TypedArray 객체와 함께 존재하는 것은 이유는 뭘까? 사실 DataView 객체의 가치는 무엇일까? 라고 이야기를 시작하는 것이 양심적이지 못하다는 생각이 들었다. 왜냐면 그동안의 웹 개발은 메모리의 이진 데이터를 신경쓸 일이 없었다. 신경쓰고 싶어도 환경이 그러하지 못하니 어쩔수 없는 일인 것이었다. 그런데 ArrayBuffer라는 녀석이 전면에 등장을 했으니 필자도 많이 당혹스럽다. 이 기술에 대한 많은 경험이 전제가 되어 가치를 들려주고 싶지만 필자 역시 능력있는 다른 개발자 또는 웹 기술 인프라 개발에 직간접적으로 관여하는 능력있는 분들의 경험을 읽은 독자 수준에서 이야기하고자 한다.

ArrayBuffer 객체의 활용성은 해당 섹션에서 다루므로 배제하고 왜 DataView 객체를 ArrayBuffer 객체의 뷰(view)로 사용하는 가에 대해 알아보자. 메모리에 이진 데이터를 저장할 때 순서에 관여하는 기술적인 용어로 엔디안(endain)이라는 것이 있다.  엔디안은 순서를 정하는 대표적인 두 가지 방식이 있다. 눈에 보이는 데이터의 순서에 따라 메모리에 할당하는 빅 엔디안(big-endian)과 상대적으로 순서를 거꾸로 할당하는 리틀 엔디안(little-endian)이 있다. 이 두 가지가 어떠한 기술적인 장점을 가지고 있는지는 여기서는 중요하지 않으므로 생략하고 DataView 객체와 어떤 연관점이 있는지를 알아보자. 우선 다른 뷰 객체인 TypedArray 객체는 기본적으로 시스템의 엔디안을 따른다. 존재하는 대부분의 컴퓨터는 x86(80x86) 아키텍쳐를 갖는 CPU가 탑재되었다. 그런데  x86(80x86) 아키텍쳐의 CPU는 리틀 엔디안으로 메모리에 데이터를 적재한다. 그렇기 때문에 TypedArray 뷰 객체는 일반적으로 데이터를 거꾸로 저장하는 리틀 엔디안을 사용한다고 볼 수 있다. 반면에 DataView는 시스템의 엔디안과는 독립적이다. 즉 자체적으로 엔디안을 옵션으로 결정한다. 개발자가 별도로 명시하지 않으면 DataView는 빅 엔디안으로 처리한다. 이것은 데이터를 출력하는 데 있어서 대단한 장점이 아닐 수 없다. 만약에 리틀 엔디안으로 저장된 데이터를 불러와 표시하기 위해서는 순서를 재조합하는 알고리즘을 거쳐야 한다. 이것이 DataView가 갖는 가치이다.

실제로 DataViewTypedArray 객체의 처리 결과를 아래 [예제]에서 확인할 수 있다.

예제

(1) 기본적으로 리틀 엔디안을 사용하는 TypedArray 뷰의 할당 순서
(2) 기본적으로 빅 엔디안을 사용하는 DataView의 할당 순서

하위 트리 탐색

  • Constructor

    DataView 인스턴스는 new 연산자와 함께 DataView() 생성자 함수로만 생성이 가능하다.

    • DataView()

      새로운 DataView 인스턴스를 생성한다.

  • [[Prototype]]

    • Properties

      • buffer

        현재 DataView 객체에 연결되어 있는 ArrayBuffer 또는 SharedArrayBuffer 객체의 참조를 조회한다.

      • byteLength

        현재 DataView 객체의 길이(바이트: byte)를 조회한다.

      • byteOffset

        현재 DataView 객체의 연결된 버퍼(buffer)의 시작부터 오프셋(offset)을 조회한다.

    • Methods

      • getBigInt64()

        지정된 바이트 오프셋(byte offset)에서부터 8바이트(byte)를 읽어와 64비트(bit) 부호가 있는 정수로 반환한다.

      • getBigUint64()

        지정된 바이트 오프셋(byte offset)에서부터 8바이트(byte)를 읽어와 64비트(bit) 부호가 없는 정수로 반환한다.

      • getFloat32()

        지정된 바이트 오프셋(byte offset)에서부터 4바이트(byte)를 읽어와 32비트(bit) 부동 소수점 숫자로 반환한다.

      • getFloat64()

        지정된 바이트 오프셋(byte offset)에서부터 8바이트(byte)를 읽어와 64비트(bit) 부동 소수점 숫자로 반환한다.

      • getInt16()

        지정된 바이트 오프셋(byte offset)에서부터 2바이트(byte)를 읽어와 16비트(bit) 부호가 있는 정수로 반환한다.

      • getInt32()

        지정된 바이트 오프셋(byte offset)에서부터 4바이트(byte)를 읽어와 32비트(bit) 부호가 있는 정수로 반환한다.

      • getInt8()

        지정된 바이트 오프셋(byte offset)에서부터 1바이트(byte)를 읽어와 8비트(bit) 부호가 있는 정수로 반환한다.

      • getUint16()

        지정된 바이트 오프셋(byte offset)에서부터 2바이트(byte)를 읽어와 16비트(bit) 부호가 없는 정수로 반환한다.

      • getUint32()

        지정된 바이트 오프셋(byte offset)에서부터 4바이트(byte)를 읽어와 32비트(bit) 부호가 없는 정수로 반환한다.

      • getUint8()

        지정된 바이트 오프셋(byte offset)에서부터 1바이트(byte)를 읽어와 8비트(bit) 부호가 없는 정수로 반환한다.

      • setBigInt64()

        지정된 바이트 오프셋(byte offset)에서 시작하는 8byte64bit 부호가 있는 정수로 저장한다.

      • setBigUint64()

        지정된 바이트 오프셋(byte offset)에서 시작하는 8byte64bit 부호가 없는 정수로 저장한다.

      • setFloat32()

        지정된 바이트 오프셋(byte offset)에서 시작하는 4byte32bit 부동 소수점 숫자로 저장한다.

      • setFloat64()

        지정된 바이트 오프셋(byte offset)에서 시작하는 8byte64bit 부동 소수점 숫자로 저장한다.

      • setInt16()

        지정된 바이트 오프셋(byte offset)에서 시작하는 2byte16bit 부호가 있는 정수로 저장한다.

      • setInt32()

        지정된 바이트 오프셋(byte offset)에서 시작하는 4byte32bit 부호가 있는 정수로 저장한다.

      • setInt8()

        지정된 바이트 오프셋(byte offset)에서 시작하는 1byte8bit 부호가 있는 정수로 저장한다.

      • setUint16()

        지정된 바이트 오프셋(byte offset)에서 시작하는 2byte16bit 부호가 없는 정수로 저장한다.

      • setUint32()

        지정된 바이트 오프셋(byte offset)에서 시작하는 4byte32bit 부호가 없는 정수로 저장한다.

      • setUint8()

        지정된 바이트 오프셋(byte offset)에서 시작하는 1byte8bit 부호가 없는 정수로 저장한다.

버전 명세

ECMAScript 2024(15th Edition)
#sec-dataview-objects

지원 웹브라우저