Symbol
- 심벌 값은 다른 값과 중복되지 않는 유일무이한 값.
- 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용.
- 프로퍼티 키로 사용할 수 있는 값은 빈 문자열을 포함하는 모든 문자열 또는 심벌 값이다.
Symbol 함수에는 선택적으로 문자열을 인수로 전달할 수 있다. 이 문자열은 생성된 심벌 값에 대한 설명으로 디버깅 용도로만 사용되며, 심벌 값 생성에 어떠한 영향도 주지 않는다.
Symbol.for 메서드는 인수로 전달받은 문자열을 키로 사용하여 키와 심벌 값의 쌍들이 저장되어 있는 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌 값을 검색한다.
- 검색에 성공하면 새로운 심벌 값을 생성하지 않고 검색된 심벌 값을 반환한다.
- 검색에 실패하면 새로운 심벌 값을 생성하여 Symbol.for 메서드의 인수로 전달된 키로 전역 심벌 레지스트리에 저장한 후, 생성된 심벌 값을 반환한다.
Symbol.for 메서드를 사용하면 애플리케이션 전역에서 중복되지 않는 유일무이한 상수인 심벌 값을 단 하나만 생성하여 전역 심벌 레지스트리를 통해 공유할 수 있다.
Symbol.keyFor 메서드를 사용하면 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출할 수 있다.
심벌과 프로퍼티 키
심벌 값으로 프로퍼티 키를 동적 생성하여 프로퍼티를 만들려면 프로퍼티 키로 사용할 심벌 값에 대괄호를 사용해야 한다. 심벌 값은 유일무이한 값이므로 심벌 값으로 프로퍼티 키를 만들면 다른 프로퍼티 키와 절대 충돌하지 않는다.
심벌과 프로퍼티 은닉
심벌 값을 프로퍼티 키로 사용하여 생성한 프로퍼티는 for…in 문 , Object.keys, Object.getOwnPropertyNames 메서드 등으로 찾을 수 없다. 이처럼 심벌 값을 프로퍼티 키로 사용하여 프로퍼티를 생성하면 외부에 노출할 필요가 없는 프로퍼티를 은닉할 수 있다.
Object.getOwnPropertySymbols 메서드는 인수로 전달한 객체의 심벌 프로퍼티 키를 배열로 반환한다.
Object.getOwnPropertySymbols 메서드로 심벌 값도 찾을 수 있다.
Well-known Symbol
자바스크립트가 기본 제공하는 빌트인 심벌 값.
순회 가능한 빌트인 이터러블은 Well-known Symbol인 Symbol.iterator를 키로 갖는 메서드를 가지며, Symbol.iterator메서드를 호출하면 이터레이터를 반환하도록 규정되어 있다.
빌트인 이터러블이 아닌 일반 객체를 이터러블처럼 동작하도록 구현하고 싶다면 이터레이션 프로토콜을 따르면 된다. ECMAScript 사양에 규정되어 있는 대로 Well-known Symbol 인 Symbol.iterator 를 키로 갖는 메서드를 객체에 추가하고 이터레이터를 반환하도록 구현하면 그 객체는 이터러블이 된다.
심벌은 중복되지 않는 상수 값을 생성하는 것은 물론 하위 호환성(기존에 작성된 코드에 영향을 주지 않고 새로운 프로퍼티를 추가하기 위해)을 보장하기 위해 도입되었다.
이터러블
이터레이션 프로토콜은 순회 가능한 데이터 컬렉션(자료 구조)를 만들기 위해 미리 약속한 규칙이다.
이터레이션 프로토콜에는 이터러블 프로토콜과 이터레이터 프로토콜이 있다.
- 이터러블 프로토콜 : Well-known Symbol인
Symbol.iterator를 프로퍼티 키로 사용한 메서드를 직접 구현하거나 프로토타입 체인을 통해 상속받은Symbol.iterator메서드를 호출하면 이터레이터 프로토콜을 준수한 이터레이터를 반환한다. 이러한 규약을 이터러블 프로토콜이라 하며, 이터러블 프로토콜을 준수한 객체를 이터러블이라 한다. 이터러블은for … of문으로 순회할 수 있으며 스프레드 문법과 배열 디스트럭처링 할당의 대상으로 사용할 수 있다. - 이터레이터 프로토콜 : 이터러블의
Symbol.iterator메서드를 호출하면 이터레이터 프로토콜을 준수한 이터레이터를 반환한다. 이터레이터는 next 메서드를 소유하며 next 메서드를 호출하면 이터러블을 순회하며 value와 done 프로퍼티를 갖는 이터레이터 리절트 객체를 반환한다. 이터레이터는 이터러블의 요소를 탐색하기 위한 포인터 역할을 한다. - 이터러블 : 이터러블 프로토콜을 준수한 객체. 일반 객체는
for…of문으로 순회할 수 없으며 스프레드 문법과 배열 디스트럭처링 할당의 대상으로 사용할 수 없다. - 이터레이터 : 이터러블의
Stymbol.iterator메서드를 호출하면 반환된다. 이터러블의 Symbol.iterator 메서드가 반환한 이터레이터는 next 메서드를 갖는다. next 메서드를 호출하면 이터러블을 순차적으로 한 단계씩 순회하며 순회 결과를 나타내는 이터레이터 리절트 객체를 반환한다. 이터레이터 리절트 객체의 value 프로퍼티는 현재 순회 중인 이터러블의 값을 나타내며 done 프로퍼티는 이터러블의 순회 완료 여부를 나타낸다.
빌트인 이터러블 Array, String, Map, Set, TypedArray, arguments, DOM 컬렉션(노드 리스트, HTMLCollection)
for…of 문 : 이터러블을 순회하면서 이터러블의 요소를 변수에 할당한다. 이때 프로퍼티 키가 심벌인 프로퍼티는 열거하지 않는다. 내부적으로 이터레이터의 next 메서드를 호출.
for ( 변수 선언문 of 이터러블) {}
for ( 변수 선언문 in 객체) {}
이터러블과 유사 배열 객체
유사배열 객체 : 마치 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고 length 프로퍼티를 갖는 객체를 말한다. length 프로퍼티를 갖기 때문에 for 문으로 순회할 수 있고, 인덱스를 나타내는 숫자 형식의 문자열을 프로퍼티 키로 가지므로 마치 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있다.
유사배열 객체는 이터러블이 아닌 일반 객체로 for…of 문으로 순회할 수 없다. (Array.from은 유사 배열 객체 또는 이터러블을 배열로 반환한다.)
이터레이션 프로토콜의 필요성
- 이터러블은 for…of 문, 스프레드 문법, 배열 디스트럭처링 할당과 같은 데이터 소비자에 의해 사용되므로 데이터 공급자의 역할을 한다고 할 수 있다.
- 다양한 데이터 공급자가 이터레이션 프로토콜을 준수하도록 규정하면 데이터 소비자는 이터레이션 프로토콜만 지원하도록 구현하면 된다.
- 이터레이션 프로토콜은 다양한 데이터 공급자가 하나의 순회 방식을 갖도록 규정하여 데이터 소비자가 효율적으로 다양한 데이터 공급자를 사용할 수 있도록 데이터 소비자와 데이터 공급자를 연결하는 인터페이스의 역할을 한다.
'Frontend > JavaScript' 카테고리의 다른 글
| 24. Set 과 Map (2) | 2023.12.22 |
|---|---|
| 23. 스프레드 문법과 디스트럭처링 (0) | 2023.12.22 |
| 21. String 문자열 (0) | 2023.12.22 |
| 20. Number, Math, Date, RegExp (1) | 2023.12.21 |
| 19. 배열 (1) | 2023.12.21 |