[JS] 10장 객체 리터럴

sohyeon kim·2022년 7월 4일
0

10.1 객체란?

자바스크립트는 객체기반프로그래밍 언어이다.

원시값을 제외한 나머지 값 함수, 배열, 정규 표현식 등은 모두 객체이다.

  • 객체는 다양한 타입의 값을 하나의 단위로 구성한 복합적인 자료구조이다.
  • 원시 값은 변경 불가능한 값이지만 객체는 변경 가능한 값이다.
  • 0개 이상의 프로퍼티로 구성된 집합이며, 프로퍼티는 으로 구성된다.
  • 객체는 프로퍼티메서드로 구성된 집합니다.
  • 객치는 상태와 동작을 하나의 단위로 구조화할 수 있다.
  • 함수로 객체를 생성하기도 하며 함수 자체가 객체이기도 하다.

프로퍼티: 객체의 상태를 나타내는 값(data)
메서드: 프로퍼티(상태 데이터)를 참조하고 조작할 수 있는 동작(behavior)

즉 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임을 객체지향 프로그래밍이라 한다



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

자바스크립트는 프로토타입 기반 객체지향 언어로 다양한 객체 생성 방법을 지원한다.

  • 객체 리터럴
  • object 생성자 함수
  • 생성자 함수
  • object.create 메서드
  • 클래스(ES6)

이 중 객체 리터럴이 가장 일반적이고 간단한 객체 생성 방법이다.

다시 말하자면
자바스크립트는 객체 생성을 편하게 하기 위해 객체리터럴 을 지원한다.
const a 로 선언한 순간 a 라는 이름의 객체가 생성되는 것이다.

const a = {
	hello = 'world'
}

객체지향 vs 객체기반


'리터럴'이란?

리터럴은 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용하여 값을 생성하는 표기법이다.

쉽게 표현하자면
리터럴은 변하지 않는 데이터를 뜻 한다.

"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

객체 리터럴 외의 객체 생성 방식은 모두 함수를 이용해 객체를 만든다. 이 부분은 함수를 알아본 이후에 공부하자.



10.3 프로퍼티

객체는 프로퍼티의 집합이며, 프로퍼티는 키와 값으로 구성된다.

const person = {
  // 프포러티 키는 name, 프로퍼티 값은 'Kim'
	name: 'Kim',
  // 프포러티 키는 age, 프로퍼티 값은 20
  	age: 20
}

프로퍼티 키: 빈 문자열을 포함하는 모든 문자열 또는 심볼 값
프로퍼티 값: 자바스크립트에서 사용할 수 있는 모든 값

  • 프로퍼티를 나열할 때는 쉼표(,)로 구분한다.
  • 프로퍼티 키는 프로퍼티 값에 접근할 수 있는 이름으로 식별자 역할을 한다.
  • 객체의 키로는 심벌 혹은 문자열이 사용된다.
  • 키가 식별자 네이밍 규칙을 준수하면 따옴표를 생략할 수 있다.
const name = {
	firstName : 'So-Hyoen', // 식별자 네이밍 규칙 준수하는 키
  	'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'}
  • 빈 문자열을 프로퍼티 키로 사용해도 에러가 발생하지 않으나, 키로서 의미를 갖지 못함으로 사용하지 말자.
  • 프로퍼티 키에 문자열이나 심벌 값 외의 값을 사용하면 암묵적 타입 변환을 통해 문자열이 된다.
  • 예약어도 키로 사용할 수 있지만 예상치 못한 에러가 발생할 수 있어 사용하지 말자.
  • 이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언된 프로퍼티가 기존 것을 덮어쓴다.


10.4 메서드

프로퍼티의 값이 함수일 경우 이를 일반 함수와 구분하기 위해 '메서드'라고 부른다.

즉, 메서드는 객체에 묶여 있는 함수를 의미한다.

참고) 늘 메서드라고 부르는 것은 아닌 것 같다. 메서드로 쓸 수 있는 경우에만 즉 호출할 떄에 따라 다름.. by Youtube 모던 자바스크립트 딥다이브 스터디 #2-1 (CH10, 11)



10.5 프로퍼티 접근

프로퍼티에 접근하는 방법은 크게 두가지가 있다.

마침표 표기법: 점(.) 연산자에 의한 접근
대괄호 표기법: 대괄호[ ] 연산자에 의한 접근

  • 프로퍼티가 식별자 네이밍 규칙을 준수하고, 자바스크립트에서 사용 가능한 유효한 이름이면 위 방법을 모두 사용할 수 있다.
const person = {
	name: 'Kim'
}

// 마침표 표기법에 의한 접근
console.log(person.name); // Kim

// 대괄호 표기법에 의한 접근
console.log(person['name']); // Kim
  • 대괄호 연산자 내부에 지정하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열이 와야한다. 그렇지 않으면 자바스크립트 엔진은 식별자로 해석한다.
const person = {
	name:'Sohyeon'
  };

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


10.6 프로퍼티 값 갱신

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

const person = {
	name: 'Kim'
}

person.name = 'Lee'
console.log(person) // {name:'Lee'}


10.7 프로퍼티 동적 생성

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

const person = {
	name: 'Kim'
}

person.age = 20
console.log(person) // {name:'Lee', age:20}


10.8 프로퍼티 삭제

delete 연산자를 사용하여 객체의 프로퍼티를 삭제한다.

  • delete 연산자의 피연산자는 프로퍼티 값에 접근할 수 있는 표현식이어야 한다.
  • 만약 존재하지 않는 프로퍼티를 삭제하면 아무런 에러 없이 무시된다.
const person = {
	name: 'Kim',
  	age:20
}

delete person.age; // true

// 애초에 person 에 address 없음, 삭제 불가능 그런데 에러 발생 안함
delete person.address; // true 가 나옴 ... 
console.log(person) // { name: 'Kim' }


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

10.9.1 프로퍼티 축약 표현

  • 프로퍼티의 값을 변수를 사용하는 경우 프로퍼티의 키가 변수명과 같으면 이를 축약해서 나타낼 수 있다.
  • key 값이 곧 value 다! 라는 동작을 수행해서 똑같이 나온다.
const name = 'sohyeon'
const obj = {
	name: name,
}

// 위 표현을 아래처럼 나타낼 수 있음
const name = 'sohyeon'
const obj = {
	name,
}

10.9.2 계산된 프로퍼티 이름

대괄호 [ ] 를 사용하면 객체 리터럴 상에서 표현식의 평가값로 사용할 수 있다.(본문)

객체 리터럴 안의 프로퍼티 키가 대괄호[ ]로 둘러싸여 있다면, 이를 계산된 프로퍼티(computed property) 라고 부른다.

let a = 'age'

const person = {
	name: 'Sohyeon',
  	[a] : 20
} 

console.log(person) // { name: 'Sohyeon', age: 20 }

이 부분 어려워 ... 책이 더 어려워...


10.9.3 메서드 축약표현

메서드의 축약 방법은 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

축약이라고는 했지만 사실 ES5의 경우와 후자로 선언한 ES6 의 경우 성격이 조금 다르다. 축약 표현에 경우 constructor(생성자)로 사용될 수 없는 등 차이점이 있다. 자세한 내용은 26장 '메서드'에서 다룬다.



모던 자바스크립트 Deep Dive

블로그에 작성한 파트 외 정리본은 깃헙에서 확인 가능합니다.

profile
slow but sure

0개의 댓글