키가 지정된 컬렉션

객체 리터럴을 사용하여 키-값 쌍을 저장하고, 배열을 사용하여 반복 가능한 값 컬렉션을 저장할 수 있습니다. 또한 ES6에는 키-값 쌍 매핑 및 개별 값 설정 등 보다 세분화된 사용 사례에 적합한 특수한 데이터 구조도 도입되었습니다.

매핑

맵은 객체 리터럴과 마찬가지로 키-값 쌍으로 정보를 저장하는 반복 가능한 데이터 구조입니다. 객체 리터럴과 달리 맵은 값과 키 모두 모든 데이터 유형을 가질 수 있으며 맵에 추가되는 순서는 맵을 반복할 때 유지됩니다.

지도를 만들려면 Map() 생성자를 사용합니다.

const myMap = new Map();

myMap;
> Map(0)

두 요소로 구성된 배열과 유사한 객체가 포함된 배열 (또는 반복기 객체)과 유사한 구문을 사용하여 지도에 데이터를 미리 채울 수 있습니다. 두 요소로 구성된 각 데이터 구조의 첫 번째 요소가 키가 되고, 두 번째 요소가 키와 연결된 값이 됩니다. 가장 간단한 형식은 사실상 배열이며, 각 요소 자체가 두 요소(키와 맵에 추가할 요소의 값)로 구성된 배열입니다.

const myMap = new Map([
    [ "myKey", "A string value" ],
    [ "mySecondKey", 500 ],
    [ "myThirdKey", true ]
]);

myMap;
> Map(3) {'myKey' => 'A string value', 'mySecondKey' => 500, 'myThirdKey' => true}

마찬가지로 Map 객체는 값 및 키가 모두 임의의 데이터 유형과 값을 사용할 수 있다는 점에서 객체 리터럴과 다릅니다.

const notAFunction = () => console.log( "function" );
const myMap = new Map([
  [ null, 0 ],
  [ false, "This is false" ],
  [ undefined, "No defined value" ],
  [ NaN, "Not a number" ]
]);

myMap;
> Map(4) {null => 0, false => 'This is false', undefined => 'No defined value', NaN => 'Not a number'}

지도 요소를 가져오거나 설정하거나 삭제하려면 Map 생성자에서 상속된 메서드를 사용합니다.

const myMap = new Map();

myMap;
> Map(0)

myMap.set( "myKey", "My value." );

myMap.has( "myKey" );
> true

myMap.get( "myKey" );
"My value."

myMap.delete( "myKey" );

myMap;
> Map(0)

맵의 키는 고유합니다. 즉, 동일한 키를 설정하면 이전에 저장된 키-값 쌍을 덮어씁니다.

const myMap = new Map([ [ "myKey", "A string value" ] ]);

myMap.set( "myKey", 500 );

myMap;
> Map(1) {'myKey' => 500}

객체와 마찬가지로 const로 선언된 변수에 지도를 할당하고 이 지도를 수정할 수 있습니다. 그러나 const의 다른 사용 사례와 마찬가지로 변수 자체를 변경하거나 삭제할 수는 없습니다.

const myMap = new Map();
myMap.set( "myKey", "A string value" );

myMap;
> Map(1) {'myKey' => 500}

WeakMap

WeakMap은 '약한' references가 있는 맵으로, 전역 기호 레지스트리에 추가되지 않은 객체 또는 기호에 대한 참조여야 합니다.

WeakMap을 만들려면 다음과 같이 WeakMap() 생성자를 사용합니다.

const myWeakMap = new WeakMap();

myWeakMap;
> WeakMap(0)

WeakMap 구문은 Map과 비슷하지만 WeakMaps는 반복 가능하지 않으며 객체나 기호 이외의 값을 키로 사용하려고 하면 구문 오류가 발생합니다. WeakMap 외부에 키에 대한 references가 없으면 WeakMap의 해당 객체 또는 기호와 관련 값 모두 가비지 컬렉션에 적합합니다.

따라서 객체 참조를 키로 사용하여 WeakMap에 객체와 연결된 메타데이터를 저장하는 등의 사용 사례가 허용됩니다. 이 객체에 대한 다른 참조가 없고 해당 객체가 메모리에서 삭제되면 관련 메타데이터도 삭제됩니다.

세트

세트는 고유한 값만 포함할 수 있지만 세트는 배열과 다소 비슷한 고유한 값의 반복 가능한 컬렉션입니다. 지도와 마찬가지로 Set을 반복하면 요소가 추가된 순서가 유지됩니다.

세트를 만들려면 Set() 생성자를 사용합니다.

const mySet = new Set();

mySet;
> Set []

배열 리터럴에서 Set을 만들 수도 있습니다.

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

세트는 중복 요소를 허용하지 않으므로 동일한 값의 여러 인스턴스를 포함하는 배열에서 세트가 생성되면 그 값의 첫 번째 인스턴스만 유지됩니다.

const mySet = new Set([ 1, 2, 3, 2 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

Set에서 요소를 추가하거나 삭제하려면 Set 생성자에서 상속된 메서드를 사용합니다. 이러한 메서드는 색인을 참조하는 대신 요소 자체의 값에 따라 요소에 작업을 수행합니다.

const mySet = new Set();

mySet.add( "My value." );

mySet;
> Set [ "My value." ]

mySet.has( "My value." );
> true

mySet.delete( "My value." );

mySet;
> Set []

세트는 색인을 생성한 컬렉션이 아니며 이러한 방식으로 사용할 수도 없지만, 세트의 요소는 삽입 순서대로 반복됩니다. 세트에 중복 요소 값을 추가하려고 하면 원래 삽입 순서가 보존되어 건너뜁니다.

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

mySet.add( 2 );
> Set(3) [ 1, 2, 3 ]

세트에서 배열을 만들려면 Array.from() 메서드나 분산 문법을 사용하세요.

const mySet = new Set([ 1, 2, 3 ]);
const myArray = Array.from( mySet );

myArray;
> Array(3) [ 1, 2, 3 ]

[ ...mySet ];
> Array(3) [ 1, 2, 3 ]

WeakSet

WeakSet은 객체 참조 또는 전역 기호 레지스트리에 추가되지 않은 기호와 같이 가비지 수집 가능 값만 포함하는 집합입니다.

WeakSet을 만들려면 WeakSet() 생성자를 사용합니다.

const myWeakSet = new WeakSet();

myWeakSet;
> WeakSet []

WeakSet 구문은 Set과 비슷하지만 WeakSet은 반복 가능하지 않으며, 객체나 기호 이외의 값을 추가하려고 하면 구문 오류가 발생합니다. WeakMap과 마찬가지로 WeakSet에서 참조하는 값을 가리키는 다른 references가 없으면 이 값은 가비지 컬렉션에 사용할 수 있습니다.

이렇게 하면 반복 가능한 단일 관련 객체 컬렉션을 집계하는 등의 사용 사례가 가능합니다. WeakSet에서 참조하는 객체에 다른 참조가 없으면 연결된 요소도 WeakSet에서 삭제됩니다.

이해도 테스트

다음 사항이 주어졌을 때:

        const myMap = new Map([ [ "myKey", "My string" ] ]);
        myMap.set( "myKey", 100 );
      

myMap는 무엇을 반환하나요?

100
"My string"
undefined