객체와 배열 기초
우리는 이전 장에서 숫자, 문자열, 불리언과 같은 개별적인 데이터 타입을 다루고, 변수에 저장하는 방법을 배웠습니다. 하지만 실제 웹 애플리케이션에서는 사용자 정보, 상품 목록, 게시글 등과 같이 여러 개의 연관된 데이터를 묶어서 관리해야 할 필요가 많습니다. 예를 들어, 한 명의 사용자 정보는 이름, 나이, 이메일 주소 등 여러 속성으로 이루어져 있습니다.
이러한 복합적인 데이터를 효율적으로 조직하고 관리하기 위해 자바스크립트는 객체(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); // 결과: 4
length
속성은 배열의 마지막 인덱스를 알거나, 반복문을 사용할 때 유용합니다.
배열 요소 추가 및 변경하기
배열의 특정 인덱스에 접근하여 값을 변경하거나, 새로운 요소를 추가할 수 있습니다.
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()
를 이용한 배열 순회 방법도 알아보았습니다.
이러한 객체와 배열은 실제 웹 개발에서 수많은 데이터를 다루는 데 있어 없어서는 안 될 도구입니다. 복잡한 데이터를 논리적으로 구성하고 처리하는 능력을 기르기 위해, 다양한 상황에서 객체와 배열을 활용해보는 연습을 꾸준히 해보시길 바랍니다.