You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/05-data-types/08-weakmap-weakset/01-recipients-read/solution.md
-4Lines changed: 0 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -25,11 +25,7 @@ messages.shift();
25
25
// 이제 readMessages에는 요소가 하나만 남게 되었습니다(실제 메모리에서 사라지는 건 나중이 되겠지만 말이죠).
26
26
```
27
27
28
-
<<<<<<< HEAD
29
28
`위크셋`을 사용하면 메시지를 저장하고 위크셋 내에 메시지가 있는지 여부를 쉽게 확인할 수 있습니다.
30
-
=======
31
-
The `WeakSet` allows to store a set of messages and easily check for the existence of a message in it.
32
-
>>>>>>> upstream/master
33
29
34
30
위크셋은 자동으로 자신을 청소한다는 장점이 있습니다. 다만 이 장점 때문에 반복 작업이 불가능해서 읽음 상태의 메시지를 '한꺼번에' 가지고 오지 못한다는 단점도 생깁니다. 배열에 저장된 모든 메시지를 대상으로 반복 작업을 수행해 해당 메시지가 위크셋에 저장되어 있는지 확인하면 읽음 상태의 메시지를 '한 번에' 얻어올 수 있습니다.
Copy file name to clipboardExpand all lines: 1-js/05-data-types/08-weakmap-weakset/article.md
+11-82Lines changed: 11 additions & 82 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,18 +1,8 @@
1
-
<<<<<<< HEAD
2
1
# 위크맵과 위크셋
3
2
4
3
<info:garbage-collection>에서 배웠듯이 자바스크립트 엔진은 도달 가능한 (그리고 추후 사용될 가능성이 있는) 값을 메모리에 유지합니다.
5
4
6
5
예시:
7
-
=======
8
-
9
-
# WeakMap and WeakSet
10
-
11
-
As we know from the chapter <info:garbage-collection>, JavaScript engine keeps a value in memory while it is "reachable" and can potentially be used.
12
-
13
-
For instance:
14
-
15
-
>>>>>>> upstream/master
16
6
```js
17
7
let john = { name:"John" };
18
8
@@ -40,14 +30,9 @@ let array = [ john ];
40
30
john =null; // 참조를 null로 덮어씀
41
31
42
32
*!*
43
-
<<<<<<<HEAD
44
-
//john을 나타내는 객체는 배열의 요소이기 때문에 가비지 컬렉터의 대상이 되지 않습니다.
33
+
// john이 참조하는 객체가 배열 안에 저장되었습니다.
34
+
//그렇기 때문에 가비지 컬렉터의 대상이 되지 않습니다.
45
35
// array[0]을 이용하면 해당 객체를 얻는 것도 가능합니다.
46
-
=======
47
-
// the object previously referenced by john is stored inside the array
48
-
// therefore it won't be garbage-collected
49
-
// we can get it as array[0]
50
-
>>>>>>> upstream/master
51
36
*/!*
52
37
alert(JSON.stringify(array[0]));
53
38
```
@@ -75,21 +60,13 @@ for(let obj of map.keys()){
75
60
alert(map.size);
76
61
```
77
62
78
-
<<<<<<< HEAD
79
-
이런 관점에서 `위크맵(WeakMap)`은 일반 `맵`과 전혀 다른 양상을 보입니다. 위크맵을 사용하면 키로 쓰인 객체가 가비지 컬렉션의 대상이 됩니다.
80
-
=======
81
-
[`WeakMap`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap) is fundamentally different in this aspect. It doesn't prevent garbage-collection of key objects.
82
-
>>>>>>> upstream/master
63
+
이런 관점에서 [`위크맵(WeakMap)`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)은 일반 `맵`과 전혀 다른 양상을 보입니다. 위크맵을 사용하면 키로 쓰인 객체가 가비지 컬렉션의 대상이 됩니다.
83
64
84
65
예시를 이용해 이에 대해 자세히 알아보도록 합시다.
85
66
86
67
## 위크맵
87
68
88
-
<<<<<<< HEAD
89
-
`맵`과 `위크맵`의 첫 번째 차이는 `위크맵`의 키가 반드시 객체여야 한다는 점입니다. 원시값은 위크맵의 키가 될 수 없습니다.
90
-
=======
91
-
The first difference between [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) and [`WeakMap`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap) is that keys must be objects, not primitive values:
92
-
>>>>>>> upstream/master
69
+
[`맵`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)과 [`위크맵`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)의 첫 번째 차이는 `위크맵`의 키가 반드시 객체여야 한다는 점입니다. 원시값은 위크맵의 키가 될 수 없습니다.
93
70
94
71
```js run
95
72
let weakMap =newWeakMap();
@@ -130,15 +107,9 @@ john = null; // 참조를 덮어씀
130
107
131
108
왜 이렇게 적은 메서드만 제공할까요? 원인은 가비지 컬렉션의 동작 방식 때문입니다. 위 예시의 `john`을 나타내는 객체처럼, 객체는 모든 참조를 잃게 되면 자동으로 가비지 컬렉션의 대상이 됩니다. 그런데 가비지 컬렉션의 *동작 시점*은 정확히 알 수 없습니다.
132
109
133
-
<<<<<<< HEAD
134
110
가비지 컬렉션이 일어나는 시점은 자바스크립트 엔진이 결정합니다. 객체는 모든 참조를 잃었을 때, 그 즉시 메모리에서 삭제될 수도 있고, 다른 삭제 작업이 있을 때까지 대기하다가 함께 삭제될 수도 있습니다. 현재 `위크맵`에 요소가 몇 개 있는지 정확히 파악하는 것 자체가 불가능한 것이죠. 가비지 컬렉터가 한 번에 메모리를 청소할 수도 있고, 부분 부분 메모리를 청소할 수도 있으므로 위크맵의 요소(키/값) 전체를 대상으로 무언가를 하는 메서드는 동작 자체가 불가능합니다.
135
111
136
112
그럼 위크맵을 어떤 경우에 사용할 수 있을까요?
137
-
=======
138
-
The JavaScript engine decides that. It may choose to perform the memory cleanup immediately or to wait and do the cleaning later when more deletions happen. So, technically, the current element count of a `WeakMap` is not known. The engine may have cleaned it up or not, or did it partially. For that reason, methods that access all keys/values are not supported.
139
-
140
-
Now, where do we need such a data structure?
141
-
>>>>>>> upstream/master
142
113
143
114
## 유스 케이스: 추가 데이터
144
115
@@ -182,11 +153,7 @@ countUser(john); // John의 방문 횟수를 증가시킵니다.
182
153
john =null;
183
154
```
184
155
185
-
<<<<<<< HEAD
186
156
이제 `john`을 나타내는 객체는 가비지 컬렉션의 대상이 되어야 하는데, `visitsCountMap`의 키로 사용되고 있어서 메모리에서 삭제되지 않습니다.
187
-
=======
188
-
Now, `john` object should be garbage collected, but remains in memory, as it's a key in `visitsCountMap`.
189
-
>>>>>>> upstream/master
190
157
191
158
특정 사용자를 나타내는 객체가 메모리에서 사라지면 해당 객체에 대한 정보(방문 횟수)도 우리가 손수 지워줘야 하는 상황입니다. 이렇게 하지 않으면 `visitsCountMap`가 차지하는 메모리 공간이 한없이 커질 겁니다. 애플리케이션 구조가 복잡할 땐, 이렇게 쓸모 없는 데이터를 수동으로 비워주는 게 꽤 골치 아픕니다.
192
159
@@ -203,23 +170,13 @@ function countUser(user) {
203
170
}
204
171
```
205
172
206
-
<<<<<<< HEAD
207
173
`위크맵`을 사용해 사용자 방문 횟수를 저장하면 `visitsCountMap`을 수동으로 청소해줄 필요가 없습니다. `john`을 나타내는 객체가 도달 가능하지 않은 상태가 되면 자동으로 메모리에서 삭제되기 때문입니다. `위크맵`의 키(`john`)에 대응하는 값(john의 방문 횟수)도 자동으로 가비지 컬렉션의 대상이 됩니다.
208
-
=======
209
-
Now we don't have to clean `visitsCountMap`. After `john` object becomes unreachable, by all means except as a key of `WeakMap`, it gets removed from memory, along with the information by that key from `WeakMap`.
210
-
>>>>>>> upstream/master
211
174
212
175
## 유스 케이스: 캐싱
213
176
214
-
<<<<<<< HEAD
215
177
위크맵은 캐싱(caching)이 필요할 때 유용합니다. 캐싱은 시간이 오래 걸리는 작업의 결과를 저장해서 연산 시간과 비용을 절약해주는 기법입니다. 동일한 함수를 여러 번 호출해야 할 때, 최초 호출 시 반환된 값을 어딘가에 저장해 놓았다가 그다음엔 함수를 호출하는 대신 저장된 값을 사용하는 게 캐싱의 실례입니다.
216
178
217
179
아래 예시는 함수 연산 결과를 `맵`에 저장하고 있습니다.
218
-
=======
219
-
Another common example is caching. We can store ("cache") results from a function, so that future calls on the same object can reuse it.
220
-
221
-
To achieve that, we can use `Map` (not optimal scenario):
222
-
>>>>>>> upstream/master
223
180
224
181
```js run
225
182
// 📁 cache.js
@@ -257,11 +214,7 @@ alert(cache.size); // 1 (엇! 그런데 객체가 여전히 cache에 남아있
257
214
258
215
`process(obj)`를 여러 번 호출하면 최초 호출할 때만 연산이 수행되고, 그 이후엔 연산 결과를 `cache`에서 가져옵니다. 그런데 `맵`을 사용하고 있어서 객체가 필요 없어져도 `cache`를 수동으로 청소해 줘야 합니다.
259
216
260
-
<<<<<<< HEAD
261
217
`맵`을 `위크맵`으로 교체하면 이런 문제를 예방할 수 있습니다. 객체가 메모리에서 삭제되면, 캐시에 저장된 결과(함수 연산 결과) 역시 메모리에서 자동으로 삭제되기 때문입니다.
262
-
=======
263
-
If we replace `Map` with `WeakMap`, then this problem disappears. The cached result will be removed from memory automatically after the object gets garbage collected.
264
-
>>>>>>> upstream/master
265
218
266
219
```js run
267
220
// 📁 cache.js
@@ -297,23 +250,13 @@ obj = null;
297
250
298
251
## 위크셋
299
252
300
-
<<<<<<< HEAD
301
-
이제 `위크셋(WeakSet)`에 대해 알아봅시다.
253
+
이제 [`위크셋(WeakSet)`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet)에 대해 알아봅시다.
302
254
303
255
-`위크셋`은 `셋`과 유사한데, 객체만 저장할 수 있다는 점이 다릅니다. 원시값은 저장할 수 없습니다.
304
256
- 셋 안의 객체는 도달 가능할 때만 메모리에서 유지됩니다.
305
-
-`셋`과 마찬가지로 `위크셋`이 지원하는 메서드는 단출합니다. `add`, `has`, `delete`를 사용할 수 있고, `size`, `keys()`나 반복 작업 관련 메서드는 사용할 수 없습니다.
257
+
-`셋`과 마찬가지로 `위크셋`이 지원하는 메서드는 단출합니다. [`add`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Weakset/add), [`has`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Weakset/has), [`delete`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Weakset/delete)를 사용할 수 있고, `size`, `keys()`나 반복 작업 관련 메서드는 사용할 수 없습니다.
306
258
307
259
'위크'맵과 유사하게 '위크'셋도 부차적인 데이터를 저장할 때 사용할 수 있습니다. 다만, 위크셋엔 위크맵처럼 복잡한 데이터를 저장하지 않습니다. 대신 "예"나 "아니오" 같은 간단한 답변을 얻는 용도로 사용됩니다. 물론 `위크셋`에 저장되는 값들은 객체이겠죠.
- It is analogous to `Set`, but we may only add objects to `WeakSet` (not primitives).
312
-
- An object exists in the set while it is reachable from somewhere else.
313
-
- Like `Set`, it supports [`add`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Weakset/add), [`has`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Weakset/has) and [`delete`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Weakset/delete), but not `size`, `keys()` and no iterations.
314
-
315
-
Being "weak", it also serves as additional storage. But not for arbitrary data, rather for "yes/no" facts. A membership in `WeakSet` may mean something about the object.
316
-
>>>>>>> upstream/master
317
260
318
261
예시와 함께 위크셋의 용도를 알아봅시다. 아래 코드에선 사용자의 사이트 방문 여부를 추적하는 용도로 `위크셋`을 사용하고 있습니다.
319
262
@@ -341,30 +284,16 @@ john = null;
341
284
// visitedSet에서 john을 나타내는 객체가 자동으로 삭제됩니다.
342
285
```
343
286
344
-
<<<<<<< HEAD
345
287
`위크맵`과 `위크셋`의 가장 큰 단점은 반복 작업이 불가능하다는 점입니다. 위크맵이나 위크셋에 저장된 자료를 한 번에 얻는 게 불가능하죠. 이런 단점은 불편함을 초래하는 것 같아 보이지만, `위크맵`과 `위크셋`을 이용해 할 수 있는 주요 작업을 방해하진 않습니다. `위크맵`과 `위크셋`은 객체와 함께 '추가' 데이터를 저장하는 용도로 쓸 수 있습니다.
346
-
=======
347
-
The most notable limitation of `WeakMap` and `WeakSet` is the absence of iterations, and the inability to get all current content. That may appear inconvenient, but does not prevent `WeakMap/WeakSet` from doing their main job -- be an "additional" storage of data for objects which are stored/managed at another place.
348
-
>>>>>>> upstream/master
349
288
350
289
## 요약
351
290
352
-
<<<<<<< HEAD
353
-
`위크맵`은 `맵`과 유사한 컬렉션입니다. `위크맵`을 구성하는 요소의 키는 오직 객체만 가능합니다. 키로 사용된 객체가 메모리에서 삭제되면 이에 대응하는 값 역시 삭제됩니다.
354
-
355
-
`위크셋`은 `셋`과 유사한 컬렉션입니다. 위크셋엔 객체만 저장할 수 있습니다. 위크셋에 저장된 객체가 도달 불가능한 상태가 되면 해당 객체는 메모리에서 삭제됩니다.
356
-
357
-
두 자료구조 모두 구성 요소 전체를 대상으로 하는 메서드를 지원하지 않습니다. 구성 요소 하나를 대상으로 하는 메서드만 지원합니다.
291
+
[`위크맵(WeakMap)`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)은 `맵`과 유사한 컬렉션입니다. `위크맵`을 구성하는 요소의 키는 오직 객체만 가능합니다. 키로 사용된 객체가 메모리에서 삭제되면 이에 대응하는 값 역시 삭제됩니다.
358
292
359
-
객체엔 '주요' 자료를, `위크맵`과 `위크셋`엔 '부수적인' 자료를 저장하는 형태로 위크맵과 위크셋을 활용할 수 있습니다. 객체가 메모리에서 삭제되면, (그리고 오로지 `위크맵`과 `위크셋`의 키만 해당 객체를 참조하고 있다면) 위크맵이나 위크셋에 저장된 연관 자료들 역시 메모리에서 자동으로 삭제됩니다.
360
-
=======
361
-
[`WeakMap`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap) is `Map`-like collection that allows only objects as keys and removes them together with associated value once they become inaccessible by other means.
362
-
363
-
[`WeakSet`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet) is `Set`-like collection that stores only objects and removes them once they become inaccessible by other means.
293
+
[`위크셋(WeakSet)`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet)은 `셋`과 유사한 컬렉션입니다. 위크셋엔 객체만 저장할 수 있습니다. 위크셋에 저장된 객체가 도달 불가능한 상태가 되면 해당 객체는 메모리에서 삭제됩니다.
364
294
365
-
Their main advantages are that they have weak reference to objects, so they can easily be removed by garbage collector.
295
+
`위크맵`과 `위크셋`의 가장 큰 장점은 객체에 대한 약한 참조이며, 가비지 컬렉터가 객체를 쉽게 청소할 수 있다는 점입니다.
366
296
367
-
That comes at the cost of not having support for `clear`, `size`, `keys`, `values`...
297
+
하지만 `clear`, `size`, `keys`, `values`와 같은 메서드를 지원하지 않는다는 단점이 있습니다.
368
298
369
-
`WeakMap` and `WeakSet` are used as "secondary" data structures in addition to the "primary" object storage. Once the object is removed from the primary storage, if it is only found as the key of `WeakMap` or in a `WeakSet`, it will be cleaned up automatically.
370
-
>>>>>>> upstream/master
299
+
객체엔 '주요' 자료를, `위크맵`과 `위크셋`엔 '부수적인' 자료를 저장하는 형태로 위크맵과 위크셋을 활용할 수 있습니다. 객체가 메모리에서 삭제되면, (그리고 오로지 `위크맵`과 `위크셋`의 키만 해당 객체를 참조하고 있다면) 위크맵이나 위크셋에 저장된 연관 자료들 역시 메모리에서 자동으로 삭제됩니다.
0 commit comments