객체란 자료형의 관점에서 키(Key)와 값(Value)으로 구성된 속성(Property)의 집합을 의미한다.
원시 타입(숫자, 문자열, boolean, null, undefined, Symbol)을 제외한 나머지 값들을 의미한다.
// 속성이 하나도 없는 객체(=빈 객체)
const peron = {};
// 속성을 지정한 객체
const person = {
name : "Hong Gildong"
};
// 객체는 데이터의 종류를 가리지 않고 모든 자료형의 데이터를 값는다.
const person = {
name : ["Hong", "Gildong"], // 배열 데이터
age : 20, // 숫자 데이터
isAdult : true //논리 데이터
};
// 객체 안에 또 다른 객체나 함수가 들어간다.
const person = {
name : {
firstName : "Gildong",
lastName : "Hong"
},
age : 20,
isAdult : true,
printInfo : function(){
console.log('printInfo');
}
};
var person = {
firstName : "John",
lastName : "Doe",
age : 30
};
console.log(person.firstName); // "John" 출력
console.log(person.lastName); // "Doe" 출력
console.log(person.age); // 30 출력
// 대괄호 연산자로 객체 속성 접근하기
const person = {
name : "Hong Gildong",
age : 20
};
console.log(person["name"]); // Hong Gildong
console.log(person["age"]); // 20
// 따옴표 생략시 발생하는 오류
const person ={
name : "Hong Gildong"
};
console.log(person[name]);
// Error 발생 : RefrenceError : name is not defined
// 객체의 속성값이 배열이나 객체 리터럴 함수인 경우 접근하는 방법
const person = {
name : {
firstName : "Gildong",
latName : "Hong"
};
likes : ["apple", "samsung"],
printHello : function(){
return "Hello";
}
};
// person객체의 name 속성에 값으로 할당된 객체의 firstName 속성에 접근한다.
console.log(person["name"]["firsName"]);
// 대괄호 연산자에 키를 사용하여 배열인 속성값에 접근한다.
console.log(person["likes"]); // ['apple', 'samsung']
// 배열 요소를 인덱스로 접근한다.
console.log(person["likes"][0]); // apple
console.log(person["likes"][1]); // samsung
// 함수를 접근한다
console.log(person["printHello"]); // [Function : printHello]
// 함수 호출시 ()를 사용한다.
console.log(person["printHello"]()); // hello
const person = {
name : {
firstName : "Gildong",
latName : "Hong"
};
likes : ["apple", "samsung"],
printHello : function(){
return "Hello";
}
};
console.log(person.name.lastName); // Hong
console.log(person.age); // 20
console.log(person.likes[0]); // apple
console.log(person.printHello()); // hello
const person = {
name : "Hong Gildong"
};
console.log(person."name");
//SystaxError : unexpected string
const person = {
name : "Hong Gildong",
};
person.name = "Kim"; // 또는 person["name"] = "Kim";
console.log(person.name); // Kim
// 객체 속성 추가(1)
const person = {};
console.log(person); //{}
person.name = "Hong Gildong";
console.log(person); // {name : 'Hong Gildong'}
// 객체 속성 추가(2)
const person = {};
console.log(person); //{}
person.name = {
firstName : "Gildong",
lastName : "Hong"
};
person.likes = ["apple", "samsung"];
person.printHello = function(){
return "hello";
}
이미 만들어진 객체에 나중에 속성을 추가하는 것을 자바스크립트에서는 "속성을 동적으로 추가한다."라고 한다.
// 객체 속성 삭제 1
const person = {
name = "Hong Gildong"
};
delete person.name; // 또는 delete person["name"]
console.log(person); // { } 출력
기본 자료형은 깊은 복사를 진행하고 참조 자료형은 얕은 복사를 진행한다.
// 깊은 복사 예시코드
let num = 10;
let copyNu = num;
num = 20; // 변수 num을 재할당
console.log(num); // 20
console.log(copyNum); // 10
// 변수 num만 값이 변경되고 변수 copyNum은 변경되지 않는다.
// 변수 copyNum은 변수 num의 값을 복사한 별도의 데이터를 가지고 있기 때문이다.
복사한 값을 재할당할 대 한쪽 데이터가 변경되어도 서로 영향을 미치지 않게 복사되는 것 = 깊은 복사 라고 한다.
// const의 오류가 발생하는 원인 예시 코드
const person = {
name : "Hong Gildong"
};
person = {
name : "Sucoding"
};
//TypeError : Assignment to constant variable
// 객체 속성 변경 예제코드
const person = {
name : "Hong Gildong"
};
person.name = "Hong";
// 객체 복사 예제코드
const person = {
name : "Hong Gildong"
};
const copyPerson = person; // 변수 person에 할당된 객체를 변수 copyPerson에 복사한다.
person.name = "Hong"; // 변수 person에 할당된 객체의 값을 변경한다.
console.log(person.name); // Hong
console.log(copyPerson.name); // Hong
한쪽 데이터가 변경되면 다른 쪽 데이터도 변경되어 서로 영향을 받는 것을 얕은 복사(shallow copy) 라고 한다.
// 객체 리터럴 예제코드
const person = {
name: 'John Doe',
age: 30,
greet: function() {
console.log('Hello, my name is ' + this.name + '!');
}
};
person.greet(); // 출력: Hello, my name is John Doe!
function Person(name, age) {
this.name = name;
this.age = age;
this.greet = function() {
console.log('Hello, my name is ' + this.name + '!');
};
}
const person1 = new Person('John Doe', 30);
const person2 = new Person('Jane Doe', 25);
person1.greet(); // 출력: Hello, my name is John Doe!
person2.greet(); // 출력: Hello, my name is Jane Doe!
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log('Hello, my name is ' + this.name + '!');
}
}
const person = new Person('John Doe', 30);
person.greet(); // 출력: Hello, my name is John Doe!
객체 리터럴 | 생성자 | 클래스(ES6+) | |
---|---|---|---|
장점 | - 가장 간단하고 직관적이다. - 단일 객체를 빠르게 생성 및 초기화가 가능하다. | - 유사 객체를 여러 개 생성할 수 있다. | - 객체 지향 프로그래밍 지원을 한다. - 클래스 상속이 간단하고 명확하다. - 구조적이고 명확한 문법을 제공한다. |
단점 | - 코드 중복의 가능성이 있다. - 프로토타입 상속 설정이 어렵다. | - 문법적으로 복잡하고 구식일 수 있다. - new 키워드 누락 시 버그가 발생할 가능성이 있다. | -이전 자바스크립트 버전에서 사용이 어렵다. |
사용 시점 | 단순한 구조의 단일 객체가 필요할 때 사용한다. | - 유사한 객체를 여러 개 생성해야 할 때 사용한다. | - 객체 지향 프로그래밍 활용 시 - 큰 규모의 프로젝트나 팀 작업시 사용한다. |
const myObject = {
property: 'Value',
myMethod: function() {
console.log('This is a method.');
}
};
myObject.myMethod(); // 출력: This is a method.
const myObject = {
property: 'Value',
myMethod() {
console.log('This is a method using ES6 shorthand.');
}
};
myObject.myMethod(); // 출력: This is a method using ES6 shorthand.
const myObject = {
property: 'Value',
};
myObject.anotherMethod = function() {
console.log('This is another method.');
};
myObject.anotherMethod(); // 출력: This is another method.
class Person {
#name; // private 필드 선언한다.
constructor(name) {
this.#name = name;
}
// getter
getName() {
return this.#name;
}
// setter
setName(name) {
this.#name = name;
}
}
const person = new Person('John');
person.name = 'Park' // private 변수를 직접 변경했을 경우 반영되지 않는다.
console.log(person.getName()); // John
person.setName('Jane');
console.log(person.getName()); // Jane