1. 소개|for…in 문이 해결할 수 있는 문제는 무엇인가요?
JavaScript는 웹 개발에서 가장 널리 사용되는 프로그래밍 언어 중 하나입니다. 다양한 기능 중에서도 반복은 데이터를 반복적으로 처리하는 데 필수적입니다.
특히 for…in 문은 객체의 프로퍼티를 순회할 때 유용합니다.
이 글의 목적
이 글에서는 다음 항목들을 자세히 다룹니다:
- JavaScript for…in 루프의 기본 문법 및 사용법
- 배열에 사용할 때 주의해야 할 점
- 다른 반복문( for…of 와 forEach )과의 차이점
- 흔히 발생하는 오류와 해결 방법
배울 내용
- 객체 프로퍼티와 배열 요소를 효율적으로 처리하는 방법
- for…in 문을 안전하게 사용하는 주의사항
- 실용적인 코드 예시와 성능 비교
이 글은 초급 및 중급 JavaScript 개발자 모두에게 유용한 지식을 제공하도록 구성되었습니다.
다음 섹션에서 for…in 문의 기본부터 살펴보겠습니다.
2. JavaScript for…in 문이란?【기본 설명】
JavaScript에서 for…in 문은 객체의 프로퍼티를 순회하는 데 사용됩니다. 이 문법은 객체에 특화되어 있어 각 프로퍼티 이름(키)을 하나씩 처리할 수 있습니다.
기본 문법
for…in 루프의 기본 문법은 다음과 같습니다:
for (variable in object) {
// Repeated processing
}
매개변수 설명:
- variable : 현재 프로퍼티 이름(키)을 저장합니다.
- object : 순회하려는 대상 객체입니다.
사용 예시: 객체 프로퍼티 열거
const person = {
name: "Taro",
age: 25,
city: "Tokyo"
};
for (const key in person) {
console.log(`${key}: ${person[key]}`);
}
출력:
name: Taro
age: 25
city: Tokyo
주의사항: 열거된 프로퍼티의 순서
for…in 루프에서 프로퍼티 순서는 보장되지 않습니다. JavaScript 사양에 따르면, 키가 문자열일 경우 삽입 순서와 일치하지 않을 수 있습니다. 엄격한 순서가 필요하다면 Object.keys()와 같은 대안을 사용하세요.
기능 요약
- 객체 키를 손쉽게 가져올 수 있음 : 동적으로 프로퍼티 이름에 접근할 때 유용합니다.
- 열거 가능한 프로퍼티만 대상 :
enumerable: false로 설정된 비열거 프로퍼티는 제외됩니다. - 프로토타입에서 상속된 프로퍼티도 열거됨 : 이는 문제를 일으킬 수 있으며, 다음 섹션에서 자세히 설명합니다.

3. 배열과 for…in 문|주의해야 할 핵심 포인트
JavaScript for…in 문은 객체 프로퍼티를 열거하도록 설계되었지만, 배열에도 사용할 수 있습니다. 다만 배열에 적용할 때는 몇 가지 주의점이 존재합니다. 아래에서 동작 방식과 함정들을 자세히 살펴보겠습니다.
배열에 대한 기본 동작
다음 예제를 살펴보세요:
const fruits = ["Apple", "Banana", "Orange"];
for (const index in fruits) {
console.log(index, fruits[index]);
}
출력:
0 Apple
1 Banana
2 Orange
주의 1: 프로토타입 프로퍼티가 열거될 수 있음
Array.prototype.newMethod = function () {
return "New Method";
};
for (const index in fruits) {
console.log(index, fruits[index]);
}
출력:
0 Apple
1 Banana
2 Orange
newMethod undefined
해결 방법:
for (const index in fruits) {
if (fruits.hasOwnProperty(index)) {
console.log(index, fruits[index]);
}
}
주의 2: 순서가 보장되지 않음
const data = [];
data[10] = "Apple";
data[1] = "Banana";
data[5] = "Orange";
for (const index in data) {
console.log(index, data[index]);
}
출력:
1 Banana
5 Orange
10 Apple
주의 3: 인덱스가 문자열로 처리됨
const numbers = [10, 20, 30];
for (const index in numbers) {
console.log(typeof index); // "string"
}
해결 방법:
for (const index in numbers) {
const numIndex = parseInt(index, 10);
console.log(numIndex, numbers[numIndex]);
}
요약
- for…in 문은 배열보다는 객체에 더 적합합니다.
- 순서와 숫자 인덱스 처리를 위해 for…of 또는 전통적인 for 루프를 권장합니다.

