새소식

JavaScript

[모던자바스크립트] 10. 객체 리터럴

  • -

1. 객체란?

원시값을 제외한 나머지 값(함수, 배열, 정규 표현식 등)은 모두 객체이다.
객체타입은 다양한 타입의 값을 하나의 단위로 구성한 복합적인 자료구조이다.

 

객체는 0개 이상의 프로퍼티로 구성된 집합이며, 프로퍼티는 key와 value로 구성된다.

 

자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값이 될 수 있다. 

자바스크립트에서 함수 또한 일급 객체이므로 값으로 취급할 수 있는데, 프로퍼티 값이 함수 일 경우 일반함수와 구분하기 위해 메서드라고 부른다.

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

 

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

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

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

가장 일반적인 방법은 객체 리터럴이다.

객체 리터럴은 중괄호 내에 0개 이상의 프로퍼티를 정의한다. 변수가 할당되는 시점에 자바스크립트 엔진은 객체 리터럴을 해석해 객체를 생성한다. 

 

객체 리터럴의 중괄호는 코드 블록을 의미하지 않고 값으로 평가되는 표현식이다. 따라서 객체 리터럴을 닫는 중괄호 뒤에는 세미콜론을 붙인다.

 

 

3. 프로퍼티

프로퍼티는 나열할 때 쉼표로 구분한다.

var obj = {};
var key = 'hello';

// ES5: 프로퍼티 키 동적 생성
obj[key] = 'world';
// ES6: 계산된 프로퍼티 이름
// var obj = { [key]: 'world' };

문자열 또는 문자열로 평가할 수 있는 표현식을 사용해 프로퍼티 키를 동적으로 생성할 수도 있다.

 

// 프로퍼티 키는 문자열로 암묵적 변환
var obj = {
  0: 1,
  1: 2,
  2: 3
};

프로퍼티 키에 문자열, 심벌 값 이외의 값을 사용하면 암묵적 타입 변환을 통해 문자열이 된다.

 

var obj = {
  var: '',
  function: ''
};

var, function과 같은 예약어를 프로퍼티 키로 사용해도 에러는 발생하지 않지만 예상치 못한 에러가 발생할 여지가 있으므로 권장하지 않는다.

 

이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언한 프로퍼티가 먼저 선언한 프로퍼티를 덮어 쓴다. 에러 발생 유의.

 

 

 

4. 메서드

메서드는 객체에 묶여있는 함수를 의미한다. 

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

console.log(circle.getDiameter());		// 10
함수와 메서드의 차이(ref. 코어자바스크립트 70p)

함수와 메서드의 유일한 차이는 독립성이다.
함수는 그 자체로도 독립적인 기능을 수행한다.
메서드는 자신을 호출한 대상 객체에 관한 동작을 수행한다.

이는 자바스크립트가 상황별로 this 키워드에 다른 값을 부여함으로써 구현되었다.

그렇다면, 메서드 = "객체 프로퍼티에 할당된 함수" 인가?
객체 프로퍼티에 할당한다고 하여 무조건 메서드가 되는 것은 아니다.
객체의 메서드로서 호출할 경우에만 메서드이며, 그렇지 않은 경우에는 함수가 된다.

 

 

5. 프로퍼티 접근

 

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

만약 식별자 네이밍 규칙을 준수하지 않은 경우에는 대괄호 표기법만 사용이 가능하다.

 

객체에 존재하지 않는 프로퍼티에 접근하면 undefined을 반환한다.

 

 

6. 프로퍼티 값 갱신

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

var person = {
  name: 'Lee'
}

person.name = 'Kim';

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

 

 

7. 프로퍼티 동적 생성

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

var person = {
  name: 'Lee'
}

person.age = 20;

console.log(person);	// {name: "Lee", age: 20}

 

 

8.프로퍼티 삭제

delete 연산자는 객체의 프로퍼티를 삭제한다.

var person = {
 name: "Lee"
};

person.age = 20;

delete person.age;

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

 

 

 

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

 

9-1. 프로퍼티 축약 표현

프로퍼티 값으로 변수를 사용하는 경우 변수 이름과 프로퍼티 키가 동일한 이름일 때 프로퍼티 키를 생략할 수 있다. 프로퍼티 키는 변수 이름으로 자동 생성된다.

 

9-2. 계산된 프로퍼티 이름

ES6에서는 객체 리터럴 내부에서도 계산된 프로퍼티 이름으로 프로퍼티 키를 동적 생성할 수 있다.

 

9-3. 메서드 축약 표현

// ES6
const obj = {
  name: 'Lee',
  say() {
    console.log('Hi, ' + this.name);
  }
};

obj.say();	// Hi, Lee
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.