티스토리 뷰

객체란?

객체는 변경 가능한 값이다. 객체는 0개 이상의 프로퍼티로 구성된 집합이며, 프로퍼티는 키와 값으로 구성됩니다. 객체는 프로퍼티의 집합입니다.

  • 프로퍼티: 객체의 상태를 나타내는 값(data)
  • 메서드: 프로퍼티(상태 데이터)를 참조하고 조작할 수 있는 동작(behavior)

객체는 상태와 동작을 하나의 단위로 구조화할 수 있어 유용합니다.


 

객체 생성 방법

  • 객체 리터럴
  • `Object` 생성자 함수
  • 생성자 함수
  • `Object.create` 메서드
  • 클래스(ES6)

자바스크립트는 프로토타입 기반 객체지향 언어로서 다양한 객체 생성 방법을 지원합니다.


 

객체 리터럴에 의한 객체 생성

객체 리터럴은 객체를 생성하기 위한 표기법입니다. 객체 리터럴은 중괄호(`{...}`) 내에 0개 이상의 프로퍼티를 정의합니다. 변수에 할당되는 시점에 자바스크립트 엔진은 객체 리터럴을 해석해 객체를 생성합니다.

var person = {
	name: 'Kim',
    sayHello: function(){
    	console.log(`Hello! My name is ${this.name}.`);
    }
};

console.log(typeof person); // object
console.log(person); // {name: 'Kim', sayHello: ƒ}

빈 객체 생성

var empty = {}; // 빈 객체
console.log(typeof empty); // object

객체 리터럴의 중괄호는 코드 블록을 의미하지 않습니다. 객체 리터럴의 닫는 중괄호 뒤에는 세미콜론을 붙입니다.


 

프로퍼티

객체는 프로퍼티의 집합이며, 프로퍼티는 키와 값으로 구성됩니다.

var person = {
	// 프로퍼티 키는 name, 프로퍼티 값은 'Kim'
	name: 'Kim',
    // 프로퍼티 키는 age, 프로퍼티 값은 26
    age: 26,
}

프로퍼티를 나열할 때는 쉼표(`,`)로 구분합니다.

  • 프로퍼티 키: 빈 문자열을 포함하는 모든 문자열 또는 심벌 값
  • 프로퍼티 값: 자바스크립트에서 사용할 수 있는 모든 값

프로퍼티 키는 문자열이므로 따옴표(`'...'` 또는 `"..."`)로 묶어야 합니다. 하지만 식별자 네이밍 규칙을 준수하면 따옴표를 생략할 수 있습니다.

var person = {
	firstName: 'bearn', // 식별자 네이밍 규칙을 준수하는 프로퍼티 키
    'last-name': 'Kim' // 식별자 네이밍 규칙을 준수하지 않는 프로퍼티 키
}

console.log(person); // {firstName: 'bearn', last-name: 'Kim'}

프로퍼티키로 사용할 표현식을 대괄호(`[...]`)로 묶으면 프로퍼티 키를 동적으로 생성할 수 있습니다.

var key = 'hello';

var obj1 = {[key]:'world1'};
var obj2 ={key:'world2'};

console.log(obj1); // {hello: 'world1'}
console.log(obj2); // {key: 'world2'}

프로퍼티 키로 빈 문자열을 사용해도 에러가 발생하지 않습니다. 프로퍼티 키에 문자열이나 심벌 값 외의 값을 사용하면 암묵적 타입 변환을 통해 문자열이 됩니다.

var empty = {
	'': 'empty'
}

var foo = {
	0: 1,
    1: 2,
    2: 3,
};

console.log(empty); // {"": 'empty'}
console.log(foo); // {0: 1, 1: 2, 2: 3}

`var`, `function`과 같은 예약어를 프로퍼티 키로 사용해도 에러가 발생하지 않습니다. 이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언한 프로퍼티 키로 덮어씁니다.

var foo = {
	name: 'Kim',
    name: 'Lee'
}

console.log(foo); // {name: 'Lee'}

 

메서드

