10.1 객체란?

  • 자바스크립트는 객체 기반의 프로그래밍 언어이며, 자바스크립트를 구성하는 거의 모든 것이 객체다.
  • 원시 값을 제외한 나머지 값(함수, 배열, 정규 표현식 등)은 모두 객체다
  • 원시 타입은 단 하나의 값만 나타내지만 객체 타입은 다양한 타입의 값을 하나의 단위로 구성한 복합적인 자료구조다.
  • 원시 타입의 값, 원시 값은 변경 불가능한 값이지만 객체 타입의 값, 객체는 변경 가능한 값이다.
  • 객체는 0개 이상의 프러퍼티로 구성된 집합이며, 프로퍼티는 키와 값으로 구성된다.
var person = {
	name: 'Lee'; // 프로퍼티
    age: 20; // 프로퍼티
    // name, age - 프로퍼티 키
    // Lee, 20 - 프로퍼티 값
}
  • 자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값이 될 수 있다.
  • 자바스크립트의 함수는 일급 객체이므로 값으로 취급할 수 있어서 함수도 프로퍼티 값으로 사용할 수 있다.
  • 프로퍼티 값이 함수일 경우. 일반 함수와 구분하기 위해 메서드라 부른다
var counter = {
	num: 0, // 프로퍼티
	increase: function(){ // 메서드
    	this.num++;
    }
}
  • 프로퍼티 : 객체의 상태를 나타내는 값
  • 메서드 : 프로퍼티를 참조하고 조작할 수 있는 동작

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

  • C++나 자바 같은 클래스 기반 객체지향 언어는 클래스를 사전에 정의하고 필요한 시점에 new 연산자와 함께 생성자를 호출하여 인스턴스를 생성하는 방식으로 객체를 생성
  • 인스턴스: 클래스에 의해 생성되어 메모리에 저장된 실체
    - 객체지향 프로그래밍에서 객체는 클래스와 인스턴스를 포함한 개념
    - 클래스는 인스턴스를 생성하기 위한 템플릿의 역할
  • 자바스크립트는 프로토타입 기반 객체지향 언어로서 클래스 기반 객체지향 언어와 달리 다양한 객체 생성 방법을 지원한다.
- 객체 리터럴
- Object 생성자 함수
- 생성자 함수
- Object.create 메서드
- 클래스(ES6)
  • 객체 생성 방법 중에서 가장 간단한 방법은 객체 리터럴을 사용하는 방법
  • 객체 리터럴의 중괄호는 코드 블록을 의미하지 않는다.
  • 코드 블록읜 중괄호 뒤에는 세미콜론을 붙이지 않으나 객체 리터럴의 뒤에는 세미콜론을 붙인다.
  • 객체를 생성하기 위해 클래스를 먼저 정의하고 new 연산자와 함께 생성자를 호출할 필요가 있다.
  • 숫자 값이나 문자열을 만드는 것과 유사하게 객체를 생성한다.

10.3 프로퍼티

  • 객체는 프로퍼티의 집합이며, 프로퍼티는 키와 값으로 구성된다.
  • 프로퍼티를 나열할 때는 쉼표로 구분한다
  • 프로퍼티 키: 빈 문나열을 포함하는 모든 문자열 또는 심벌 값
  • 프로퍼티 값: 자바스크립트에서 사용할 수 있는 모든 값
  • 프로퍼티 키는 프로퍼티 값에 접근할 수 있는 이름으로서 식별자 역할을 한다.
  • 프로퍼티 키는 반드시 식별자 네이밍 규칙을 따라야 하는 것은 아니나 따르지 않은 이름에는 반드시 따옴표를 사용해야 한다.
  • 문자열 또는 문자열로 평가할 수 있는 표현식을 사용해 프로퍼티 키를 동적으로 생성할 수도 있다.
var obj = {};
var key = 'hello';

obj[key] = 'world';

console.log(obj); // {hello: "world"}
  • 프로퍼티 키에 문자열이나 심벌 값 이외의 값을 사용하면 암묵적 타입 변환을 통해 문자열이 된다.
  • 이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언한 프로퍼티가 먼저 선언한 프로퍼티를 덮어쓴다.(에러발생x)

