Skip to content

Commit a38f8ff

Browse files
committed
[심볼형] 리뷰 반영 — 코드블록 앞 빈 줄 추가 및 '숨김 프로퍼티' 단락 정리
1 parent 7b0b906 commit a38f8ff

1 file changed

Lines changed: 7 additions & 2 deletions

File tree

1-js/04-object-basics/08-symbol/article.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ alert(id); // TypeError: Cannot convert a Symbol value to a string
6262
문자열과 심볼은 근본이 다르기 때문에 우연히라도 서로의 타입으로 변환돼선 안 됩니다. 자바스크립트에선 '언어 차원의 보호장치(language guard)'를 마련해 심볼형이 다른 형으로 변환되지 않게 막아줍니다.
6363
6464
심볼을 반드시 출력해줘야 하는 상황이라면 아래와 같이 `.toString()` 메서드를 명시적으로 호출해주면 됩니다.
65+
6566
```js run
6667
let id = Symbol("id");
6768
*!*
@@ -70,6 +71,7 @@ alert(id.toString()); // Symbol(id)가 얼럿 창에 출력됨
7071
```
7172
7273
`symbol.description` 프로퍼티를 이용하면 설명만 보여주는 것도 가능합니다.
74+
7375
```js run
7476
let id = Symbol("id");
7577
*!*
@@ -101,10 +103,12 @@ alert( user[id] ); // 심볼을 키로 사용해 데이터에 접근할 수 있
101103

102104
그런데 문자열 `"id"`를 키로 사용해도 되는데 `Symbol("id")`을 사용한 이유가 무엇일까요?
103105

104-
`user`는 서드파티 코드에서 가지고 온 객체이므로 함부로 새로운 프로퍼티를 추가할 수 없습니다. 그런데 심볼은 서드파티 코드에서 접근할 수 없기 때문에, 심볼을 사용하면 서드파티 코드가 모르게 `user`에 식별자를 부여할 수 있습니다.
106+
`user` 객체는 다른 코드베이스에 속해 있으므로, 함부로 새로운 필드(프로퍼티)를 추가하는 것은 안전하지 않습니다. 해당 코드베이스에 미리 정의된 동작에 영향을 줄 수 있기 때문입니다. 하지만 심볼은 우연히 접근하는 것이 불가능합니다. 서드파티 코드는 새롭게 정의된 심볼을 알지 못하므로, `user` 객체에 심볼을 추가하는 것은 안전합니다.
105107

106108
상황 하나를 더 가정해보겠습니다. 제3의 스크립트(자바스크립트 라이브러리 등)에서 `user`를 식별해야 하는 상황이 벌어졌다고 해보죠. `user`의 원천인 서드파티 코드, 현재 작성 중인 스크립트, 제3의 스크립트가 각자 서로의 코드도 모른 채 `user`를 식별해야 하는 상황이 벌어졌습니다.
107109

110+
111+
108112
또한, 또 다른 스크립트가 자기만의 목적을 위해 `user` 안에 자체 식별자를 추가해야 하는 상황을 가정해 봅시다.
109113

110114
제3의 스크립트에선 아래와 같이 `Symbol("id")`을 이용해 전용 식별자를 만들어 사용할 수 있습니다.
@@ -280,7 +284,8 @@ alert( localSymbol.description ); // name
280284

281285
심볼의 주요 유스 케이스는 다음과 같습니다.
282286

283-
1. 객체의 '숨김' 프로퍼티 --
287+
1. 객체의 '숨김' 프로퍼티
288+
284289
외부 스크립트나 라이브러리에 '속한' 객체에 새로운 프로퍼티를 추가해 주고 싶다면 심볼을 만들고, 이를 프로퍼티 키로 사용하면 됩니다. 키가 심볼인 경우엔 `for..in`의 대상이 되지 않아서 의도치 않게 프로퍼티가 수정되는 것을 예방할 수 있습니다. 외부 스크립트나 라이브러리는 심볼 정보를 갖고 있지 않아서 프로퍼티에 직접 접근하는 것도 불가능합니다. 심볼형 키를 사용하면 프로퍼티가 우연히라도 사용되거나 덮어씌워 지는 걸 예방할 수 있습니다.
285290

286291
이런 특징을 이용하면 원하는 것을 객체 안에 '은밀하게' 숨길 수 있습니다. 외부 스크립트에선 우리가 숨긴 것을 절대 볼 수 없습니다.

0 commit comments

Comments
 (0)