[Deep Dive] 10장 객체 리터럴

팡긍·2022년 5월 9일
0

JavaScript Deep Dive

목록 보기
8/8

10.1 객체란?

자바스크립트는 객체 기반의 프로그래밍 언어이다. 그렇기에 거의 모든 값들이 객체로 이루어져 있으며, 이 부분은 기본적이기에 잘 알아야 한다는 생각이 들었다.
객체의 프로퍼티는 키 key와 값 value로 구성되어 있다.

var person = {
  name: 'Jeon',
  age: 20
};

자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값이 될 수 있으며, 자바스크립트 함수는 일급 객체이기에 값으로 취급할 수 있다. 이때, 프로퍼티 값이 함수일 경우 일반 함수와 구분하기 위해서 메서드 method 라고 부른다.

var counter = {
  num: 0,
  increase: function() {
    this.num++;
  }
};

위의 코드를 보면 프로퍼티와 메서드로 구성된 것을 볼 수 있다.

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


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

C++나 Java 같은 클래스 기반 객체지향 언어는 클래스를 사전에 정의하고 필요한 시점에 new 키워드와 함께 생성자를 호출하여 인스턴스를 생성한다.
반면에 자바스크립트는 프로토타입 기반 객체지향언어이기 때문에, 다양한 객체 생성 방법을 지원한다.

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

가장 간단한 방법은 객체 리터럴을 사용하는 방법이다.

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

console.log(typeof person); // object
console.log(person); // { name : "Jeon", sayHello: f}

만약 중괄호 내에 프로퍼티를 정의하지 않았다면 빈 객체가 생성된다.

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

10.3 프로퍼티

객체는 프로퍼티의 집합이며, 프로퍼티는 키와 값(key:value)로 구성된다.

var person = {
  name: 'Jeon',
  age: 20
}
  • 프로퍼티 키 : 빈 문자열을 포함하는 모든 문자열 또는 심벌 값
  • 프로퍼티 값 : 자바스크립트에서 사용할 수 있는 모든 값

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

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

// ES5
obj[key] = 'world';

// ES6
// var obj = { [key] : 'world' };

console.log(obj);

만약 프로퍼티 키 값에 문자열이나 심벌 이외의 값(숫자 등)을 사용하면 암묵적 타입 변환을 통해 문자열로 생성된다는 점을 잊지 말자.

또한, 이미 존재하는 키에 중복 선언을 하게 되면, 먼저 쓰여진 프로퍼티 값에 덮어쓴다.

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

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

10.4 메서드

자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값으로 사용할 수 있다. 그렇기에 함수도 프로퍼티 값으로 사용할 수 있는데, 이때 일반 함수와 구분하기 위해서 메서드 method 라 부른다.

var circle = {
  radius: 5,
  
  getDiameter: function() {
    return 2 * this.radius;
  }
};

console.log(circle.getDiameter());

10.5 프로퍼티 접근

프로퍼티에 접근하는 방법은 다음 두 가지 방법이 있다.

  • 마침표 프로퍼티 접근 연산자 (.)을 사용하는 마침표 표기법
  • 대괄호 프로퍼티에 접근 연산자 ([...])를 사용하는 대괄호 표기법
var person = {
  name: 'Lee',
}

console.log(person.name); // Lee
console.log(person['name']); // Lee

이때, 대괄호 표기법을 사용할 땐, 대괄호 프로퍼티 접근 연산자 내부에 지정하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열 이어야 한다. 만약 그렇지 않으면 JS 엔진은 식별자로 판단을 한다.

var person = {
  name: 'Lee'
};

console.log(person[name]);	// ReferenceError: name is not defined

또한, 존재하지 않은 프로퍼티에 접근하게 되면 undefined를 반환한다. 이때는 ReferenceError가 발생하지 않으니 주의하자.

var person = {
name: 'Lee'
};

console.log(person.age) // undefined

10.6 프로퍼티 값 갱신

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

var person = {
  name: 'Lee'
};

person.name = 'Kim';

console.log(person);

10.7 프로퍼티 동적 생성

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

var person = {
  name: 'Lee';
}

person.age = 20;

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

10.8 프로퍼티 삭제

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

var person = {
  name: 'Lee';
}

person.age = 20;

// 위에서 추가된 age를 삭제한다.
delete person.age;

// address가 person 안에 없기 때문에 삭제할 수 없으며, 에러는 발생하지 않는다.
delete person.address;

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

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

ES6에서는 더욱 간편하고 표현력 있는 객체 리터럴의 확장 기능을 제공한다.

10.9.1 프로퍼티 축약 표현

👉 ES5

var x = 1, y = 2;

var obj = {
  x: x,
  y: y
};

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

👉 ES6

let x = 1, y = 2;

const obj = { x, y };

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

위의 두 코드만 비교해도 많이 간단해진 것을 볼 수 있다.

10.9.2 계산된 프로퍼티 이름

👉 ES5

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

var obj = {};

// 계산된 프로퍼티 이름으로 프로퍼티 키 동적 생성
obj[prefix + '-' + ++i] = i;
obj[prefix + '-' + ++i] = i;
obj[prefix + '-' + ++i] = i;

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

👉 ES6

const prefix = 'prop';
let i = 0;

// 객체 리터럴 내부에서 계산된 프로퍼티 이름으로 프로퍼티 키를 동적 생성
const obj = {
  [`${prefix}-${++i}`]: i,
  [`${prefix}-${++i}`]: i,
  [`${prefix}-${++i}`]: i,
};

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

10.9.3 메서드 축약 표현

👉 ES5에서는 메서드를 정의할 때 프로퍼티 값으로 함수를 할당한다.

var obj = {
  name: 'Lee',
  sayHi: function() {
    console.log('Hi! ' + this.name);
  }
};

obj.sayHi();	// Hi! LEe

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

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

obj.sayHi(); // Hi! Lee

0개의 댓글