본문 바로가기
자바스크립트 중급 강의

심볼(Symbol) - 자바스크립트 중급 강좌 #4

2021. 10. 27.

자바스크립트 중급 강좌 #4 - 심볼(Symbol)

 

객체 프로퍼티 키에는 2가지 유형이 있다. 문자형과 심볼형.

property key: 문자형

 

property key: 심볼형

심볼은 유일한 식별자를 만들 때 사용한다.

a와 b는 생긴 것은 똑같은데, 일치 연산자와 동등 연산자를 확인해보면 false 가 나온다.

(일치 연산자(===, strict equality): 양쪽의 값과 타입이 모두 같은 경우에만 true를 반환)

(동등 연산자(==, abstract equality): 양쪽의 타입이 다르더라도 값이 같다면 true를 반환. 자바스크립트 엔진에 의해 암묵적인 타입 변환이 먼저 이루어지기 때문)

심볼은 유일성을 보장해준다. 전체 코드 중에 딱 하나라는 의미이다.

문자열을 전달해서 설명을 덧붙여줄 수도 있다. 심볼 생성에는 어떠한 영향도 미치지 않지만 디버깅에 편리하다.

설명이 같은 경우에도 마찬가지로 생긴 것은 같지만 사실은 다르다.

심볼을 프로퍼티 키로 사용해보자.

user 라는 객체 안에 잘 들어가있고, id 라는 키를 조회하는 것도 잘 된다.

 

심볼은 어디에 사용될까

하지만 객체 메소드들로 키나 값을 조회해보면 나오지 않는다. for 문에서도 나오지 않는다.

해당 객체를 다른 코드에서 사용하고 있을 때 symbol을 사용하여 객체에 메소드를 추가하면 그 코드들에 영향을 미치지 않는 것이다.

그러므로 심볼은 특정 개체에 원본 데이터는 건들이지 않고 속성을 추가하고 싶을 때 사용한다.

심볼을 사용하지 않고 마음대로 속성을 추가하는 경우, 기존의 속성과 이름이 겹쳐서 덮어씌울 수도 있고, 본인만 아는 키 이름으로 혼란을 줄 수도 있고, 앞서 말했듯 이미 그 객체를 사용하고 있는 다른 코드들에 영향을 미칠 수 있다.

내가 건들인 프로퍼티가 어디서 어떻게 문제를 일으킬지 예측할 수 없다는 문제가 생긴다.

 

Symbol.for(): 전역 심볼

symbol.keyFor() 를 통해 키의 이름을 얻을 수 있다.

 

description

전역 심볼이 아닌 경우, keyFor 를 사용할 수 없다.

대신, description을 통해 이름을 알 수 있다.

 

숨겨진 Symbol key 보는 법

사실상 심볼을 완전히 숨길 수 있는 방법은 없다.

object.getOwnPropertySymbols() 를 통해 해당 객체의 심볼만 볼 수 있다.

Reflect.ownKeys() 는 심볼을 포함한 객체의 모든 키를 보여준다.

 

심볼 사용 예시

심볼이 아니라 일반적인 메소드로 showName 을 추가하면, 기존에 있던 코드에 영향을 주고, 이 경우에는 사용자가 접속하면 보는 메세지까지 바뀌게 된다.

그러므로 해당 객체를 사용하고 있는 다른 코드들에 영향을 미치지 않도록 심볼을 사용하여 메소드를 추가하는 것이다. 또한, user 객체에 showName 이라는 이름의 다른 메소드가 이미 있었는지, 혹시나 덮어씌우지 않을지를 고민할 필요도 없어져서 유용하다.

댓글