배열과 객체는 자바스크립트에서 데이터를 구조적으로 다루기 위한 기본 자료형입니다.
배열은 순서가 있는 데이터의 집합으로, 각 요소는 인덱스를 통해 접근할 수 있습니다.
주로 여러 개의 값을 하나의 변수로 묶어서 관리할 때 사용합니다.
배열에서 자주 쓰이는 메서드로는 요소를 추가하거나 제거하는push,pop,shift,unshift,
그리고 데이터를 가공하는map,filter,reduce등이 있습니다.반면 객체는 키와 값으로 이루어진 데이터 구조로, 각 속성 이름을 통해 데이터에 접근합니다.
객체의 주요 메서드로는Object.keys,Object.values,Object.entries같은 속성 조회 메서드와,
특정 키의 존재 여부를 확인하는hasOwnProperty가 있습니다.실제 개발에서는 배열과 객체를 함께 사용하는 경우가 많고,
배열은 데이터의 집합을, 객체는 그 구조와 의미를 표현할 때 적합합니다.
따라서 상황에 맞게 두 자료형을 구분해 활용하는 것이 중요합니다.
const fruits = ["apple", "banana", "cherry"];
console.log(fruits[0]); // applelength 속성으로 확인할 수 있음console.log(fruits.length); // 3for, forEach, map 등)요소 추가 및 제거
| 메서드 | 설명 | 예시 |
|---|---|---|
push() | 배열 끝에 요소 추가 | arr.push(4) |
pop() | 배열 끝 요소 제거 | arr.pop() |
unshift() | 배열 앞에 요소 추가 | arr.unshift(0) |
shift() | 배열 앞 요소 제거 | arr.shift() |
const arr = [1, 2, 3];
arr.push(4); // [1, 2, 3, 4]
arr.shift(); // [2, 3, 4]
arr.unshift(0); // [0, 2, 3, 4]
arr.pop(); // [0, 2, 3]
배열 순회 및 변환
| 메서드 | 설명 | 특징 |
|---|---|---|
forEach() | 각 요소를 순회하며 함수 실행 | 반환값 없음 |
map() | 각 요소를 변환해 새 배열 생성 | 원본 불변 |
filter() | 조건에 맞는 요소만 추출하여 새 배열 생성 | 원본 불변 |
reduce() | 누적 계산 수행 | 합계, 평균 등에 활용 |
const numbers = [1, 2, 3, 4, 5];
const tripled = numbers.map(num => num * 2);
console.log(tripled); // [3, 6, 9, 12, 15]
const even = numbers.filter(num => num % 2 === 0);
console.log(even); // [2, 4]
const sum = numbers.reduce((acc, cur) => acc + cur, 0); // 15
map() 메서드arr.map((element, index, array) => {
// 반환되는 값이 새로운 배열의 각 요소가 됨
});element: 현재 요소index: 현재 인덱스array: 원본 배열const numbers = [1, 2, 3, 4];
const doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6, 8]
console.log(numbers); // [1, 2, 3, 4] (원본 유지)numbers.map(num => { num * 2 }); // ❌ undefined 배열 생성됨
numbers.map(num => { return num * 2 }); // ✅
numbers.map(num => num * 2); // ✅filter() 메서드arr.filter((element, index, array) => {
return 조건식; // true면 요소 유지, false면 제거
})element: 현재 요소index: 현재 인덱스array: 원본 배열true를 반환한 요소만 새로운 배열에 포함false인 요소는 무시const numbers = [10, 20, 30, 40, 50];
const over30 = numbers.filter(num => num > 30);
console.log(over30); // [40, 50]
console.log(numbers); // [10, 20, 30, 40, 50] (원본 유지)[](빈 배열)을 반환함filter()는 조건에 따라 일부 데이터를 추출할 때 매우 자주 사용됨 (예: 재고가 0이 아닌 상품만 표시)reduce() 메서드arr.reduce((accumulator, currentValue, index, array) => {
// 새로운 누적값 반환
}, initialValue);accumulator: 누적값 (이전 순회 결과)currentValue: 현재 요소index: 현재 인덱스array: 원본 배열initialValue: 초기값 (생략 시 배열의 첫 번째 요소가 기본적으로 사용됨)initialValue가 accumulator로 들어감const numbers = [1, 2, 3, 4, 5];
const sum1 = numbers.reduce((acc, cur) => acc + cur, 0);
console.log(sum1); // 15
const sum2 = numbers.reduce((acc, cur) => acc + cur);
console.log(sum2); // 15sum1에서는 초기값이 0으로 명시되어 있으므로, acc=0, cur=1로 시작함sum2에서는 초기값이 명시되어 있지 않으므로, acc=1, cur=2로 시작함const numbers = [1, 2, 3, 4, 5];
const avg = numbers.reduce((acc, cur, _, arr) => acc + cur / arr.length, 0);
console.log(avg); // 3const fruits = ["apple", "banana", "apple", "cherry", "banana"];
const count = fruits.reduce((acc, fruit) => {
acc[fruit] = (acc[fruit] || 0) + 1;
return acc;
}, {});
console.log(count); // { apple: 2, banana: 2, cherry: 1 }reduce()는 결과값이 무엇이든 될 수 있음 (숫자, 문자열, 배열, 객체 등)initialValue를 생략하면 배열의 첫 번째 요소부터 시작하므로, 비어 있는 배열([])에 사용하면 에러가 발생할 수 있음const user = {
name: "Kim",
age: 25,
isAdmin: true,
};
console.log(user.name); // Kimuser.name; // 점 표기법
user["age"]; // 대괄호 표기법🔍 왜 객체가 상태에 적합할까?
- 의미 있는 필드 단위로 묶음:
user.name,cart.items처럼 "한 엔티티 = 한 객체"로 표현하기 쉬움- 확장 용이: 필드가 늘어나도 키를 추가하면 됨
- 참조(레퍼런스)로 비교·최적화: 새로운 객체를 만들어 교체하면 "바뀌었는지"를 한 번에 판단(얕은 비교)할 수 있음
| 메서드 | 설명 | 반환값 |
|---|---|---|
Object.keys(obj) | 객체의 모든 키를 배열로 반환 | ["name", "age", "isAdmin"] |
Object.values(obj) | 객체의 모든 값을 배열로 반환 | ["Kim", 25, true] |
Object.entries(obj) | [키, 값] 쌍의 배열을 반환 | [["name", "Kim"], ["age", 25], ["isAdmin", true]] |
hasOwnProperty(key) | 해당 키가 객체에 존재하는지 확인 | true 또는 false |
const user = { name: "Kim", age: 25 }
console.log(Object.keys(user)); // ["name", "age"]
console.log(Object.values(user)); // ["Kim", 25]
console.log(Object.entries(user)); // [["name", "Kim"], ["age", 25]]
console.log(user.hasOwnProperty("age")); // true