객체와 프로퍼티

NANA·2023년 8월 31일
0

모던자바스크립트 Deep Dive를 보면서 정리 중

자바스크립트를 구성하는 거의 모든 것이 객체다.
원시 값을 제외한 나머지 값(함수, 배열, 정규 표현식 등)은 모두 객체다.

원시 타입 값은 변경 불가, 단 하나의 값.
객체 타입 값은 변경 가능, 원시 값 또는 다른 객체로 구성.
객체는 0개 이상의 프로퍼티(키+값)로 구성됨.

var person = {
	name: 'Lee',
    age: 20
}

자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값이 될 수 있다. 함수는 일급 객체이므로 마찬가지로 값(프로퍼티 값)으로 사용할 수 있다. 프로퍼티 값이 함수일 경우, 일반 함수와 구분하기 위해 메서드라 부른다.

var person = {
	name: 'Lee', // 프로퍼티
    age: 20
  	increase: function() { // 메서드
    	this.age++;
    }
}
  • 프로퍼티 : 객체의 상태를 나타내는 값(data)
  • 메서드 : 프로퍼티를 참조하고 조작할 수 있는 동작
  • 함수로 객체를 생성하기도 하며 함수 자체가 객체이기도 하다.

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

자바와 같은 객체지향 언어는 클래스를 사전에 정의하고 필요한 시점에 new 연산자와 함께 생성자를 호출하여 인스턴스를 생성하는 방식으로 객체 생성.

** 인스턴스 : 클래스에 의해 생성되어 메모리에 저장된 실체

js는 프로토타입 기반 객체지향 언어로서 클래스 기반 객체지향 언어와는 달리 다양한 객체 생성 방법을 지원한다.

  • 객체 리터럴
  • Object 생성자 함수
  • 생성자 함수
  • Object.create 메서드
  • 클래스(ES6)
  1. 객체 리터럴
    ** 리터럴 : 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법.

중괄호({...}) 내에 0개 이상의 프로퍼티를 정의.
변수에 할당되는 시점에 js엔진은 객체 리터럴을 해석해 객체를 생성.

var person = {
	name: 'Lee',
  	sayHello: function () {
    	console.log(`Hello! My name is ${this.name}.`);
    }
};
console.log(typeof person); // object
console.log(person); // {name: "Lee", sayHellp: f}

var empty = {}; // 빈 객체
console.log(typeof empty); // object

객체 리터럴의 중괄호는 코드 블록을 의미하지 않는다.
코드 블록의 닫는 중괄호 뒤에는 세미콜론을 붙이지 않지만 객체 리터럴은 값으로 평가되므로 세미콜론을 붙여야 한다.

--> 객체를 숫자, 문자값 만들 듯이 편하게 생성할 수 있다.
객체 생성과 동시에 프로퍼티를 만들거나, 생성한 이후 프로퍼티를 동적으로 추가할 수도 있다.

객체 리터를 외에는 전부 함수를 사용해 객체 생성.

프로퍼티

  • 프로퍼티 키는 식별자 네이밍 규칙을 준수해야 한다. 그렇지 않으면 따옴표를 붙여야함.
  • 문자열 또는 문자열로 평가할 수 있는 표현식을 사용해 프로퍼티 키를 동적으로 생성 가능. 이 경우 프로퍼티 키로 사용할 표현식을 대괄호([...])로 묶여야 한다.
var obj = {};
var key = 'hello';

obj[key] = 'world';

// var obj = { [key]: 'world' };

console.log(obj); // { hello: 'world' }
  • 키에 문자열이나 심벌 값 외의 값을 사용하면 암묵적 타입 변환을 통해 문자열이 됨.

프로퍼티 접근

var person = {
	name: 'Lee',
  	sayHello: function () {
    	console.log(`Hello! My name is ${this.name}.`);
    }
};

console.log(person.name);	
console.log(person['name']);	// 반드시 '' 붙여야한다, 키 명이 네이밍 큐칙을 안지킬 경우 [] 접근법 사용

객체에 존재하지 않는 프로퍼티에 접근하면 undefined를 반환. ReferenceError가 아님..

축약 표현


var name = 'Lee', age = 34;

var person = { name, age }; // 프로퍼티 축약 표현

console.log(name); // Lee

계산된 프로퍼티

문자열 또는 문자열로 타입 변환할 수 있는 값으로 평가되는 표현식을 사용해 프로퍼티 키를 동적으로 생성.

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 }


//ES6부터 가능 - 객체 리터럴 내부에서도 계산된 프로퍼티 이름으로 프로퍼티 키를 동적 생성 가능
const obj = {
	[`${prefix}-${++i}`]: i,
  	[`${prefix}-${++i}`]: i,
  	[`${prefix}-${++i}`]: i,
}
console.log(obj);  // { prop-1: 1, prop-2: 2, prop-3: 3 }

java와의 차이

  • js 객체는 프로퍼티 키를 인덱스로 사용하는 해시 테이블이라고 생각하면 편함
  • java, c++ 등은 사전에 정의된 클래스를 기반으로 객체(인스턴스)를 생성하기 때문에 객체가 생성된 이후에 프로퍼티를 삭제/추가 불가.
  • js는 동작으로 삭제/추가 가능하다. 편리하지만 성능 면에서는 불리(복잡)
profile
일단 나만 알아보면 된다는 마음으로, 작더라도 꾸준히

0개의 댓글