Programming/JavaScript

[λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive] 10μž₯ 객체 λ¦¬ν„°λŸ΄

yuri lee 2023. 5. 20. 08:00
λ°˜μ‘ν˜•

* 07μž₯ μ—°μ‚°μž, 08μž₯ 쑰건문, 09μž₯ 일뢀 뢀뢄은 νŒ¨μŠ€ν•©λ‹ˆλ‹€. *

 

9.1 νƒ€μž… λ³€ν™˜μ΄λž€? 


κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ κ°’μ˜ νƒ€μž…μ„ λ³€ν™˜ν•˜λŠ” 것을 λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜ λ˜λŠ” νƒ€μž… μΊμŠ€νŒ…μ΄λΌ ν•©λ‹ˆλ‹€. κ°œλ°œμžμ™€ μ˜λ„μ™€ 상관없이 JS엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ΄ λ³€ν™˜λ˜κΈ°λ„ ν•©λ‹ˆλ‹€. 이λ₯Ό 암묡적 νƒ€μž… λ³€ν™” λ˜λŠ” νƒ€μž… κ°•μ œ λ³€ν™˜μ΄λΌ ν•©λ‹ˆλ‹€. 

 

9.2 암묡적 νƒ€μž… λ³€ν™˜


JS엔진은 ν‘œν˜„μ‹μ„ 평가할 λ•Œ μ½”λ“œμ˜ λ¬Έλ§₯을 κ³ λ €ν•΄ μ•”λ¬΅μ μœΌλ‘œ 데이터 νƒ€μž…μ„ κ°•μ œ λ³€ν™˜ ν•  λ•Œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 

'10' + 2 // '102'
7 * '10' // 70

 

9.4 단좕 평가 


9.4.4 μ˜΅μ…”λ„ 체이닝 μ—°μ‚°μž

ES11에 λ„μž…λœ μ˜΅μ…”λ„ 체이닝 μ—°μ‚°μž ?. λŠ” μ’Œν•­μ˜ ν”Όμ—°μ‚°μžκ°€ null λ˜λŠ” undefined인 경우 undefinedλ₯Ό λ°˜ν™˜ν•˜κ³ , μ•„λ‹ˆλΌλ©΄ μš°ν•­μ˜ ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.

val elem = null;

var value = elem?.value;
console.log(value)

 

10.1 κ°μ²΄λž€?


JSλŠ” 객체 기반의 ν”„λ‘œκ·Έλž˜λ° 언어이며, JSλ₯Ό κ΅¬μ„±ν•˜λŠ” 거의 λͺ¨λ“  것은 κ°μ²΄μž…λ‹ˆλ‹€. 객체 νƒ€μž…μ€ λ‹€μ–‘ν•œ νƒ€μž…μ˜ 값을 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ κ΅¬μ„±ν•œ 볡합적인 μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€. 

 

κ°μ²΄λŠ” 0개 μ΄μƒμ˜ ν”„λ‘œνΌν‹°λ‘œ κ΅¬μ„±λœ 집합이며, ν”„λ‘œνΌν‹°λŠ” Key와 Value둜 κ΅¬μ„±λ©λ‹ˆλ‹€. ν”„λ‘œνΌν‹° 값이 ν•¨μˆ˜μΌ κ²½μš°μ—λŠ” 일반 ν•¨μˆ˜μ™€ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ λ©”μ†Œλ“œλΌκ³  λΆ€λ¦…λ‹ˆλ‹€. 

 

10.2 객체 λ¦¬ν„°λŸ΄μ— μ˜ν•œ 객체 생성


C++λ‚˜ μžλ°” 같은 클래슀 기반 객체지ν–₯ μ–Έμ–΄λŠ” 클래슀λ₯Ό 사전에 μ •μ˜ν•˜κ³  ν•„μš”ν•œ μ‹œμ μ— new μ—°μ‚°μžμ™€ ν•¨κ»˜ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜μ—¬ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” λ°©μ‹μœΌλ‘œ 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 

 

