Javascript의 데이터 용도의 Object

2020년 7월 20일 수정

오브젝트(Object) 타입

흔히 객체지향 언어에서 오브젝트란 모든 클래스의 실체화 된 인스턴스를 의미하는데, Javascript에서 만큼은 좀 독특한 타입이다. 이른바 객체 래퍼(wrapper)라고 하는데 사실 이것 만으론 의미 불명이다.

단지 확실한 점이 한 가지 있는데, 바로 사전형(dictionary) 혹은 해시맵(Hash Map)이나 해시테이블(Hash Table)과 비슷한 자료구조 용도로 사용할 수 있다는 점이다.

이 글에서는 바로 이 사전형 타입과 유사한 사용법에 대해서 정리한다.

기본적인 사용법

사실 굉장히 많이 쓰이는 데이터 타입(?)이기 때문에 굳이 설명할 필요가 있을지는 잘 모르겠다. 대략 뭉뚱그려서 아래 처럼 쓰인다.

let obj = {};
obj['key'] = 'value';
console.log(obj.key);       // value
console.log(obj['key']);    // value
console.log(`obj has ${Object.keys(obj).length} elements`);
obj.key = 'updated value';
delete obj.key;
obj.hasOwnProperty('key');  // false

키를 문자열이 아닌 형태로도 액세스할 수 있다는 점은 Javascript 고유의 특징 같다. 물론 이는 Object라는 타입이 단순하게 사전형 용도로 만들어진 것이 아니라는 것을 의미 할지도 모르겠지만 말이다.

키와 값 목록

아래와 같은 방식으로 키와 값 목록을 리스트로 구할 수 있다.

let keys = Object.keys(obj);
let values = Object.values(obj);

리스트로 구할 수 있으면 뭐다? 순환이 가능하다.

순환(Iterate)

이터레이트(Iterate)는 보통 '반복'이라는 의미로 쓰이지만 개인적으론 '순환'이라는 의미가 적당한 것 같아 이런 제목을 지었다. 어쨌든, 오브젝트의 모든 키와 값을 순환하려면 아래처럼 할 수 있다.

for (let key in obj) {
    let value = obj[key];
    ...
}

위의 방법 말고도 아래와 같이 키 리스트를 구해서 순환하는 방법도 있다.

for (let key of Object.keys(obj)) {
    let value = obj[key];
    ...
}

아래와 같이 Object.entries() 를 통해 키와 값 쌍을 리스트로 얻어서 이를 순환하는 방법도 있다.

for (const [key, value] of Object.entries(obj)) {
    console.log(`${key} = ${value}`);
}

특징

사실 Object를 사전형으로 사용할 때의 특징은 Map 클래스와 좀 비교가 된다.

Object는 말 그대로 자바스크립트의 기본 객체 타입이지 사전(Dictionary)형 타입이 아님에 염두를 두자. 만약 특정 클래스의 인스턴스를 사전형 데이터로 잘못 사용하게 되는 경우가 없는지 말이다. 그리고 특정 키의 데이터를 잘못 덮어 쓸 경우 어떤 문제가 생길지 알 수도 없다.

오브젝트는 요소 갯수를 구하는 부분을 잘 보면 알겠지만 키 목록을 통해 한번 나열 시킨 다음 개수를 구하는 방식이라 아무래도 쓸 데 없는 퍼포먼스 낭비가 있다. 심지어 몇 가지 순환 방식도 키 리스트를 구하든 아니면 키-값 리스트를 구해서 순환하든 어쨌든 이미 한번 순환을 한 데이터를 다시 순환해야 한다. 따라서 다량의 데이터를 이용해야 한다면 퍼포먼스에 따라 사용을 고민해야 할지도 모른다.

오브젝트의 키 순서는 입력한 순서와 다를 수도 있다. 만약 키의 순서가 중요하다면 Object가 아닌 Map을 사용하자.