[F-Lab 모각코 챌린지 - 52일차] - 심벌 (Symbol)

Big One·2023년 7월 1일
0

F-Lab

목록 보기
25/69

Symbol 이란?

symbol 원시값을 반환하는 내장 객체이며 고유함이 보장된다. 심볼은 클로저가 없다 ㅇㅇ

심볼은 객체에 속성을 추가할 때 고유한 키를 부여하여 다른 키와 충돌하지 않도록 할 때 사용되며, 일반적인 방법으로 접근할 수 없어서 약한 형태의 캡슐화, 접근 제어, 정보 은닉을 제공한다.

symbol 원시 값을 만들때는 Symbol.for(”key”)를 이용해 사용하는 것이 좋다.

Symbol(”key”)로 생성하게 되면 고유성을 보장하기 때문에 {} === {} // false 가 나오듯이 각자다른 심볼이 된다. 하지만 Symbol.for(”key”) 호출로 생성하게되면 주어진 key 를 가진 심볼이 전역 심볼 레지스트리에 존재하면 그 심볼을 반환한다. 없으면 새로 생성하고 , 전역 심볼 레지스트리에 등록 한 후, 반환된다.

약간 진짜 고유하고 똑같이 생긴거 없게 생성되는느낌임 Map의 key 느낌?

Symbol("foo") === Symbol("foo"); // false

심볼은 유일하게 참조 동일성(같은 심볼은 두 번 만들 수 없음)을 가지는 원시 데이터 타입이므로 객체와 비슷하게 동작하는 면이 있다. 심볼은 가비지 콜렉션 대상이며 Weaks 객체에 저장할 수 있다.

전역 심볼 레지스트리

여러 파일에 걸쳐 혹은 각자 별도의 전역 스코프를 갖는 렐름까지도 걸쳐서 사용 가능한 심볼을 생성하려면 Symbol.for() 메서드와 Symbol.keyFor() 메서드를 사용하여 심볼을 생성하고 가져올 수 있다.
전역 심볼 레지스트리는 설명을 위한 상상의 개념이라하니 참고하도록!
심볼 레지스트리는 for(), keyFor() 메서드를 제외하고는 접근할 수 없다.

Symbol.for(tokenString) 메서드는 문자열 키를 받아 레지스트리에서 심볼 값을 반환한다.

Symbol.keyFor(symbolValue) 메서드는 심볼 값을 받아 대응하는 문자열 키를 반환한다.

Symbol.keyFor(Symbol.for("tokenString")) === "tokenString"; // true

음 .. 한 마디로 Symbol.for() 하면 Symbol(key)자체가 생성되고, Symbol.keyFor()하면 Symbol 생성할때 key로 넣은 값이 나온다.

순회

심볼은 순회에 열거되지 않는다. for… in 불가. Object.getOwnPropertyNames() 도 심볼 객체 속성 반환하지 않는다. 심볼의 속성들을 찾고싶으면 Object.getOwnPropertySymbols() 를 사용한다.

잘못된 생각?

잘 알려진 심볼 에서 정적속성? 메서드? 들을 Symbol로 생성한 것들에 이용하는 것 인줄 알았는데.. 아닌 것 같다. 메서드를 새롭게 정의한다? 라는 식으로 받아들이기 시작했다. iterator 같은경우 어떤 식으로 반복을 할건지 정하는 것 같다.

이터레이션 프로토콜

이터레이션 프로토콜이란 순회 가능한 데이터 컬렉션(자료구조)을 만들기 위해 미리 약속한 규칙이다.

이터레이션 프로토콜에는 이터러블 프로토콜이터레이터 프로토콜이 있다.

이터러블 프로토콜

Symbol.iterator 를 프로퍼티 키로 사용한 메서드를 직접 구현하거나 프로토타입 체인을 통해 상속받은 Symbol.iterator 를 실행하면 이터레이터 프로토콜을 준수한 이터레이터를 반환한다. 이 규칙을 이터러블 프로토콜이라 하며 이터러블 프로토콜 규칙을 준수한 객체를 이터러블이라 한다.

이터레이터 프로토콜

이터러블의 Symbol.iterator 메서드를 호출하면 이터레이터 프로토콜을 준수한 이터레이터를 반환한다. 이터레이터는 next 메서드를 소유하며 호출하면 이터러블을 순회하며 iteratorReulst = value, done 프로퍼티를 갖는 이터러블 리절트 객체를 반환한다. 이 규약을 이터레이터 프로토콜이라하고 이터레이터 프로토콜을 준수한 객체를 이터레이터라 한다.

잘 알려진 심볼 well-known symbol

심볼 생성자의 정적속성은 모두 스스로가 심볼이다. 이 심볼들을 잘 알려진 심볼이라 부르고, 자바스크립트 내장 작업에 일종의 “프로토콜” 로서 동작한다. 이 심볼들로 언어 동작을 바꿀 수 있다.

잘 알려진 심볼에는 가비지 콜렉션 가능 여부 라는 개념 자체가 존재하지 않는다.

우리가 사용하고 있는 for…of , match 등 메서드들은 Symbol로서 동작하는 것이다. ( o? , x? )

내 생각

잘 알려진 심볼이란 음 .. 현재 순회 메서드 중 for..of 메서드는 이터러블 객체에 사용되어지는데 이 메서드는 내부적? 프로토타입? 적으로 Symbol.iterator 이라는 심볼 값을 프로퍼티? 키? 로 가지고 있다 이렇게 Symbol.iterator 심볼을 가지고 있는 객체? 를 이터러블 이라 할 수 있다. - 1차 생각

2차 생각 - for…of 로 순회할 수 있으면 이터러블이다. 이터러블은 이터러블 프로토콜 준수한거고.. 이터레이터 프로토콜도 준수한거같은데 음 .. 그럼 둘 다 ㅇㅋ

학습할 키워드

  • for, forEach, map, for..in 등 과 for ..of 차이
  • reduce
profile
이번생은 개발자

0개의 댓글