JSλŠ” 이와 달리 λ‹€μ–‘ν•œ 객체 생성 방법을 μ§€μ›ν•©λ‹ˆλ‹€. 

- 객체 λ¦¬ν„°λŸ΄

- Object μƒμ„±μž ν•¨μˆ˜

- μƒμ„±μž ν•¨μˆ˜

- Object.create λ©”μ„œλ“œ

- 클래슀 (ES6)

 

κ°€μž₯ 일반적이고 κ°„λ‹¨ν•œ 방법은 객체 λ¦¬ν„°λŸ΄μ„ μ΄μš©ν•œ λ°©λ²•μž…λ‹ˆλ‹€. μ€‘κ΄„ν˜Έ ({...}) 내에 0개 μ΄μƒμ˜ ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. 

 

10.3 ν”„λ‘œνΌν‹°


κ°μ²΄λŠ” ν”„λ‘œνΌν‹°μ˜ 집합이며, ν”„λ‘œνΌν‹°λŠ” 킀와 κ°’μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€. 

 

10.4 λ©”μ„œλ“œ 


λ©”μ„œλ“œλŠ” 객체에 λ¬Άμ—¬ μžˆλŠ” ν•¨μˆ˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 

var circle = {
	radius: 5, // ν”„λ‘œνΌν‹°
    
    getDiameter: function() { // λ©”μ„œλ“œ
    	return 2 * this.radius // thisλŠ” circle을 가리킨닀. 
    }
}

 

10.5 ν”„λ‘œνΌν‹° μ ‘κ·Ό


ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. 

- λ§ˆμΉ¨ν‘œ ν”„λ‘œνΌν‹° μ ‘κ·Ό μ—°μ‚°μž(.)λ₯Ό ν™œμš©ν•˜λŠ” λ§ˆμΉ¨ν‘œ ν‘œκΈ°λ²•

- λŒ€κ΄„ν˜Έ ν”„λ‘œνΌν‹° μ ‘κ·Ό μ—°μ‚°μž([...])λ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²• 

 

10.6 ν”„λ‘œνΌν‹° κ°’ κ°±μ‹  


이미 μ‘΄μž¬ν•˜λŠ” ν”„λ‘œνΌν‹°μ— 값을 ν• λ‹Ήν•˜λ©΄ ν”„λ‘œνΌν‹° 값이 κ°±μ‹ λ©λ‹ˆλ‹€. 

var person = {
	name: 'Lee'
}

preson.name = 'Kim';
console.log(person) // {name: "Kim")

 

10.7 ν”„λ‘œνΌν‹° 동적 생성


var person = {
	name: 'Lee'
}

preson.age = 23;
console.log(person) // {name: "Lee", age: 23)

 

10.8 ν”„λ‘œνΌν‹° μ‚­μ œ


delete μ—°μ‚°μžλ₯Ό ν™œμš©ν•˜λ©΄ λ©λ‹ˆλ‹€. 

var person = {
	name: 'Lee'
}

preson.age = 23;

delete person.age;
delete person.address; // μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°λ‘œ μ‚­μ œκ°€ λΆˆκ°€λŠ₯ν•˜λ―€λ‘œ μ—λŸ¬ λ°œμƒ X

console.log(person) // {name: "Lee")

 

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 κ³„μ‚°λœ ν”„λ‘œνΌν‹° 이름

const prefix = "prop";
let i = 0;

const obj = {
  [`${prefix}=${++i}`]: i,
  [`${prefix}=${++i}`]: i,
  [`${prefix}=${++i}`]: i,
};

console.log(obj())

 

10.9.3 λ©”μ„œλ“œ μΆ•μ•½ν‘œν˜„ 

const obj = {
  name: 'Lee',

  sayHi() {
    console.log('Hi!' + this.name);
  }
}

obj.sayHi();

Reference: λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive 

λ°˜μ‘ν˜•