4. for…in과 for…of의 차이점【비교 표】
JavaScript에서 for…in과 for…of는 모두 루프를 위해 사용할 수 있지만, 사용 사례와 동작이 다릅니다.
구문 비교
for…in:
const obj = { a: 1, b: 2, c: 3 };
for (const key in obj) {
console.log(key); // Retrieves keys
}
for…of:
const arr = [10, 20, 30];
for (const value of arr) {
console.log(value); // Retrieves values
}
비교 표
| Aspect | for…in | for…of |
|---|---|---|
| Target | Objects and arrays | Arrays and iterable objects |
| Output | Property names (keys) | Values themselves |
| Prototype Enumeration | May include prototype properties | Does not enumerate prototype properties |
| Order Guarantee | Not guaranteed | Guaranteed |
실전 예제|배열 처리
const arr = ['a', 'b', 'c'];
// for...in
for (const index in arr) {
console.log(index); // Output: 0, 1, 2
}
// for...of
for (const value of arr) {
console.log(value); // Output: 'a', 'b', 'c'
}
요약
- for…in: 객체 키 처리에 가장 적합합니다.
- for…of: 배열과 반복 가능한 객체에 가장 적합합니다.
5. 실전 사용: for…in 문의 응용과 모범 사례
여기서는 JavaScript for…in 문의 실전 응용을 탐구하고, 실제 개발에서 유용한 모범 사례를 소개합니다.
1. 예제 1|객체 속성 필터링
const user = {
name: "Tanaka",
age: 30,
email: "tanaka@example.com",
password: "secret123"
};
const publicData = {};
for (const key in user) {
if (key !== "password") {
publicData[key] = user[key];
}
}
console.log(publicData);
출력:
{ name: 'Tanaka', age: 30, email: 'tanaka@example.com' }
2. 예제 2|중첩 객체 처리
const data = {
user: {
name: "Sato",
info: {
age: 28,
city: "Osaka"
}
}
};
function printNested(obj) {
for (const key in obj) {
if (typeof obj[key] === "object") {
printNested(obj[key]);
} else {
console.log(`${key}: ${obj[key]}`);
}
}
}
printNested(data);
출력:
name: Sato
age: 28
city: Osaka
3. 모범 사례|프로토타입 속성 제외
const obj = { a: 1, b: 2 };
Object.prototype.c = 3;
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(`${key}: ${obj[key]}`);
}
}
출력:
a: 1
b: 2
요약
- 객체 필터링과 중첩 객체 처리에 적합한 사용 사례를 소개했습니다.
- 의도하지 않은 프로토타입 상속이 열거되는 것을 방지하기 위해 hasOwnProperty()를 사용하세요.

6. for…in의 일반적인 오류와 해결책【초보자 친화적】
1. 오류 예제 1|프로토타입 속성이 열거됨
const obj = { a: 1, b: 2 };
Object.prototype.c = 3;
for (const key in obj) {
console.log(key, obj[key]);
}
출력:
a 1
b 2
c 3
해결책:
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}
2. 오류 예제 2|배열에 for…in 사용
const arr = [10, 20, 30];
Array.prototype.extra = "Additional Data";
for (const index in arr) {
console.log(index, arr[index]);
}
출력:
0 10
1 20
2 30
extra undefined
해결책:
for (const value of arr) {
console.log(value);
}
3. 오류 예제 3|undefined 값 처리
const obj = { a: 1, b: undefined, c: 3 };
for (const key in obj) {
console.log(key, obj[key]);
}
해결책:
for (const key in obj) {
const value = obj[key] ?? "Default Value";
console.log(key, value);
}
요약
- 프로토타입 속성 문제: hasOwnProperty()를 사용하세요.
- 배열 처리: for…in 대신 for…of 또는 forEach를 선호하세요.
- undefined 값: nullish 병합 연산자 (
??)를 사용하여 기본값을 할당하세요.
7. 성능 테스트와 for…in의 대안
1. 성능 비교
for…in 문:
const obj = { a: 1, b: 2, c: 3 };
console.time("for...in");
for (const key in obj) {
console.log(key, obj[key]);
}
console.timeEnd("for...in");
Object.keys():
console.time("Object.keys");
Object.keys(obj).forEach(key => {
console.log(key, obj[key]);
});
console.timeEnd("Object.keys");
2. 예시 비교 결과
for...in: 0.015ms
Object.keys: 0.005ms
3. 권장 대안
- Object Handling: 더 나은 성능과 안전성을 위해
Object.keys()를 사용하세요. - Array Handling: 더 빠르고 신뢰할 수 있는 반복을 위해 for…of 또는 forEach를 사용하세요.
요약
- for…in 구문은 편리하지만, 성능과 안전성을 고려하여 가장 적합한 반복 구문을 선택하세요.