메서드는 객체에 묶여 있는 함수를 의미합니다. 함수는 값으로 취급할 수 있기 때문에 프로퍼티 값으로 사용할 수 있습니다. 객체에 묶여있는 함수를 일반 함수와 구분하기 위해 메서드라고 부릅니다.

var circle = {
	radius: 5, // 프로퍼티
    
    getDiameter: function() { // 메서드
    	return 2 * this.radius;
    }
};

console.log(circle.getDiameter()); // 10

 

프로퍼티 접근

  • 마침표 프로퍼티 접근 연산자(`.`)를 사용하는 마침표 표기법
  • 대괄호 프로퍼티 접근 연산자(`[...]`)를 사용하는 대괄호 표기법

자바스크립트에서 사용 가능한 유효한 이름이면 마침표 표기법과 대괄호 표기법을 모두 사용할 수 있습니다. 객체에 존재하지 않는 프로퍼티에 접근하면 `undefined`를 반환합니다.

var person = {
	name: 'Kim'
};

// 마침표 표기법에 의한 프로퍼티 접근
console.log(person.name); // Kim

// 대괄호 표기법에 의한 프로퍼티 접근
console.log(person['name']); // Kim

// name 식별자는 존재하지 않으니 undefined
// person 객체의 undefined 프로퍼티는 존재하지 않으니 undefined
console.log(person[name]); // undefined
console.log(person.name); // undefined

 

프로퍼티 값 갱신

이미 존재한는 프로퍼티에 값을 할당하면 프로퍼티 값이 갱신됩니다.

var person = {
	name: 'Kim'
};

person.name = 'Lee';

console.log(person); // {name: 'Lee'}

 

프로퍼티 동적 생성

존재하지 않는 프로퍼티 값을 할당하면 프로퍼티가 동적으로 생성되어 추가되고 프로퍼티 값이 할당됩니다.

var person = {
	name: 'Kim'
};

// person 객체에는 age 프로퍼티가 존재하지 않습니다.
// 따라서 person 객체에 age 프로퍼티가 동적으로 생성되고 값이 할당됩니다.
person.age = 26;

console.log(person); // {name: 'Kim', age: 26}

 

프로퍼티 삭제

`delete` 연산자는 객체의 프로퍼티를 삭제합니다. 존재하지 않는 프로퍼티를 삭제하면 에러 없이 무시됩니다.

var person = {
	name: 'Kim',
    age: 26
};

// person 객체에 age 프로퍼티가 존재합니다.
// 따라서 delete 연산자로 age 프로퍼티를 삭제할 수 있습니다.
delete person.age;

// person 객체에 address 프로퍼티가 존재하지 않습니다.
// 따라서 delete 연산자로 address 프로퍼티를 삭제할 수 없습니다. 이때 에러는 발생하지 않습니다.
delete person.address;

console.log(person); // {name: 'Kim'}

 

ES6에서 추가된 객체 리터럴의 확장 기능

프로퍼티 축약 표현

ES6에서는 프로퍼티 값으로 변수를 사용하는 경우 변수 이름과 프로퍼티 키가 동일한 이름일때 프로퍼티 키를 생략할 수 있습니다.

let x = 1, y = 2;

// 프로퍼티 축약 표현
const obj = {x, y};

console.log(obj) // {x: 1, y: 2}

 

계산된 프로퍼티 이름

프로퍼티 키로 사용할 표현식을 대괄호(`[...]`)로 묶어 사용하면 프로퍼티 키를 동적으로 생성할 수 있습니다.

var prefix = 'prop';
var i = 0;

var obj = {
	[`${prefix}-${++i}`]: i,
    [`${prefix}-${++i}`]: i,
    [`${prefix}-${++i}`]: i,
};

console.log(obj); // {prop-1: 1, prop-2: 2, prop-3: 3}

 

메서드 축약 표현

ES6에서는 메서드를 정의할 때 function 키워드를 생략한 축약 표현을 사용할 수 있습니다.

const obj = {
	name: 'Kim',
    sayHi(){
    	console.log('Hi!' + this.name);
    }
};

obj.sayHi(); // Hi!Kim

 

참고

 

모던 자바스크립트 Deep Dive : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함