JavaScript 독학 가이드 6 - 객체와 메서드
사용자 정보를 저장한다고 생각해보세요. 이름, 나이, 이메일을 각각 변수로 만들면 관리가 어려워요. 이럴 때 객체를 쓰면 관련된 데이터를 하나로 묶을 수 있습니다.
객체가 뭔가요?
객체는 키(key)와 값(value) 쌍으로 이루어진 데이터 모음이에요.
let person = {
name: "철수",
age: 25,
email: "chulsu@example.com"
};
중괄호 {}로 만들고, : 로 키와 값을 연결합니다.
객체 만들기
객체 리터럴 (가장 흔함)
let car = {
brand: "현대",
model: "소나타",
year: 2023,
color: "흰색"
};
new Object() (잘 안 씀)
let car = new Object();
car.brand = "현대";
car.model = "소나타";
객체 접근하기
점 표기법
let person = {
name: "철수",
age: 25
};
console.log(person.name); // "철수"
console.log(person.age); // 25
실행 결과:
> console.log(person.name)
철수
> console.log(person.age)
25
대괄호 표기법
console.log(person["name"]); // "철수"
console.log(person["age"]); // 25
실행 결과:
> console.log(person["name"])
철수
> console.log(person["age"])
25
언제 대괄호를 쓰나요?
// 키에 공백이나 특수문자가 있을 때
let obj = {
"first name": "철수",
"email-address": "test@test.com"
};
console.log(obj["first name"]); // 점 표기법 불가능
console.log(obj["email-address"]);
// 변수로 키에 접근할 때
let key = "name";
console.log(person[key]); // "철수"
실행 결과:
> console.log(obj["first name"])
철수
> console.log(obj["email-address"])
test@test.com
> console.log(person[key])
철수
객체 수정하기
let person = {
name: "철수",
age: 25
};
// 값 변경
person.age = 26;
console.log(person.age); // 26
// 속성 추가
person.email = "chulsu@test.com";
console.log(person.email); // "chulsu@test.com"
// 속성 삭제
delete person.email;
console.log(person.email); // undefined
실행 결과:
> console.log(person.age)
26
> console.log(person.email)
chulsu@test.com
> delete person.email
> console.log(person.email)
undefined
메서드 (Method)
객체에 함수를 넣으면 메서드가 돼요.
let person = {
name: "철수",
age: 25,
sayHello: function() {
console.log("안녕하세요!");
}
};
person.sayHello(); // 안녕하세요!
실행 결과:
> person.sayHello()
안녕하세요!
메서드 단축 문법
let person = {
name: "철수",
age: 25,
sayHello() { // function 키워드 생략 가능
console.log("안녕하세요!");
}
};
this 키워드
메서드 안에서 this는 그 객체 자신을 가리켜요.
let person = {
name: "철수",
age: 25,
introduce() {
console.log(`안녕하세요, 제 이름은 ${this.name}이고, 나이는 ${this.age}살입니다.`);
}
};
person.introduce(); // 안녕하세요, 제 이름은 철수이고, 나이는 25살입니다.
실행 결과:
> person.introduce()
안녕하세요, 제 이름은 철수이고, 나이는 25살입니다.
주의: 화살표 함수는 this를 다르게 처리해요!
let person = {
name: "철수",
sayHi: () => {
console.log(`Hi, ${this.name}`); // undefined (화살표 함수는 this 바인딩 안 됨)
}
};
메서드에는 일반 함수를 쓰세요.
객체 안의 객체
객체 안에 객체를 넣을 수 있어요.
let person = {
name: "철수",
age: 25,
address: {
city: "서울",
district: "강남구",
zipcode: "06000"
}
};
console.log(person.address.city); // "서울"
console.log(person.address.zipcode); // "06000"
실행 결과:
> console.log(person.address.city)
서울
> console.log(person.address.zipcode)
06000
객체와 반복문
for…in 문
let person = {
name: "철수",
age: 25,
email: "chulsu@test.com"
};
for (let key in person) {
console.log(`${key}: ${person[key]}`);
}
// 출력:
// name: 철수
// age: 25
// email: chulsu@test.com
실행 결과:
> for (let key in person) { console.log(`${key}: ${person[key]}`); }
name: 철수
age: 25
email: chulsu@test.com
Object 메서드
let person = {
name: "철수",
age: 25,
email: "chulsu@test.com"
};
// 모든 키
console.log(Object.keys(person)); // ["name", "age", "email"]
// 모든 값
console.log(Object.values(person)); // ["철수", 25, "chulsu@test.com"]
// 키-값 쌍
console.log(Object.entries(person));
// [["name", "철수"], ["age", 25], ["email", "chulsu@test.com"]]
실행 결과:
> console.log(Object.keys(person))
["name", "age", "email"]
> console.log(Object.values(person))
["철수", 25, "chulsu@test.com"]
> console.log(Object.entries(person))
[["name", "철수"], ["age", 25], ["email", "chulsu@test.com"]]
실전 예제
1. 사용자 객체
let user = {
username: "chulsu123",
email: "chulsu@test.com",
isLoggedIn: false,
login() {
this.isLoggedIn = true;
console.log(`${this.username}님이 로그인했습니다.`);
},
logout() {
this.isLoggedIn = false;
console.log(`${this.username}님이 로그아웃했습니다.`);
}
};
user.login(); // chulsu123님이 로그인했습니다.
user.logout(); // chulsu123님이 로그아웃했습니다.
실행 결과:
> user.login()
chulsu123님이 로그인했습니다.
> user.logout()
chulsu123님이 로그아웃했습니다.
2. 쇼핑 카트
let cart = {
items: [],
addItem(item) {
this.items.push(item);
console.log(`${item}이(가) 추가되었습니다.`);
},
removeItem(item) {
let index = this.items.indexOf(item);
if (index > -1) {
this.items.splice(index, 1);
console.log(`${item}이(가) 삭제되었습니다.`);
}
},
getTotal() {
return this.items.length;
}
};
cart.addItem("사과"); // 사과이(가) 추가되었습니다.
cart.addItem("바나나"); // 바나나이(가) 추가되었습니다.
console.log(cart.getTotal()); // 2
실행 결과:
> cart.addItem("사과")
사과이(가) 추가되었습니다.
> cart.addItem("바나나")
바나나이(가) 추가되었습니다.
> console.log(cart.getTotal())
2
3. 계산기 객체
let calculator = {
result: 0,
add(num) {
this.result += num;
return this;
},
subtract(num) {
this.result -= num;
return this;
},
multiply(num) {
this.result *= num;
return this;
},
getResult() {
return this.result;
},
clear() {
this.result = 0;
return this;
}
};
// 메서드 체이닝
calculator.add(10).multiply(2).subtract(5).getResult();
console.log(calculator.result); // 15
실행 결과:
> calculator.add(10).multiply(2).subtract(5).getResult()
> console.log(calculator.result)
15
생성자 함수
같은 구조의 객체를 여러 개 만들 때 씁니다.
function Person(name, age) {
this.name = name;
this.age = age;
this.introduce = function() {
console.log(`안녕하세요, ${this.name}입니다.`);
};
}
let person1 = new Person("철수", 25);
let person2 = new Person("영희", 23);
person1.introduce(); // 안녕하세요, 철수입니다.
person2.introduce(); // 안녕하세요, 영희입니다.
실행 결과:
> person1.introduce()
안녕하세요, 철수입니다.
> person2.introduce()
안녕하세요, 영희입니다.
구조 분해 할당
객체에서 값을 꺼내는 편리한 방법이에요.
let person = {
name: "철수",
age: 25,
email: "chulsu@test.com"
};
// 기존 방식
let name = person.name;
let age = person.age;
// 구조 분해 할당
let { name, age } = person;
console.log(name); // "철수"
console.log(age); // 25
// 다른 이름으로 저장
let { name: userName, age: userAge } = person;
console.log(userName); // "철수"
실행 결과:
> console.log(name)
철수
> console.log(age)
25
> console.log(userName)
철수
자주 하는 실수
1. this 헷갈림
let person = {
name: "철수",
sayHi() {
setTimeout(function() {
console.log(this.name); // undefined (this가 바뀜)
}, 1000);
}
};
// 해결 방법: 화살표 함수
let person2 = {
name: "영희",
sayHi() {
setTimeout(() => {
console.log(this.name); // "영희" (this 유지됨)
}, 1000);
}
};
2. 객체 복사 실수
let obj1 = { name: "철수" };
let obj2 = obj1; // 참조만 복사됨!
obj2.name = "영희";
console.log(obj1.name); // "영희" (obj1도 바뀜!)
// 제대로 복사하려면
let obj3 = { ...obj1 }; // spread 연산자
obj3.name = "민수";
console.log(obj1.name); // "영희" (obj1은 안 바뀜)
실행 결과:
> obj2.name = "영희"
> console.log(obj1.name)
영희
> obj3.name = "민수"
> console.log(obj1.name)
영희
다음 단계
다음 글에서는 DOM 조작 기초를 배웁니다. JavaScript로 웹 페이지의 HTML 요소를 찾고 수정하는 방법을 알아볼 거예요. 드디어 화면에 뭔가 보이는 걸 만들 수 있어요!
객체는 데이터를 구조화하는 핵심 도구예요. 실제 프로젝트에서 거의 모든 데이터가 객체 형태로 다뤄집니다!
JavaScript 독학 가이드 시리즈:
← 블로그 목록으로