8. 결론|for…in 구문 이해 및 다음 단계
1. 주요 요점
- for…in의 기본 구문 및 사용법:
- 객체의 속성 이름을 반복하는 데 사용됩니다.
- 배열이 아닌 객체 키에 특화되어 있습니다.
- 배열에 사용할 때 주의사항:
- 순서가 보장되지 않으며, 프로토타입 체인의 속성이 포함될 수 있습니다.
- 배열의 경우 for…of 또는 forEach()를 대신 사용하세요.
- for…in과 for…of의 차이점:
- for…in: 속성 이름(키)을 반복합니다.
- for…of: 배열이나 반복 가능한 객체의 실제 값을 반복합니다.
- 실용적인 적용 및 모범 사례:
- 재귀를 사용해 중첩 객체를 처리합니다.
- hasOwnProperty() 로 프로토타입 상속을 제외합니다.
- Object.keys() 또는 Object.entries() 로 성능과 안전성을 향상시킵니다.
- 성능 최적화:
- Object.keys() + forEach() 는 순서 보장과 효율성을 위해 권장되며, for…in보다 안전한 대안입니다.
2. 자주 묻는 질문에 대한 답변
Q1. for…in 구문을 사용하지 말아야 할까요?
- A: 객체 속성을 열거하는 데 적합하지만, 배열이나 성능이 중요한 작업에서는 for…of 또는 Object.keys()가 더 안전하고 효율적입니다.
Q2. 프로토타입 속성은 항상 열거되나요?
- A: 예. 사양에 따라 상속된 프로토타입 속성도 포함됩니다. 이 문제를 피하려면 hasOwnProperty()를 사용하세요.
Q3. 배열과 객체에 따라 가장 좋은 반복문은 무엇인가요?
- Objects: for…in 또는 Object.keys() 사용.
- Arrays: for…of 또는 forEach() 사용.
3. 다음 단계|다음에 배울 내용
- Iterables 및 Iterable 객체:
- Map, Set, WeakMap, WeakSet 같은 데이터 구조와 이를 처리하는 반복문.
- 데이터 처리를 위한 고차 함수:
- map(), filter(), reduce() 의 실용적인 사용법.
- 고급 객체 및 배열 기법:
- 효율적인 데이터 처리를 위해 Object.values()와 Object.entries() 사용.
- 현대 JavaScript 기능:
- spread 연산자와 구조 분해 할당 같은 ES6+ 기능을 사용해 코드를 간결하게.
- Promise/Async/Await를 활용한 비동기 프로그래밍:
- 데이터 가져오기 및 동적 객체 처리와 같은 실시간 처리에 반복문을 적용합니다.
4. 최종 생각|JavaScript 반복문 마스터하기
이 기사에서는 JavaScript for…in 구문에 초점을 맞추어 기본 사용법, 고급 적용, 함정 및 대안을 다루었습니다.
가장 중요한 포인트:
- for…in은 객체 속성을 열거하는 데 이상적이지만, 배열이나 성능 중심 작업에서는 다른 접근 방식을 사용해야 합니다.
- 코드에서 오류와 예상치 못한 동작을 방지하려면 항상 모범 사례와 안전 조치를 따르세요.
다음 단계!
대체 방법과 고차 함수에 대한 이해를 심화시켜 JavaScript 실력을 한 단계 끌어올리세요.


