객체 리터럴
1. 객체란?
자바스크립트는
객체기반
의프로그래밍 언어
이다.
원시값
을 제외한 나머지 값 함수
, 배열
, 정규 표현식
등은 모두 객체
이다.
- 객체는 다양한 타입의 값을 하나의 단위로 구성한
복합적인 자료구조
이다. - 원시 값은 변경 불가능한 값이지만 객체는 변경 가능한 값이다.
- 0개 이상의 프로퍼티로 구성된 집합이며, 프로퍼티는
키
와값
으로 구성된다. - 객체는
프로퍼티
와메서드
로 구성된 집합이다. - 객체는 상태와 동작을 하나의 단위로 구조화할 수 있다.
- 함수로 객체를 생성하기도 하며 함수 자체가 객체이기도 하다.
프로퍼티
: 객체의 상태를 나타내는 값(data)
메서드
: 프로퍼티(상태 데이터)를 참조하고 조작할 수 있는 동작(behavior)
객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임을
객체지향 프로그래밍
이라 한다
2. 객체 리터럴에 의한 객체 생성
자바스크립트는 프로토타입 기반 객체지향 언어로 다양한 객체 생성 방법
을 지원한다.
- 객체 리터럴
- object 생성자 함수
- 생성자 함수
- object.create 메서드
- 클래스(ES6)
이 중 객체 리터럴
이 가장 일반적이고 간단한 객체 생성 방법이다.
자바스크립트는 객체 생성을 편하게 하기 위해
객체 리터럴
을 지원한다.
const a 로 선언한 순간 a 라는 이름의 객체가 생성되는 것이다.
const a = {
hello = 'world'
}
‘리터럴’이란?
리터럴
은 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용하여 값을 생성하는 표기법이다.
리터럴은 변하지 않는 데이터를 뜻한다.
"1" "hello" "1e+12"
같은 고정된 값을 리터럴이라고 하고 그들은 바뀔수 없다. 더 이상 나누어질 수 없는 직관적인 데이터를 생각하면 편할 것이다.
var a = 1;
// 이 코드는 a라는 상자(메모리 위치)안에 1이라는 데이터(메모리 값)을 담고있다
//a를 우리는 변수라고 하고 1이라는 데이터를 리터럴이라고 한다.
‘객체 리터럴’이란?
즉, ‘객체 리터럴’은 객체를 생성하기 위한 표기법이다.
- 객체 리터럴은 중괄호 { } 내에 0개 이상의 프로퍼티를 정의하며, 하나의 프로퍼티에 대해 콜론(:)을 기준으로 왼편에는 키, 오른편에는 값을 적는다.
- 각 프로퍼티는 쉼표로 구분한다.
- 객체 리터럴은 변수에 할당되는 시점에 자바스크립트 엔진은 객체 리터럴을 해석해 객체를 생성한다.
- 프로퍼티 없어도 빈객체로 선언이 가능하다.
- 객체 리터럴의 중괄호는 코드 블록을 의미하지 않는다. 세미콜론을 붙이자.
// 아래의 코드에서 {}부분이 객체 리터럴이다.
const student = {
name: "Kim",
age: 20,
};
// 빈 객체
const empty = {};
console.log(typeof empty); // object
객체 리터럴 외의 객체 생성 방식은 모두 함수를 이용해 객체를 만든다.
3. 프로퍼티
객체는 프로퍼티의 집합이며, 프로퍼티는 키와 값으로 구성된다.
const person = {
// 프로퍼티 키는 name, 프로퍼티 값은 'Kim'
name: "Kim",
// 프로퍼티 키는 age, 프로퍼티 값은 20
age: 20,
};
프로퍼티 키
: 빈 문자열을 포함하는 모든 문자열 또는 심볼 값
프로퍼티 값
: 자바스크립트에서 사용할 수 있는 모든 값
- 프로퍼티를 나열할 때는 쉼표(,)로 구분한다.
- 프로퍼티 키는 프로퍼티 값에 접근할 수 있는 이름으로
식별자 역할
을 한다. - 객체의 키로는 심벌 혹은 문자열이 사용된다.
- 키가 식별자 네이밍 규칙을 준수하면 따옴표를 생략할 수 있다.
const name = {
firstName: "댕댕", // 식별자 네이밍 규칙 준수하는 키
"last-name": "Kim", // 식별자 네이밍 규칙 준수하지 않는 키
//last-name: 'Kim' // SyntaxError: Unexpected token -
};
- 대괄호를 [ ]를 사용하면 변수의 값을 키로 사용할 수 있다. (키 동적생성)
const obj = {};
const key = "hello";
// ES5: 프로퍼티 키 동적 생성
obj[key] = "world";
// 'world'
// ES6: 계산된 프로퍼티 이름
// const obj = {[key]: 'world'}
console.log(obj);
// {hello:'world'}
- 빈 문자열을 프로퍼티 키로 사용해도 에러가 발생하지 않으나, 키로서 의미를 갖지 못하므로 사용하지 말자.
- 프로퍼티 키에 문자열이나 심벌 값 외의 값을 사용하면 암묵적 타입 변환을 통해 문자열이 된다.
- 예약어도 키로 사용할 수 있지만 예상치 못한 에러가 발생할 수 있어 사용하지 말자.
- 이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언된 프로퍼티가 기존 것을 덮어쓴다.
4. 메서드
프로퍼티의 값이 함수일 경우 이를 일반 함수와 구분하기 위해 ‘메서드’라고 부른다.
즉, 메서드는 객체에 묶여 있는 함수
를 의미한다.
5. 프로퍼티 접근
- 프로퍼티에 접근하는 방법은 크게 두가지가 있다.
마침표 표기법
: 점(.) 연산자에 의한 접근
대괄호 표기법
: 대괄호[ ] 연산자에 의한 접근
=> 프로퍼티가 식별자 네이밍 규칙을 준수하고, 자바스크립트에서 사용 가능한 유효한 이름이면 위 방법을 모두 사용할 수 있다.
const person = {
name: "Kim",
};
// 마침표 표기법에 의한 접근
console.log(person.name); // Kim
// 대괄호 표기법에 의한 접근
console.log(person["name"]); // Kim
- 대괄호 연산자 내부에 지정하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열이 와야한다. 그렇지 않으면 자바스크립트 엔진은 식별자로 해석한다.
const person = {
name: "댕댕",
};
console.log(person[name]); //ReferenceError: name is not defined
- 객체에 존재하지 않는 프로퍼티에 접근하면 undefined를 반환한다.
- 객체 안에 없는 키에 값을 할당하면 새로운 프로퍼티가 생성된다.
const obj = {};
console.log(obj.a); //undefined
obj.a = "Hi";
console.log(obj.a); //Hi
6. 프로퍼티 값 갱신
- 이미 존재하는 프로퍼티에 값을 할당하면 갱신된다.
const person = {
name: "Kim",
};
person.name = "Lee";
console.log(person); // {name:'Lee'}
7. 프로퍼티 동적 생성
- 존재하지 않는 프로퍼티에 값을 할당하면 프로퍼티가 동적으로 생성되어 추가되고 값이 할당된다.
const person = {
name: "Kim",
};
person.age = 20;
console.log(person); // {name:'Lee', age:20}
8. 프로퍼티 삭제
- delete 연산자를 사용하여 객체의 프로퍼티를 삭제한다.
- delete 연산자의 피연산자는 프로퍼티 값에 접근할 수 있는 표현식이어야 한다.
- 만약 존재하지 않는 프로퍼티를 삭제하면 아무런 에러 없이 무시된다.
const person = {
name: "Kim",
age: 20,
};
delete person.age; // true
// 애초에 person 에 address 없음, 삭제 불가능 그런데 에러 발생 안함
delete person.address; // true 가 나옴 ...
console.log(person); // { name: 'Kim' }
9. ES6에서 추가된 객체 리터럴의 확장 기능
프로퍼티 축약 표현
- 프로퍼티의 값을 변수를 사용하는 경우 프로퍼티의 키가 변수명과 같으면 이를 축약해서 나타낼 수 있다.
- key 값이 곧 value 다! 라는 동작을 수행해서 똑같이 나온다.
const name = "댕댕";
const obj = {
name: name,
};
// 위 표현을 아래처럼 나타낼 수 있음
const name = "댕댕";
const obj = {
name,
};
계산된 프로퍼티 이름
- 대괄호 [ ] 를 사용하면 객체 리터럴 상에서 표현식의
평가값
을키
로 사용할 수 있다.(본문) - 객체 리터럴 안의 프로퍼티 키가 대괄호[ ]로 둘러싸여 있다면, 이를
계산된 프로퍼티
(computed property) 라고 부른다.
let a = "age";
const person = {
name: "댕댕",
[a]: 20,
};
console.log(person); // { name: '댕댕', age: 20 }
메서드 축약표현
- 메서드의 축약 방법은
ES5
의 경우 메서드를 선언하려면 프로퍼티 값으로함수
를 할당한다.
var obj = {
name: "Kim",
// 값으로 함수 선언
sayHi: function () {
console.log("Hi!" + this.name);
},
};
obj.sayHi(); //Hi! Kim
- 반면
ES6
에서는 메서드를 정의할 때function 키워드를 생략
한 축약 표현을 사용할 수 있다.
var obj = {
name: "Kim",
sayHi() {
console.log("Hi!" + this.name);
},
};
obj.sayHi(); //Hi! Kim
댓글남기기