LogoSEO Jing
  • All Posts
  • SEO Jing
  • okayJing
  • KD Team
  • CLAB Coreteam
  • Study

Contact Me

© 2026 SEOJing. All rights reserved.

JavaScript프론트엔드자바스크립트 퀴즈북ObjectMapSet

자바스크립트 퀴즈북 리마인드 Day 5: 참조, 복사, Map/Set의 메모리 감각

2026년 6월 27일·6분 읽기

오늘의 문제

js
const user = { name: "Jingyu", profile: { level: 1 } };
const copied = { ...user };

copied.name = "SEOJing";
copied.profile.level = 2;

const cache = new Map();
cache.set(user, "cached");

console.log(user.name

Post Q&A

오케이징에게 물어보기

자바스크립트 퀴즈북 리마인드 Day 5: 참조, 복사, Map/Set의 메모리 감각 전체를 기준으로 질문과 피드백을 받아요.답을 본 뒤에는 이 내용을 댓글로 달아서 서징에게도 물어볼 수 있어요. 작성자가 직접 볼 수 있어요!

0/500

포스트 목록

/study/javascript-quizbook
파일 5개, 폴더 0개
자바스크립트 퀴즈북 리마인드 Day 1: 숫자는 왜 가끔 믿을 수 없을까자바스크립트 퀴즈북 리마인드 Day 2: 같은 값인지 묻는 네 가지 방법자바스크립트 퀴즈북 리마인드 Day 3: + 연산자와 ToPrimitive 흐름자바스크립트 퀴즈북 리마인드 Day 4: 프로퍼티 descriptor와 freeze의 경계자바스크립트 퀴즈북 리마인드 Day 5: 참조, 복사, Map/Set의 메모리 감각

같은 섹션의 대표 이미지

5 posts · latest first
JavaScript 객체 참조와 Map, Set, WeakMap의 참조 구조를 비교한 다이어그램
Study26. 06. 27.

자바스크립트 퀴즈북 리마인드 Day 5: 참조, 복사,.

객체 참조와 얕은 복사, Object와 Map/Set의 차이, WeakMap/WeakSet이 필요한 메모리 상황을 프론트엔드 코드 리뷰 관점에서 정리합니다.

26. 06. 27.SEOJing
)
;
console.log(user.profile.level);
console.log(cache.get(copied));

정답은 Jingyu, 2, undefined입니다. 최상위 name은 새 객체에서만 바뀌었지만, profile은 원본과 복사본이 같은 내부 객체를 보고 있습니다. copied도 user와 내용은 비슷해 보여도 Map의 key로는 다른 객체입니다.

오늘은 “객체를 복사했다”를 더 잘게 읽습니다. 새 껍데기만 만든 것인지, 내부 객체까지 새로 만든 것인지, 컬렉션이 어떤 참조를 붙잡고 있는지까지 봐야 프론트엔드 버그가 보입니다.

참조와 컬렉션을 한 장으로 보기

객체 참조와 Map, Set, WeakMap의 참조 구조

객체 대입은 값을 하나 더 만드는 게 아니라 같은 객체를 가리키는 이름을 하나 더 만드는 일에 가깝습니다.

js
const a = { count: 1 };
const b = a;
b.count = 2;

console.log(a.count); // 2

spread도 안심하면 안 됩니다. { ...obj }, Object.assign, 배열 spread는 보통 얕은 복사입니다.

js
const original = { settings: { theme: "dark" } };
const next = { ...original };
next.settings.theme = "light";

console.log(original.settings.theme); // "light"

리뷰 질문은 이렇습니다.

질문확인할 것자주 생기는 버그
같은 객체인가?a === b한쪽 수정이 다른 UI 상태까지 바꿈
얕은 복사인가?nested object 공유 여부spread 후 내부 필드 수정이 원본에 반영됨
컬렉션이 붙잡는가?Map/Set의 강한 참조캐시가 객체를 계속 잡아 메모리 누수

Object, Map, Set을 구분해서 쓰기

일반 객체를 key-value 저장소처럼 쓸 수는 있지만, key는 기본적으로 문자열 또는 Symbol 중심입니다.

js
const a = { id: 1 };
const b = { id: 2 };
const store = {};

store[a] = "A";
store[b] = "B";

console.log(store); // { "[object Object]": "B" }

