logo태영이의 공부방

[JavaScript] 객체 리터럴

2023년 03월 12일

객체

자바스크립트는 객체 기반 프로그래밍 언어로 원시 값을 제외한 나머지 값(함수, 배열, 정규 표현식, ...)은 모두 객체다.

⭐

원시 타입 vs. 객체 타입

원시 타입객체 타입
하나의 값만 나타냄다양한 타입의 값을 하나의 단위로 구성(복합적인 자료구조)
변경 불가능한 값변경 가능한 값

객체는 0개 이상의 프로퍼티로 구성된 집합이며, 프로퍼티는 키와 값으로 구성된다. 이때, 자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값이 될 수 있다. 따라서 일급 객체인 함수도 프로퍼티 값으로 사용할 수 있다. 함수가 프로퍼티 값인 경우 메서드라 한다.

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

객체 생성

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

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

객체 리터럴

객체 생성 방법 중 가장 일반적이고 간단한 방법으로 객체를 생성하기 위한 표기법을 말한다. 변수에 할당되는 시점에 자바스크립트 엔진이 객체 리터럴을 해석해 객체를 생성한다.

// 객체 리터럴: 중괄호 내에 0개 이상의 프로퍼티 정의
let man = {
  name: 'tae',
  action: function() {
    console.log(`${this.name} is studying.`);
  }
};
 
// 프로퍼티를 정의하지 않을 경우 빈 객체 생성
let noMan = {};

프로퍼티

프로퍼티를 나열할 때는 쉼표로 구분하며, 프로퍼티의 키와 값으로 사용할 수 있는 값은 아래와 같다.

  • 프로퍼티 키: 빈 문자열을 포함한 모든 문자열 또는 심벌 값 — 이외의 값은 암묵적 타입 변환을 통해 문자열로 변환됨
    • 식별자 네이밍 규칙을 따른 경우: 따옴표 생략
    • 식별자 네이밍 규칙을 따르지 않은 경우: 따옴표 사용

    ※ 주의: 중복 선언 시 나중에 선언한 프로퍼티가 먼저 선언한 프로퍼티를 덮어씀

  • 프로퍼티 값: 자바스크립트에서 사용할 수 있는 모든 값

⭐

권장하지 않는 프로퍼티 키

  • 빈 문자열

    • 키로서의 의미를 갖지 못한다.
  • 예약어

    • 예상치 못한 에러가 발생할 수 있다.

⭐

동적 프로퍼티 키 생성

let fruit = {};
let newKey = 'pine';
 
// 프로퍼티 키로 사용할 표현식을 대괄호로 묶기
fruit[newKey] = 'apple';
// fruit = {pine: 'apple'}

프로퍼티 접근

프로퍼티를 접근하는 방법으로는 아래 두 가지가 있다.

마침표 표기법dot notation: 마침표 프로퍼티 접근 연산자(.) 사용

  • 프로퍼티 키가 식별자 네이밍 규칙을 준수하지 않는다면 사용 불가
man.name

대괄호 표기법bracket notation: 대괄호 프로퍼티 접근 연산자([ ]) 사용

  • 대괄호 내에 들어가는 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 함

    단, 프로퍼티 키가 숫자로 이뤄진 문자열인 경우 생략 가능

man['name']
man[123]

프로퍼티 값 갱신

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

let man = {age: 33};
 
// 값 갱신
man.age = 20;

프로퍼티 동적 생성

존재하지 않는 프로퍼티에 값을 할당할 경우 프로퍼티가 동적으로 생성된다.

let man = {age: 33};
 
// name 프로퍼티 생성 및 값 할당
man.name = 'tae'; // man = {age: 33, name: 'tae'}

프로퍼티 삭제

delete 연산자로 프로퍼티를 삭제한다. 존재하지 않는 프로퍼티를 삭제해도 에러가 발생하지 않는다.

let man = {age: 33};
 
// age 프로퍼티 삭제
delete man.age;
// 존재하지 않는 프로퍼티 삭제 (에러 발생 X)
delete man.name;

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

1. 프로퍼티 축약 표현

프로퍼티 값은 변수에 할당된 값(식별자 표현식)일 수도 있다. 이와 같이 프로퍼티 값으로 변수를 사용하는 경우, 변수명과 프로퍼티 키가 동일할 때 프로퍼티 키를 생략할 수 있다.

// ES6
let a = 'apple', b = 'banana';
 
// 프로퍼티 축약 표현, property shorthand
const fruit = {a, b}; // {a: 'apple', b: 'banana'}

2. 계산된 프로퍼티 이름

문자열 또는 문자열로 타입 변환할 수 있는 값으로 평가되는 표현식을 대괄호로 묶어 프로퍼티 키를 동적으로 생성할 수 있다. 이를 계산된computed 프로퍼티 이름이라 한다.

let month = 1;
let day = 0;
let calendarBefore = {};
 
// 계산된 프로퍼티 이름
// ES5: 객체 리터럴 외부
calendarBefore['2023-' + month + '-' + ++day] = day;
calendarBefore['2023-' + month + '-' + ++day] = day;
// calendarBefore = { '2023-1-1': 1, '2023-1-2': 2 }
 
// ES6: 객체 리터럴 내부
const calendar = {
  [`2023-${month}-${++day}`]: day,
  [`2023-${month}-${++day}`]: day
};
// calendar = { '2023-1-1': 1, '2023-1-2': 2 }

3. 메서드 축약 표현

메서드 정의 시, function 키워드를 생략한 축약 표현을 사용할 수 있다.

// ES5
let manBefore = {
  age: 20,
  introduce: function() {
    console.log(`I'm ${this.age} years old.`);
  }
};
 
// ES6
let man = {
  age: 20,
  introduce() {
    console.log(`I'm ${this.age} years old.`);
  }
};

정리

  • 객체
    • 원시 값을 제외한 나머지 값
    • 0개 이상의 프로퍼티 집합
    • 생성: 객체 리터럴
      • 중괄호 내에 0개 이상의 프로퍼티 정의
  • 프로퍼티
    • 키와 값으로 구성
      • 키: 문자열 또는 심벌 값
      • 값: 자바스크립트에서 사용할 수 있는 모든 값 (함수도 가능 — 메서드)
    • 프로퍼티 접근: 마침표/대괄호 표기법
    • 프로퍼티 값 갱신: 이미 존재하는 프로퍼티에 값 할당
    • 프로퍼티 동적 생성: 존재하지 않는 프로퍼티에 값 하당
    • 프로퍼티 삭제: delete 연산자 사용