자바스크립트에서 WeakMap과 WeakSet의 차이점은 무엇인가요?
_____- WeakMap : 객체 키를 가리키는 약한 참조를 갖는 Map 자료구조입니다. 키는 반드시 객체여야 하며, 키가 가비지 컬렉션 대상이 되면 자동으로 WeakMap에서도 제거됩니다.
- WeakSet : 객체값을 가리키는 약한 참조를 갖는 Set 자료구조입니다. 값은 반드시 객체여야 하며, 값이 가비지 컬렉션 대상이 되면 WeakSet에서도 자동 제거됩니다.
---
Q2. WeakMap과 WeakSet의 공통점은 무엇인가요?
- 키나 값으로 원시타입을 허용하지 않고, 반드시 객체만 사용 가능합니다.
- 내부 참조가 약한 참조(weak reference)이기 때문에 가비지 컬렉션 대상이 되면 자동 제거되고 메모리 누수를 방지합니다.
- 이터러블(iterable)이 아니어서 for...of 루프 등으로 순회할 수 없습니다.
- size 프로퍼티가 없으며, 요소 개수를 직접 알 수 없습니다.
---
Q3. WeakMap과 WeakSet의 차이점은 무엇인가요?
| 구분 | WeakMap | WeakSet |
|-------------|-------------------------|-------------------------|
| 저장 방식 | 키(key)와 값(value) 쌍 | 값(value)만 저장 |
| 키/값 유형 | 키는 객체, 값은 임의 타입 | 값은 객체만 |
| 주요 용도 | 객체별 데이터 저장 | 객체 집합의 존재 여부 관리 |
| 접근 방법 | `get(key)`, `set(key, value)`, `has(key)` | `add(value)`, `has(value)`, `delete(value)` |
| 예시 | 특정 객체에 메타데이터 저장 | 객체들을 집합으로 관리하는 용도 |
---
Q4. WeakMap을 사용하는 이유는 무엇인가요?
- 객체를 키로 메타데이터나 부가 정보를 저장하면서, 키가 더 이상 참조되지 않으면 자동으로 메모리 해제되도록 하기 위해 사용합니다.
---
Q5. WeakSet을 사용하는 이유는 무엇인가요?
- 참조 상태를 추적하는 객체 집합을 관리하고 싶은 경우 사용합니다.
- 객체가 가비지 컬렉션 될 때 자동 제거되어 메모리 누수가 줄어듭니다.
- 예를 들어 이벤트 리스너가 특정 객체에만 추가되었는지 체크할 때 유용합니다.
---
Q6. WeakMap과 WeakSet의 주요 제한 사항은 무엇인가요?
- 원시 타입을 키나 값으로 사용할 수 없습니다.
- 이터러블 하지 않아 순회가 불가능합니다. 따라서 전체 요소를 알 수 없고, size 프로퍼티도 없습니다.
- 디버깅이나 로깅 시 내부 상태 확인이 어렵습니다.
---
Q7. 일반 Map/Set과 WeakMap/WeakSet 중 어느 것을 선택해야 하나요?
- 객체의 생명주기에 맞춰 자동으로 메모리를 해제하고 싶으면 WeakMap/WeakSet을 씁니다.
- 키/값을 순회하거나 원시값도 저장해야 할 때는 일반 Map/Set이 적합합니다.
---
요약
- WeakMap : 키는 객체, 값은 임의 타입, 즉각적 메모리 해제, 키-값 쌍 저장
- WeakSet : 값은 객체만, 집합처럼 객체 존재 여부 관리
- 둘 다 약한 참조로 메모리 누수 방지하나 이터러블 불가, 원시 타입 미지원이라는 차이 있음
그러나 이 두 데이터 구조는 몇 가지 중요한 차이점이 있으며, 그 차이점은 주로 사용 용도와 메모리 관리 방식에 있습니다.
아래에서 이 두 구조의 주요 차이점과 특징을 자세히 설명하겠습니다.
1. 기본 개념- WeakMap : - `WeakMap`은 키-값 쌍의 컬렉션입니다.
- 키는 객체만 가능하며, 값은 어떤 데이터 타입도 가능합니다.
- 키로 사용된 객체가 더 이상 참조되지 않으면, 해당 키-값 쌍은 자동으로 가비지 컬렉션에 의해 제거됩니다.
- WeakSet : - `WeakSet`은 객체의 집합입니다.
- `WeakSet`에 저장할 수 있는 값은 객체만 가능하며, 기본 데이터 타입(숫자, 문자열 등)은 저장할 수 없습니다.
- `WeakSet`에 포함된 객체가 더 이상 참조되지 않으면, 해당 객체는 자동으로 가비지 컬렉션에 의해 제거됩니다.
2. 메모리 관리`WeakMap`과 `WeakSet`의 가장 큰 특징 중 하나는 메모리 관리에 있습니다.
이들은 "약한 참조"를 사용하여, 객체가 더 이상 필요하지 않을 때 자동으로 메모리에서 해제될 수 있도록 합니다.
이는 메모리 누수를 방지하는 데 유용합니다.
- WeakMap : - 키로 사용된 객체가 다른 곳에서 참조되지 않으면, 해당 키-값 쌍은 가비지 컬렉션의 대상이 됩니다.
- 이는 메모리 사용을 최적화하고, 불필요한 데이터가 남아 있는 것을 방지합니다.
- WeakSet : - `WeakSet`에 저장된 객체가 다른 곳에서 참조되지 않으면, 해당 객체는 가비지 컬렉션의 대상이 됩니다.
- 이 또한 메모리 관리를 용이하게 하며, 불필요한 객체가 메모리에 남아 있는 것을 방지합니다.
3. 사용 용도- WeakMap : - 주로 객체에 대한 메타데이터를 저장하는 데 사용됩니다.
예를 들어, DOM 요소에 대한 추가 정보를 저장하거나, 특정 객체에 대한 상태를 관리하는 데 유용합니다.
- 객체와 관련된 정보를 저장하고, 해당 객체가 더 이상 필요하지 않을 때 자동으로 메모리에서 해제되도록 할 수 있습니다.
- WeakSet : - 주로 객체의 존재 여부를 추적하는 데 사용됩니다.
예를 들어, 특정 객체가 이미 처리되었는지 여부를 확인하는 데 유용합니다.
- 객체의 집합을 유지하고, 해당 객체가 더 이상 필요하지 않을 때 자동으로 메모리에서 해제되도록 할 수 있습니다.
4. 메서드- WeakMap : - `set(key, value)`: 키와 값을 추가합니다.
- `get(key)`: 주어진 키에 대한 값을 반환합니다.
- `has(key)`: 주어진 키가 존재하는지 여부를 확인합니다.
- `delete(key)`: 주어진 키-값 쌍을 삭제합니다.
- WeakSet : - `add(value)`: 값을 추가합니다.
- `has(value)`: 주어진 값이 존재하는지 여부를 확인합니다.
- `delete(value)`: 주어진 값을 삭제합니다.
5. 이터러블(Iterable) 여부- WeakMap 과 WeakSet 모두 이터러블이 아닙니다.
즉, `for...of` 루프나 `Array.from()`과 같은 메서드를 사용하여 직접 반복할 수 없습니다.
이는 이 두 구조가 메모리 관리와 관련된 특성을 가지고 있기 때문입니다.
이터러블이 아닌 구조는 내부적으로 객체의 상태를 관리하는 데 있어 더 안전하고 효율적입니다.
결론`WeakMap`과 `WeakSet`은 JavaScript에서 메모리 관리와 객체 참조를 효율적으로 처리하는 데 유용한 데이터 구조입니다.
`WeakMap`은 키-값 쌍으로 메타데이터를 저장하는 데 적합하며, `WeakSet`은 객체의 존재 여부를 추적하는 데 유용합니다.
이 두 구조는 약한 참조를 사용하여 메모리 누수를 방지하는 데 도움을 주며, 특히 대규모 애플리케이션에서 성능과 메모리 관리를 최적화하는 데 중요한 역할을 합니다.
작성자:
최민수 [비회원]
| 작성일자: 1년 전
2024-09-08 14:47:25
조회수: 171 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 171 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.