얕은 동결과 깊은 동결 이해하기
얕은 동결(Shallow Freeze)과 깊은 동결(Deep Freeze)은 객체의 불변성을 보장하는 방법 중 하나다. 얕은 동결은 객체의 최상위 프로퍼티만을, 깊은 동결은 객체의 모든 중첩 프로퍼티까지 불변하게 만든다.
Object.freeze()
메서드를 사용하면 객체를 얕게 동결할 수 있다. 이는 객체의 최상위 프로퍼티만을 변경할 수 없게 만든다. 하지만 중첩된 객체는 여전히 변경 가능하다.Object.freeze()
메서드를 호출하는 함수를 작성하여 사용해야 한다.얕은 동결과 깊은 동결은 객체의 불변성을 보장해야 하는 경우에 활용된다. 예를 들어, Redux와 같은 상태 관리 라이브러리에서는 상태 객체를 불변하게 유지해야 하므로, 이러한 동결 기법이 사용된다.
Object.freeze()
를 사용해서 간단하게 얕은 동결을 할 수 있다.let obj = { a: 1, b: { c: 2 } };
Object.freeze(obj);
// 이제 'obj'는 수정할 수 없음
obj.a = 10; // 무시
obj.b.c = 20; // 중첩된 객체는 수정할 수 있음
console.log(obj.b.c); // 20
function deepFreeze(obj) {
const propNames = Object.getOwnPropertyNames(obj);
for (let name of propNames) {
let value = obj[name];
obj[name] = value && typeof value === "object" ? deepFreeze(value) : value;
}
return Object.freeze(obj);
}
let obj = { a: 1, b: { c: 2 } };
deepFreeze(obj);
// 이제 'obj'는 수정할 수 없음
obj.a = 10; // 무시
obj.b.c = 20; // 중첩된 객체도 수정할 수 없음
console.log(obj.b.c); // 2
전에 얕은 동결만 구현하고 깊은 동결은 구현 안 한채로 프로젝트를 끝냈었는데,
이번 프로젝트에선 구현해봐서 만족했음.