객체
자바스크립트는 객체 기반 프로그래밍 언어로 원시 값을 제외한 나머지 값(함수, 배열, 정규 표현식, ...)은 모두 객체다.
⭐
원시 타입 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
연산자 사용
- 키와 값으로 구성