객체와 배열 기초
이전 장에서는 숫자, 문자열, 불리언 같은 기본 데이터 타입과 변수 저장 방식을 배웠습니다. 하지만 실제 웹 애플리케이션에서는 사용자 정보, 상품 목록, 게시글처럼 연관된 데이터를 묶어 관리해야 하는 경우가 훨씬 많습니다.
이런 복합 데이터를 효율적으로 관리하기 위해 자바스크립트는 객체(Object)와 배열(Array)을 제공합니다. 이번 장에서는 객체/배열의 생성, 데이터 추가, 접근, 조작의 기본 흐름을 정리합니다.
객체: 연관된 데이터를 묶는 컨테이너
객체와 배열 기초에서는 값의 변화, 실행 순서, 화면 반응을 함께 봅니다.
객체는 여러 개의 속성(property)을 담는 컨테이너라고 할 수 있습니다. 각 속성은 이름(key)과 값(value)의 쌍으로 이루어져 있습니다. 마치 사전에서 단어(key)와 그 의미(value)가 짝을 이루는 것과 같습니다. 객체는 특정한 것에 대한 정보를 구조화하여 표현할 때 매우 유용합니다.
객체 생성하기
가장 일반적인 객체 생성 방법은 중괄호 {}를 사용하는 객체 리터럴(Object Literal) 방식입니다.
// 사용자 정보를 담는 객체
let user = {
name: "김민준", // 'name'은 속성 이름(키), "김민준"은 속성 값
age: 28, // 'age'는 숫자 타입 값
isStudent: false, // 'isStudent'는 불리언 타입 값
email: "minjun@example.com",
"favorite-color": "blue" // 속성 이름에 하이픈이 포함되면 따옴표로 묶어야 합니다.
};
console.log(user);
/*
결과:
{
name: '김민준',
age: 28,
isStudent: false,
email: 'minjun@example.com',
'favorite-color': 'blue'
}
*/각 속성 이름(키)과 값은 콜론(:)으로 구분하며, 각 속성 쌍은 쉼표(,)로 구분합니다.
객체 속성 접근하기
객체에 저장된 속성 값에 접근하는 방법은 두 가지가 있습니다.
점 표기법 (Dot Notation): 가장 흔하게 사용되는 방법으로, 객체이름.속성_이름 형식으로 접근합니다. 속성 이름이 유효한 자바스크립트 식별자(변수 이름 규칙과 유사)일 때 사용합니다.
console.log(user.name); // 결과: 김민준
console.log(user.age); // 결과: 28
console.log(user.email); // 결과: minjun@example.com대괄호 표기법 (Bracket Notation): 객체이름['속성_이름'] 형식으로 접근합니다. 속성 이름이 변수에 저장되어 있거나, 하이픈(-)과 같이 유효하지 않은 식별자 문자를 포함할 때 사용합니다.
console.log(user['name']); // 결과: 김민준 (점 표기법과 동일한 결과)
console.log(user['favorite-color']); // 결과: blue (하이픈 때문에 대괄호 필수)
let keyName = "age";
console.log(user[keyName]); // 결과: 28 (변수를 통해 속성 이름에 접근)객체 속성 추가 및 변경하기
객체에 새로운 속성을 추가하거나 기존 속성의 값을 변경할 수 있습니다.
let product = {
name: "노트북",
price: 1200000
};
// 속성 추가
product.manufacturer = "XYZ전자"; // 새로운 manufacturer 속성 추가
product['release-date'] = "2024-05-01"; // 대괄호 표기법으로 속성 추가
console.log(product);
/*
결과:
{
name: '노트북',
price: 1200000,
manufacturer: 'XYZ전자',
'release-date': '2024-05-01'
}
*/
// 속성 값 변경
product.price = 1150000; // 기존 price 속성 값 변경
console.log(product.price); // 결과: 1150000객체 속성 삭제하기
delete 연산자를 사용하여 객체의 특정 속성을 제거할 수 있습니다.
let student = {
id: 101,
name: "박지성",
grade: 3
};
console.log(student); // { id: 101, name: '박지성', grade: 3 }
delete student.grade; // grade 속성 삭제
console.log(student); // { id: 101, name: '박지성' }
// delete student['id']; // 대괄호 표기법으로도 삭제 가능객체 내의 함수 (메서드)
객체의 속성 값으로는 일반적인 데이터뿐만 아니라 함수도 올 수 있습니다. 객체 내부에 정의된 함수를 메서드(Method)라고 부릅니다. 메서드는 해당 객체의 데이터를 조작하거나 객체와 관련된 동작을 수행할 때 사용됩니다.
let person = {
name: "이수진",
age: 22,
// sayHello라는 메서드 정의
sayHello: function() {
console.log(`안녕하세요, 제 이름은 ${this.name}입니다.`);
// this는 현재 객체(여기서는 person)를 가리킵니다.
},
// ES6에서 도입된 간결한 메서드 정의 문법
introduce() {
console.log(`저는 ${this.age}살 ${this.name}입니다.`);
}
};
person.sayHello(); // 결과: 안녕하세요, 제 이름은 이수진입니다.
person.introduce(); // 결과: 저는 22살 이수진입니다.메서드 내부에서 this 키워드를 사용하면, 해당 메서드를 호출한 객체 자신을 참조할 수 있습니다. 이는 객체 내부의 다른 속성 값에 접근할 때 매우 유용합니다.
배열: 순서가 있는 데이터 목록
배열(Array)은 여러 개의 값을 순서대로 나열하여 저장하는 특별한 형태의 객체입니다. 객체가 키-값 쌍으로 데이터를 저장하는 반면, 배열은 순서(index)를 기반으로 데이터를 관리합니다. 같은 종류의 데이터를 여러 개 모아둘 때 주로 사용됩니다.
배열 생성하기
배열은 대괄호 []를 사용하여 생성하며, 각 요소는 쉼표(,)로 구분합니다.
// 숫자 배열
let numbers = [10, 20, 30, 40, 50];
// 문자열 배열
let fruits = ["사과", "바나나", "오렌지", "포도"];
// 다양한 타입의 요소를 포함하는 배열 (권장하지는 않음)
let mixedArray = ["Hello", 123, true, { id: 1 }];
// 빈 배열
let emptyArray = [];
console.log(numbers); // 결과: [ 10, 20, 30, 40, 50 ]
console.log(fruits); // 결과: [ '사과', '바나나', '오렌지', '포도' ]배열 요소 접근하기
배열의 각 요소는 고유한 인덱스(index)를 가지고 있습니다. 인덱스는 0부터 시작하는 정수입니다. 배열이름[인덱스] 형식으로 요소에 접근합니다.
let colors = ["red", "green", "blue"];
console.log(colors[0]); // 결과: red (첫 번째 요소)
console.log(colors[1]); // 결과: green (두 번째 요소)
console.log(colors[2]); // 결과: blue (세 번째 요소)
console.log(colors[3]); // 결과: undefined (인덱스를 벗어나면 undefined)length 속성)
배열의 총 요소 개수는 length 속성을 통해 알 수 있습니다.
console.log(fruits.length); // 결과: 4length 속성은 배열의 마지막 인덱스를 알거나, 반복문을 사용할 때 유용합니다.
배열 요소 추가 및 변경하기
배열의 특정 인덱스에 접근하여 값을 변경하거나, 새로운 요소를 추가할 수 있습니다.
let tasks = ["운동하기", "공부하기", "요리하기"];
console.log(tasks); // 결과: [ '운동하기', '공부하기', '요리하기' ]
// 요소 변경 (인덱스를 통해)
tasks[0] = "산책하기";
console.log(tasks); // 결과: [ '산책하기', '공부하기', '요리하기' ]
// 요소 추가 (length 속성을 이용)
tasks[tasks.length] = "책 읽기"; // 배열의 마지막에 추가
console.log(tasks); // 결과: [ '산책하기', '공부하기', '요리하기', '책 읽기' ]
// `push()` 메서드를 이용한 추가 (더 권장되는 방법)
tasks.push("청소하기"); // 배열의 마지막에 요소 추가
console.log(tasks); // 결과: [ '산책하기', '공부하기', '요리하기', '책 읽기', '청소하기' ]
// `unshift()` 메서드를 이용한 추가 (배열의 맨 앞에 추가)
tasks.unshift("명상하기"); // 배열의 맨 앞에 요소 추가
console.log(tasks); // 결과: [ '명상하기', '산책하기', '공부하기', '요리하기', '책 읽기', '청소하기' ]배열 요소 삭제하기
배열에서 요소를 삭제하는 여러 방법이 있습니다.
let items = ["A", "B", "C", "D"];
console.log(items); // 결과: [ 'A', 'B', 'C', 'D' ]
// `pop()` 메서드: 배열의 마지막 요소를 제거하고 반환합니다.
let lastItem = items.pop();
console.log(items); // 결과: [ 'A', 'B', 'C' ]
console.log(lastItem); // 결과: D
// `shift()` 메서드: 배열의 첫 번째 요소를 제거하고 반환합니다.
let firstItem = items.shift();
console.log(items); // 결과: [ 'B', 'C' ]
console.log(firstItem); // 결과: A
// `splice()` 메서드: 특정 인덱스부터 원하는 개수만큼 요소를 제거할 수 있습니다.
// items.splice(시작_인덱스, 제거할_개수);
items.splice(0, 1); // 인덱스 0부터 1개 제거 (B 제거)
console.log(items); // 결과: [ 'C' ]
items.push("D", "E"); // 다시 추가
console.log(items); // 결과: [ 'C', 'D', 'E' ]
items.splice(1, 2); // 인덱스 1부터 2개 제거 (D, E 제거)
console.log(items); // 결과: [ 'C' ]splice() 메서드는 요소를 추가하거나 교체하는 데도 사용될 수 있는 강력한 메서드입니다. (추가적인 활용은 심화 학습에서 다루겠습니다.)
배열 순회하기 (반복문과 함께)
배열의 모든 요소를 하나씩 접근하여 어떤 작업을 수행해야 할 때 반복문을 사용합니다.
let students = ["민수", "지영", "태호"];
// 1. for 문을 이용한 순회 (가장 기본적인 방법)
for (let i = 0; i < students.length; i++) {
console.log(`${i + 1}번째 학생: ${students[i]}`);
}
/*
결과:
1번째 학생: 민수
2번째 학생: 지영
3번째 학생: 태호
*/
// 2. for...of 문을 이용한 순회 (ES6, 배열 요소에 직접 접근)
for (let student of students) {
console.log(`학생 이름: ${student}`);
}
/*
결과:
학생 이름: 민수
학생 이름: 지영
학생 이름: 태호
*/
// 3. forEach() 메서드를 이용한 순회 (배열 메서드, 함수 활용)
// forEach(콜백함수)
students.forEach(function(student, index) { // 각 요소와 인덱스를 인자로 받습니다.
console.log(`${index + 1}. ${student}`);
});
/*
결과:
1. 민수
2. 지영
3. 태호
*/
// 화살표 함수로 더 간결하게 표현 가능
students.forEach((student, index) => {
console.log(`${index + 1}. ${student}`);
});for...of 문과 forEach() 메서드는 for 문보다 더 직관적이고 간결하게 배열을 순회할 수 있게 해줍니다.
객체와 배열은 모두 데이터를 묶지만, 읽는 방식과 변경 패턴이 다릅니다. 아래 기준표처럼 이름으로 찾는 데이터인지, 순서대로 처리할 데이터인지 먼저 구분하면 구조 선택이 쉬워집니다.
복합 데이터를 다룰 때는 구조 선택 이후에도 접근 방식, 변경 메서드, 반복 방법을 함께 맞춰야 코드가 흔들리지 않습니다.
함수 분해 정리
이번 장에서는 자바스크립트에서 여러 데이터를 효과적으로 관리하기 위한 핵심 데이터 구조인 객체와 배열의 기초를 학습했습니다.
객체는 이름(키)과 값으로 이루어진 속성을 묶어 연관된 데이터를 구조화할 때 사용됩니다. 점 표기법과 대괄호 표기법으로 속성에 접근하고, 속성을 추가/변경/삭제하는 흐름을 확인했습니다. 객체 내부에 정의된 함수인 메서드의 개념도 함께 다뤘습니다.
배열은 순서(인덱스)를 기반으로 여러 값을 목록 형태로 저장하는 데 사용됩니다. 배열의 요소에 접근하고, push(), pop(), shift(), unshift(), splice()와 같은 다양한 메서드를 사용하여 요소를 추가하거나 제거하는 방법을 배웠습니다. 그리고 for, for...of, forEach()를 이용한 배열 순회 방법도 알아보았습니다.
이러한 객체와 배열은 실제 웹 개발에서 수많은 데이터를 다루는 데 있어 없어서는 안 될 도구입니다. 복잡한 데이터를 논리적으로 구성하고 처리하는 능력을 기르기 위해, 다양한 상황에서 객체와 배열을 활용해보는 연습을 꾸준히 수행해 데이터 처리 기준을 고정하는 것이 좋습니다.
객체와 배열 기초에서 다시 볼 기준과 확인 순서를 정리했습니다.
다음 학습으로 넘어가기 전, 객체와 배열 기초에서 남은 개념 경계와 실습 확인 포인트를 점검합니다.