logo

DowanKim

34. Object.keys, values, entries

2026년 4월 14일

자바스크립트

자바스크립트에서 객체는 모든 자료구조의 기본입니다. 하지만 일반 객체는 Map이나 Array처럼 내부적으로 반복 프로토콜이 내장되어 있지 않아, 순회를 위해서는 전역 Object 메서드의 도움을 받아야 합니다.

실무에서 데이터 변환 시 가장 빈번하게 사용되는 Object.keys, values, entries 삼총사를 노션 스타일로 정리해 드릴게요.


🏗️ 1. 객체 순회 메서드 3종

일반 객체에 사용할 수 있는 이 메서드들은 호출 방식과 반환값에서 Map 전용 메서드와 차이가 있습니다.

메서드역할반환값
Object.keys(obj)객체의 모든 **키(Key)**를 추출["name", "age"] (배열)
Object.values(obj)객체의 모든 **값(Value)**을 추출["John", 30] (배열)
Object.entries(obj)[키, 값] 쌍의 배열을 반환[["name", "John"], ["age", 30]]

💡 왜 obj.keys()가 아니라 Object.keys(obj)인가요?

이는 유연성 때문입니다. 만약 내 객체에 직접 keys()라는 메서드를 정의했다면, obj.keys() 호출 시 내 커스텀 메서드가 내장 메서드를 덮어버리게 됩니다. 이를 방지하기 위해 Object라는 전역 클래스의 정적(Static) 메서드 형태로 설계되었습니다.


🔄 2. 객체 변환의 '샌드박스' 기법

객체에는 map, filter 같은 강력한 배열 메서드가 없습니다. 하지만 아래의 3단계 워크플로우를 거치면 객체도 자유자재로 가공할 수 있습니다.

  1. 분해: Object.entries(obj)를 사용하여 객체를 배열로 바꿉니다.
  2. 가공: map이나 filter배열 메서드를 마음껏 적용합니다.
  3. 조립: Object.fromEntries(array)를 사용하여 다시 객체로 복구합니다.
let prices = { banana: 1, orange: 2, meat: 4 }; // 가격을 2배로 높인 새로운 객체 만들기 let doublePrices = Object.fromEntries( Object.entries(prices).map(([key, value]) => [key, value * 2]) );

🛡️ 3. 주의사항: 심볼(Symbol) 무시

Object.keys, values, entriesfor..in 루프와 마찬가지로 키가 심볼형인 프로퍼티를 무시합니다.

  • 만약 심볼형 키까지 모두 다뤄야 한다면 Reflect.ownKeys(obj)를 사용하는 것이 좋습니다.

🎙️ 기술 면접 대비 (Interview Questions)

Q1. Object.keysMap.prototype.keys의 가장 큰 차이점은 무엇인가요? (중급)

답변: 가장 큰 차이는 반환되는 데이터의 타입입니다. Object.keys는 조작이 즉시 가능한 **'진짜 배열'**을 반환하지만, Map.prototype.keys는 순회만 가능한 **'이터러블(Iterable) 객체'**를 반환합니다. 따라서 Map의 키들을 배열 메서드로 다루려면 Array.from()을 통해 변환하는 과정이 추가로 필요합니다.

Q2. 객체의 프로퍼티 개수를 가장 효율적으로 확인하는 방법은? (기초)

답변: **Object.keys(obj).length**를 사용합니다. Object.keys는 객체 자신의 열거 가능한 문자열 키만을 배열로 반환하므로, 해당 배열의 길이를 측정하면 프로퍼티의 개수를 바로 알 수 있습니다.


💡 기억해야 할 중요한 내용

  1. 배열 메서드의 힘을 빌리세요. 객체 순회 로직을 직접 짜기보다 Object.entries로 변환 후 forEachreduce를 쓰는 것이 훨씬 가독성이 좋고 실수를 줄여줍니다.
  2. fromEntries는 짝꿍입니다. 데이터를 가공한 뒤 다시 객체 형태로 서버에 보내거나 상태를 업데이트해야 할 때 fromEntries는 최고의 도구입니다.

이제 객체를 배열처럼 다루는 고수가 되셨네요! 특히 ADsP를 공부하셨으니 데이터 가공 로직에서 이런 전처리 과정이 얼마나 중요한지 잘 아실 겁니다.

혹시 실제 프로젝트 데이터(예: Egemoney의 사용자 설정이나 SIMVEX의 파츠 속성 등)를 다룰 때, 특정 조건의 프로퍼티만 골라내서 가공해야 하는 복잡한 케이스가 있으신가요? 상황을 주시면 최적의 reducemap 조합을 함께 고민해 드릴 수 있습니다. 다음 주제로 넘어갈까요?