10.1 객체란?
객체 타입 (object type)
- 다양한 타입의 값(원시 값 또는 다른 객체)을 하나의 단위로 구성한 복합적인 자료구조
- 변경 가능한 값(mutable value)
- 프로퍼티와 메서드로 구성된 집합체
프로퍼티
- 키(key)와 값(value)로 구성
- 객체의 상태를 나타내는 값 (data)
메서드
- 자바스크립트의 함수는 일급객체이므로 값으로 취급 가능
-> 함수도 프로퍼티값으로 사용 가능
- 프로퍼티를 참조하고 조작할 수 있는 동작(behavior)
var counter = {
num = 0, //프로퍼티
increase : function () { //메서드
this.num ++;
}
};
10.2 객체 리터럴에 의한 객체 생성
클래스 기반 객체지향 언어
- java, c++
- 클래스를 사전에 정의하고 필요한 시점에 new 연산자와 함께 생성자를 호출하여 인스턴스 생성하는 방식으로 객체 생성
프로토타입 기반 객체지향 언어
- javascript
- 객체 생성 방법
1) 객체 리터럴
2) Object 생성자 함수
3) 생성자 함수
4) Object.create 메서드
5) 클래스 (ES6)
객체 리터럴로 생성
- 객체 리터럴은 중괄호({..})내에 0개 이상의 프로퍼티를 정의
- 객체 리터럴에 프로퍼티를 포함시켜 객체를 생성함과 동시에 프로퍼티 생성 가능
- 객체를 생성한 이후에 프로퍼티를 동적으로 추가 가능
var person = {
name:'Lee',
sayHello: function () {
console.log('Hello! My name is ${this.name}.');
}
};
console.log(typeof person); //object
console.log(person); // {name:"Lee", sayHello:f}
- 중괄호 내에 프로퍼티를 정의하지 않으면 빈 객체 생성
var empty = {}; //빈 객체
console.log(typeof empty); //object
10.3 프로퍼티
- 객체는 프로퍼티의 집합이며 프로퍼티는 키와 값으로 구성
var person = {
//프로퍼티 키는 name, 프로퍼티 값은 'Lee'
name : 'Lee';
//프로퍼티 키는 age, 프로퍼티 값은 20
age : 20
};
프로퍼티 값
- 자바스크립테엇 사용할 수 있는 모든 값 사용 가능
프로퍼티 키
- 프로퍼티 값에 접근할 수 있는 이름으로서 식별자의 역할
- 빈 문자열을 포함하는 모든 문자열 또는 심벌값
- 식별자 네이밍 규칙을 따르지 않는 이름에는 반드시 따옴표를 사용해야 함
var person = {
firstName : 'Ung-mo', //식별자 네이밍 규칙을 준수하는 프로퍼티 키
'last-name':'Lee' //식별자 네이밍 규칙을 준수하지 않는 프로퍼티 키
};
console.log(person); //{firstName : "Ung-mo", last-name: "Lee"}
- 문자열 또는 문자열로 평가할 수 있는 표현식을 사용해 프로퍼티 키를 동적으로 생성
- 프로퍼티 키로 사용할 표현식을 대괄호([..])로 묶어야 함
var obj = {};
var key = 'hello';
//ES5 : 프로퍼티 키 동적 생성
obj[key] = 'world';
//ES6 : 계산된 프로퍼티 이름
//var obj = {[key] : 'world'};
console.log(obj); //{hello: "world"}
- 프로퍼티 키에 문자열이나 심벌 값 외의 값을 사용하면 암묵적 타입 변환을 통해 문자열이 됨
var foo = {
0:1,
1:2,
2:3
};
console.log(foo); //{0:1, 1:2, 2:3}
- 이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언한 프로퍼티가 먼저 선언한 프로퍼티를 덮어 씀
var foo = {
name :'Lee',
name : 'Kim'
};
console.log(foo); //{name : "Kim"}
10.4 메서드
- 프로퍼티 값이 함수일 경우 일반 함수와 구분하기 위해 메서드(method)라 부름
- 객체에 묶여 있는 함수
var circle = {
radius : 5, //프로퍼티
//원의 지름
getDiameter : function() { //메서드
return 2 * this.radius; //this는 circle을 가리킴
}
};
console.log(circle.getDiameter()); //10
10.5 프로퍼티 접근
1) 마침표 표기법 (dot notation)
- 마침표 프로퍼티 접근 연산자(.) 사용
2) 대괄호 표기법(bracket notation)
- 대괄호 프로퍼티 접근 연산자 ([..]) 사용
- 내부에 저장하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 함
- 자바스크립트에서 사용 가능한 유효한 이름이 아니면 반드시 대괄호 표기법을 사용해야 함
var person = {
name : 'Lee'
};
//마침표 표기법에 의한 프로퍼티 접근
console.log(person.name); //Lee
//대괄호 표기법에 의한 프로퍼티 접근
console.log(person['name']); //Lee
- 객체에 존재하지 않는 프로퍼티에 접근하면 undefined 반환
var Person = {
name : 'Lee'
};
console.log(person.age); //undefined
10.6 프로퍼티 값 갱신
- 이미 존재하는 프로퍼티에 값을 할당하면 프로퍼티 값이 갱신됨
var person = {
name : 'Lee'
};
//person 객체에 name 프로퍼티가 존재하므로 name 프로퍼티의 값이 갱신됨
person.name = 'Kim';
console.log(person); // {name: "Kim"}
10.7 프로퍼티 동적 생성
- 존재하지 않는 프로퍼티에 값을 할당하면 프로퍼티가 동적으로 생성되어 추가되고 프로퍼티 값이 할당됨
var person = {
name : 'Lee'
};
//person 객체에는 age 프로퍼티가 존재하지 않음
//따라서 person 객체에 age 프로퍼티가 동적으로 생성되고 값이 할당됨
person.age = 20;
console.log(person); // {name: "Lee", age:20}
10.8 프로퍼티 삭제
- delete 연산자는 객체의 프로퍼티를 삭제
var person = {
name : 'Lee'
};
//프로퍼티 동적 생성
person.age = 20;
//person 객체에 age 프로퍼티가 존재함
//따라서 delete 연산자로 age 프로퍼티를 삭제 가능
delete person.age;
//person 객체에 address 프로퍼티가 존재하지 않음
//따라서 delete 연산자로 address 프로퍼티 삭제 불가 (에러가 발생하지는 않음)
delete person.address;
console.log(person); // {name:"Lee"}
10.9 ES6에서 추가된 객체 리터럴의 확장 기능
10.9.1 프로퍼티 축약 표현
- 프로퍼티 값으로 변수를 사용하는 경우 변수 이름과 프로퍼티 키가 동일한 이름일 때 프로퍼티 키 생략(property shorthand)가능
//ES5
var x =1, y=2;
var obj = {
x:x,
y:y
};
console.log(obj);
//ES6
let x =1, y=2;
//프로퍼티 축약 표현
const obj = {x,y};
console.log(obj);
10.9.2 계산된 프로퍼티 이름
계산된 프로퍼티 이름 (computed property name)
- 문자열 또는 문자열로 타입변환할 수 있는 값으로 평가되는 표현식을 사용해 프로퍼티 키를 동적으로 생성
- ES5에서 계산된 프로퍼티 이름을 프로퍼티 키를 동적 생성하려면 객체 리터럴 외부에서 대괄호 표기법을 사용해야함
- ES6에서는 객체 리터럴 내부에서도 계산된 프로퍼티 이름으로 프로퍼티 키 동적 생성 가능
//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에서 메서드를 정의하려면 프로퍼티 값으로 함수 할당
- ES6에서는 메서드를 정의할 때 function 키워드를 생략한 축약 표현 사용 가능
//ES6
const obj = {
name:'Lee',
//메서드 축약 표현
sayHi() {
console.log('Hi!' + this.name);
}
};
obj.sayHi(); //Hi! Lee
'JavaScript' 카테고리의 다른 글
[Deep dive] 12장 함수(1) (0) | 2023.08.08 |
---|---|
[Deep dive] 11장 원시 값과 객체의 비교 (0) | 2023.08.08 |
[Deep dive] 9장 타입 변환과 단축 평가 (0) | 2023.08.07 |
[Deep dive] 8장 제어문 (0) | 2023.08.07 |
[Deep dive] 7장 연산자 (0) | 2023.08.07 |