10.4 메서드

  • 자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값으로 사용할 수 있다.
  • 메서드는 객체에 묶여 있는 함수를 의미한다.
var circle = {
	radius: 5, //프로퍼티
    
    getDiameter: function(){ // 메서드
    	return 2 * this.radius; // this는 circle
    }
}
console.log(circle.getDiameter()); // 10

10.5 프로퍼티 접근

  • 프로퍼티에 접근하는 방법은 다음과 같이 두 가지이다
  1. 마침표 프로퍼티 접근 연산자(.)를 사용하는 마침표 표기법
  2. 대괄호 프로퍼티 접근 연산자([...])를 사용하는 대괄호 표기법
  • 프로퍼티 키가 식별자 네이밍 규칙을 준수하는 이름이면 모두 사용 가능하다.
var person = {
	name: 'Lee';
}
// 마침표 표기법
console.log(person.name); // Lee
// 대괄호 표기법
console.log(person['name']); // Lee
  • 대괄호 프로퍼티 접근 연산자 내부에 지정하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열이여야 한다.
  • 그렇지 않으면 자바스크립트 엔진은 식별자로 해석
  • 객체에 존재하지 않는 프로퍼티에 접근하면 undefined를 반환한다.
var person = {
	'last-name': 'Lee';
}

person.last-name;
// 브라우저 환경 : NaN
// Node.js 환경 : ReferenceError
  • 자바스크립트 엔진은 먼저 person.last를 평가
  • person 객체에는 last인 프로퍼티가 없기 때문에 undefined로 평가
  • 따라서 undefined-name과 같아지고 name은 프로퍼티 키가 아닌 식별자로 해석
  • Node.js에서는 name이라는 식별자 선언이 없으므로 에러 발생
  • 브라우저 환경에서는 name이라는 전역 변수가 암묵적으로 존재해 NaN이 된다.

10.6 프로퍼티 값 갱신

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

10.7 프로퍼티 동적 생성

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

10.8 프로퍼티 삭제

  • delete 연산자는 객체의 프로퍼티를 삭제한다.
  • 만약 존재하지 않는 프로퍼티를 삭제하면 아무런 에러없이 무시된다.

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

10.9.1 프로퍼티 축약 표현

  • ES6에서는 프로퍼티 값으로 변수를 사용하는 경우 변수 이름과 프로퍼티 키가 동일한 이름일 때 프로퍼티 키를 생략할 수 있다.
  • 이때 프로퍼티 키는 변수이름으로 자동 생성된다
let x =1, y = 2;
const obj = {x, y};
console.log(obj); // {x: 1, y: 2}

10.9.2 계산된 프로퍼티 이름

  • 문자열 또는 문자열로 타입 변환할 수 있는 값으로 평가되는 표현식을 사용해 프로퍼티 키를 동적으로 생성할 수도 있다.
  • 프로퍼티 키로 사용할 표현식을 대괄호로 묶어야 한다.
  • 이를 계산된 프로퍼티 이름이라 한다.
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}

// 객체 리터럴 내부에서 동적 생성 가능
obj = {
	[`${prefix}-${++i}`]: i,
    [`${prefix}-${++i}`]: i,
    [`${prefix}-${++i}`]: i
}
console.log(obj); // {prop-1: 1, prop-2: 2, prop-3: 3}

메서드 축약 표현

  • ES5에서 메서드를 정의하려면 프로퍼티 값으로 함수를 할당한다.
  • ES6에서는 메서드를 정의할 때 function 키워드를 생략한 축약 표현을 사용할 수 있다.
  • 메서드 축약 표현으로 정의한 메서드는 프로퍼티에 할당한 함수와 다르게 동작한다.
//ES5
var obj = {
	name: 'Lee';
    sayHi: function(){
    	console.log('Hi!' + this.name);
    }
}

obj.sayHi(); // Hi! Lee
//ES6
const obj = {
	name: 'Lee';
    // 메서드 축약 표현
    sayHi(){
    	console.log('Hi!' + this.name);
    }
}

obj.sayHi(); // Hi! Lee

0개의 댓글

Powered by GraphCDN, the GraphQL CDN