개념
Weak Reference(약한 참조)는 프로그래밍에서 객체를 참조하되, 가비지 컬렉터(Garbage Collector)에 의해 수거되는 것을 방해하지 않는 참조입니다. 이는 일반적인 참조(strong reference)와는 다르게 동작하며, 주로 메모리 관리와 관련된 특정한 상황에서 유용합니다.
특징
1. 가비지 컬렉션과의 관계
약한 참조는 객체가 강한 참조에 의해 더 이상 참조되지 않는 경우, 가비지 컬렉터에 의해 객체가 메모리에서 수거될 수 있도록 허용합니다.
2. 사용 사례
캐시(Cache): 메모리 효율성을 위해, 자주 사용되지 않는 데이터를 약한 참조로 보관해 필요 시 재생성하거나 불러오는 구조.
리스너 관리: 이벤트 리스너 같은 곳에서 메모리 누수를 방지하기 위해 사용.
순환 참조 문제 해결: 약한 참조를 사용하여 객체 간의 순환 참조(circular reference)를 방지.
3. 데이터 접근
약한 참조를 통해 참조된 객체가 가비지 컬렉션에 의해 제거되면, 약한 참조는 더 이상 유효하지 않습니다. 이 경우 약한 참조를 통해 객체에 접근하려 하면, null이나 그에 상응하는 값이 반환됩니다.
예제 코드
ECMAScript 2021에서 추가된 WeakRef 클래스를 사용하여 구현할 수 있습니다. 약한 참조를 활용하려면 해당 객체를 참조하는 WeakRef 인스턴스를 만들고 필요할 때 deref() 메서드를 통해 약한 참조된 객체를 가져올 수 있습니다.
class Example {
message: string;
constructor(message: string) {
this.message = message;
}
}
function weakRefExample() {
// 강한 참조 생성
let strongRef = new Example("Hello, WeakRef!");
// 약한 참조 생성
const weakRef = new WeakRef(strongRef);
console.log("Before GC:", weakRef.deref()?.message); // "Hello, WeakRef!"
// 강한 참조 제거
strongRef = null as any;
// 가비지 컬렉션 요청
// JavaScript/TypeScript는 가비지 컬렉션을 명시적으로 호출할 수 없으므로,
// 엔진이 메모리를 수거할 때까지 기다려야 합니다.
setInterval(() => {
console.log("After GC:", weakRef.deref()?.message || "Object has been garbage collected");
}, 1000);
}
weakRefExample();
'IT > typescript' 카테고리의 다른 글
[typescript] AtLeastOneRequired (0) | 2024.12.16 |
---|---|
[typescript] -? 의미 (0) | 2024.12.05 |
[typescript] fattenObject 함수 type 만들기 (0) | 2024.08.21 |
[typescript] infer (0) | 2024.08.14 |
[typescript] 함수타입(Function Type) 인자형 (0) | 2024.08.14 |