객체 자체를 key로 구분해야 하면 Map이 더 솔직합니다.

js
const store = new Map();
store.set(a, "A");
store.set(b, "B");

Set은 “중복 없는 배열”보다 “존재 여부 모델”로 읽는 편이 좋습니다. 다만 객체를 넣을 때는 내용 비교가 아니라 참조 비교입니다.

js
new Set([{ id: 1 }, { id: 1 }]).size; // 2

id 기준 중복 제거가 목적이면 객체를 그대로 Set에 넣는 게 아니라 id를 key로 삼아야 합니다.

WeakMap은 캐시의 수명 문제를 드러낸다

Map과 Set은 객체를 강하게 참조합니다. 로컬 변수에서 놓아도 컬렉션이 key나 value로 붙잡고 있으면 객체가 바로 사라졌다고 말할 수 없습니다.

js
const metadata = new WeakMap();

function attachMetadata(element, data) {
  metadata.set(element, data);
}

DOM element나 임시 객체별 metadata처럼 “객체가 사라지면 부가 정보도 사라져야 하는” 경우에는 WeakMap이 후보입니다. 대신 key를 순회할 수 없습니다. 순회가 필요하면 WeakMap이 아니라 명시적인 cleanup 설계를 먼저 봐야 합니다.

코드 리뷰 체크포인트

  • 상태 업데이트가 얕은 복사에 기대고 있지 않은가?
  • Object를 임의 key 컬렉션처럼 쓰고 있지 않은가?
  • Set으로 객체 구조 중복 제거를 기대하고 있지 않은가?
  • 캐시가 객체나 DOM node를 계속 붙잡고 있지 않은가?
  • WeakMap을 쓰면서 key 목록 순회를 요구하고 있지 않은가?

참고문헌

  • 프런트엔드 레벨을 높이는 자바스크립트 퀴즈북, 객체/컬렉션 관련 장
  • 진규 Notion export: [0225] 객체 마무리, 2 객체 질문 정리
  • MDN Web Docs: Map, Set, WeakMap, WeakSet
Quiz1 / 4
Q.다음 코드의 출력으로 맞는 것은 무엇일까요?
js
const a = { nested: { n: 1 } };
const b = { ...a };
b.nested.n = 2;
console.log(a.nested.n);
JavaScript 프로퍼티 descriptor가 data descriptor와 accessor descriptor로 갈라지는 구조 다이어그램
Study26. 06. 26.

자바스크립트 퀴즈북 리마인드 Day 4: 프로퍼티.

객체 프로퍼티를 key/value가 아니라 descriptor로 읽는 법, getter/setter와 defineProperty, preventExtensions/seal/freeze의 경계를 코드 리뷰 관점에서 정리합니다.

26. 06. 26.SEOJing
객체가 ToPrimitive를 거쳐 + 연산자의 문자열 연결 또는 숫자 덧셈으로 갈라지는 흐름 다이어그램
Study26. 06. 25.

자바스크립트 퀴즈북 리마인드 Day 3: + 연산자와.

객체가 원시값으로 바뀌는 ToPrimitive 흐름, + 연산자의 문자열 연결과 숫자 덧셈 분기, Symbol.toPrimitive가 코드 리뷰에서 왜 중요한지 정리합니다.

26. 06. 25.SEOJing
==, ===, Object.is, SameValueZero의 차이를 정리한 JavaScript equality 다이어그램
Study26. 06. 24.

자바스크립트 퀴즈북 리마인드 Day 2: 같은 값인지 묻는 네.

==, ===, Object.is, SameValueZero가 각각 어떤 비교 알고리즘을 쓰는지 정리하고, includes와 indexOf, Map/Set 키 비교에서 생기는 프론트엔드 리뷰 포인트를 잡습니다.

26. 06. 24.SEOJing
JavaScript Number, safe integer, NaN, -0, BigInt를 한 장으로 정리한 다이어그램
Study26. 06. 23.

자바스크립트 퀴즈북 리마인드 Day 1: 숫자는 왜 가끔 믿을.

자바스크립트의 Number가 왜 정수처럼 보여도 부동소수점 모델 위에서 움직이는지, NaN과 -0, safe integer, BigInt를 프론트엔드 코드 리뷰 관점에서 다시 정리합니다.

26. 06. 23.SEOJing