/
πŸ“™

JS Object

JavaScript
Table of contents

μžλ°”μŠ€ν¬λ¦½νŠΈ 객체

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 객체 기반의 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ primitive data type을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€λ“€(function, array, regex λ“±)은 λͺ¨λ‘ object typeμœΌλ‘œμ„œ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 이루고 μžˆλ‹€.

  • reference type이라고 λΆ€λ₯΄κΈ°λ„ ν•œλ‹€.
  • mutable value이닀.
  • λ‹€μ–‘ν•œ νƒ€μž…μ˜ 값듀을 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ κ΅¬μ„±ν•œ 볡합적 자료 ꡬ쑰이닀.
  • 일반 κ°μ²΄λŠ” lengthλ₯Ό 가진 μœ μ‚¬ 배열객체(array-like objects)이닀.

객체의 ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” [] μ—°μ‚°μžλŠ” μ‹λ³„μž(μ‹λ³„μžλŠ” ν”„λ‘œκ·Έλž˜λ¨Έκ°€ ν”„λ‘œκ·Έλž¨ 상에 직접 μ½”λ”©ν•˜μ—¬ λ„£κΈ° λ•Œλ¬Έμ— 정적이닀) λŒ€μ‹ , ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œκ°„μ— λ™μ μœΌλ‘œ μ–Όλ§ˆλ“ μ§€ λ³€κ²½ν•  수 μžˆλŠ” λ¬Έμžμ—΄μ„ μ‚¬μš©ν•˜μ—¬ ν”„λ‘œνΌν‹°μ˜ 이름을 ν‘œν˜„ν•  μˆ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ 객체λ₯Ό μ‚¬μš©ν•  λ•Œ 이λ₯Ό μ—°κ΄€ λ°°μ—΄(associative array)이라 λΆ€λ¦…λ‹ˆλ‹€.

μ—°κ΄€ 배열은 λ™μ μœΌλ‘œ μž„μ˜μ˜ κ°’κ³Ό μž„μ˜μ˜ λ¬Έμžμ—΄μ„ 연관지어 지정할 수 μžˆλŠ” μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.

이와 κ΄€λ ¨ν•˜μ—¬ 'λŒ€μ‘μ‹œν‚€λ‹€(map)'λΌλŠ” μš©μ–΄λ„ 자주 μ‚¬μš©ν•©λ‹ˆλ‹€.

즉, "μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ¬Έμžμ—΄(ν”„λ‘œνΌν‹°μ˜ 이름)을 μž„μ˜μ˜ κ°’μœΌλ‘œ λŒ€μ‘μ‹œν‚¨λ‹€"와 같이 ν‘œν˜„ν•©λ‹ˆλ‹€.

좜처: μ—°κ΄€ λ°°μ—΄λ‘œμ„œμ˜ 객체 (=μœ μ‚¬λ°°μ—΄ 객체)

객체 생성 방법

  • 객체 λ¦¬ν„°λŸ΄
  • Object μƒμ„±μž ν•¨μˆ˜
  • μƒμ„±μž ν•¨μˆ˜
  • Object.create λ©”μ†Œλ“œ
  • 클래슀 (ES6)

κ°μ²΄λŠ” ν”„λ‘œνΌν‹°μ˜ 집합

κ°μ²΄λŠ” 0개 μ΄μƒμ˜ ν”„λ‘œνΌν‹°μ˜ 집합이며 ν”„λ‘œνΌν‚€λŠ” key와 value둜 κ΅¬μ„±λœλ‹€.

javascript
var object = {
key: 'value'
};

ν”„λ‘œνΌν‹° ν‚€

ν”„λ‘œνΌν‹° ν‚€λŠ” ν”„λ‘œνΌν‹° λ°Έλ₯˜μ— μ ‘κ·Όν•  수 μžˆλŠ” μ‹λ³„μž 역할을 ν•˜λ©° 빈 λ¬Έμžμ—΄μ„ ν¬ν•¨ν•˜λŠ” λͺ¨λ“  λ¬Έμžμ—΄ λ˜λŠ” symbol 값을 μ‚¬μš©ν•  수 μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹λ³„μž 넀이밍 κ·œμΉ™μ„ μ€€μˆ˜ν•΄μ•Ό ν•˜λ©° λ”°λ₯΄κΈ° νž˜λ“  경우 λ”°μ˜΄ν‘œλ‘œ 감싸 μ‚¬μš©ν•˜μ—¬μ•Ό ν•œλ‹€.

javascript
var obj = {
propertyKey: 'property value',
'property-key': 'property value'
};

μ„Έ 번째 라인의 'property-key'에 κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ -λ₯Ό μ—°μ‚°μžλ‘œ ν•΄μ„ν•œλ‹€.

이것도 ν‚€λ‘œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€κ³ ?

빈 λ¬Έμžμ—΄λ„ ν”„λ‘œνΌν‹° ν‚€λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ ν‚€λ‘œμ„œ μ˜λ―Έκ°€ μ—†μœΌλ―€λ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€.

javascript
var obj = {
'': ''
};

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ‚¬μš©ν•˜λŠ” keyword(μ˜ˆμ•½μ–΄)도 μ‚¬μš© κ°€λŠ₯ν•˜λ‹€. ν•˜μ§€λ§Œ μ˜ˆμƒμΉ˜ λͺ»ν•œ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¬ 여지가 μžˆμœΌλ‹ˆ μ‚¬μš©ν•˜μ§€ 말자

javascript
var obj = {
for: 4,
return: 3
};

숫자만 μ‚¬μš©ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€. μ΄λŠ” 암묡적 νƒ€μž… λ³€ν™˜μ„ 톡해 λ¬Έμžμ—΄λ‘œ ν˜• λ³€ν™˜μ΄ 되기 λ•Œλ¬Έμ΄λ‹€.

javascript
var obj = {
0: 1,
1: 2,
2: 3
};

ν”„λ‘œνΌν‹° λ°Έλ₯˜

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” λͺ¨λ“  값은 ν”„λ‘œνΌν‹° 값이 될 수 μžˆλ‹€.

λ©”μ„œλ“œ(method)

ν”„λ‘œνΌν‹° 값이 ν•¨μˆ˜μΌ 경우 일반 ν•¨μˆ˜μ™€ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ λ©”μ„œλ“œλΌ λΆ€λ₯Έλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 일급 객체이기 λ•Œλ¬Έμ— κ°’μœΌλ‘œ 평가 될 수 있기 λ•Œλ¬Έμ— ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

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

ν”„λ‘œνΌν‹° λ°Έλ₯˜μ— μ ‘κ·Όν•˜λŠ” 방법은 두 가지가 μžˆλ‹€.

  • λ§ˆμΉ¨ν‘œ ν‘œκΈ°λ²•(dot notation)
    • λ§ˆμΉ¨ν‘œ ν‘œκΈ°λ²•μœΌλ‘œ μ ‘κ·Όν•˜λ €λ©΄ ν”„λ‘œνΌν‹° 킀에 곡백, μ—°μ‚°μž, 특수 λ¬Έμžκ°€ μ—†μ–΄μ•Ό ν•œλ‹€.
  • λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•(bracket notation)
    • λŒ€κ΄„ν˜Έ μ—°μ‚°μž λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‚€ ν‚€λŠ” λ°˜λ“œμ‹œ λ”°μ˜΄ν‘œλ‘œ 감싸야 ν•œλ‹€.
javascript
var obj = {
propertyKey: '1st'
};
// λ§ˆμΉ¨ν‘œ ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•œ ν”„λ‘œνΌν‹° μ ‘κ·Ό
console.log(obj.propertyKey); // 1st
// λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•œ ν”„λ‘œνΌν‹° μ ‘κ·Ό
console.log(obj['propertyKey']); // 1st

ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•  λ•Œ μ£Όμ˜ν•΄μ•Ό ν•˜λŠ” 것 λ“€

λ§ˆμΉ¨ν‘œ ν‘œκΈ°λ²•μœΌλ‘œ μ ‘κ·Όν•˜λ €λ©΄ ν”„λ‘œνΌν‹° 킀에 곡백, μ—°μ‚°μž, 특수 λ¬Έμžκ°€ μ—†μ–΄μ•Ό ν•œλ‹€.

javascript
var obj = {
'property-key': '2nd'
};
console.log(obj.property-Key);
// λΈŒλΌμš°μ € ν™˜κ²½: NaN
// Node.js ν™˜κ²½: ReferenceError: Key is not defined

λŒ€κ΄„ν˜Έ μ—°μ‚°μž λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‚€ ν‚€λŠ” λ°˜λ“œμ‹œ λ”°μ˜΄ν‘œλ‘œ 감싸야 ν•œλ‹€.

javascript
var obj = {
'property-key': '2nd'
};
console.log(obj[property-Key]); // ReferenceError: property is not defined
console.log(obj['property-Key']); // 2nd

ν”„λ‘œνΌν‹° ν‚€κ°€ 숫자만으둜 이루어진 λ¬Έμžμ—΄μΈ 경우 λ”°μ˜΄ν‘œλ₯Ό μƒλž΅ κ°€λŠ₯ν•˜λ‹€.

javascript
var obj = {
1: 1,
2: 2
};
console.log(obj[1]); // 1
console.log(obj['1']); // 1
console.log(obj[2]); // 2
console.log(obj['2']); // 2

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

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

javascript
var obj = {
'propertyKey': '1st'
};
obj.propertyKey = '2nd';
console.log(obj); // {propertyKey: "2nd"}

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

μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°μ— 값을 ν• λ‹Ήν•˜λ©΄ ν”„λ‘œνΌν‹°κ°€ λ™μ μœΌλ‘œ μƒμ„±λ˜μ–΄ μΆ”κ°€λ˜κ³  ν”„λ‘œνΌν‹° 값이 ν• λ‹Ήλœλ‹€.

javascript
var obj = {
'property-key': '2nd'
};
obj.propertyKey = '1st';
console.log(obj); // {'property-key': '2nd', propertyKey: "1st"}

ES6μ—μ„œ μΆ”κ°€λœ κΈ°λŠ₯

ES6μ—μ„œλŠ” λ”μš± κ°„νŽΈν•˜κ³  ν‘œν˜„λ ₯ μžˆλŠ” 객체 λ¦¬ν„°λŸ΄μ˜ ν™•μž₯ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

단좕 ν”„λ‘œνΌν‹°

ES6μ—μ„œλŠ” ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 λ³€μˆ˜ 이름과 ν”„λ‘œνΌν‹° ν‚€κ°€ λ™μΌν•œ 이름일 λ•Œ, ν”„λ‘œνΌν‹° ν‚€λ₯Ό μƒλž΅(property shorthand)ν•  수 μžˆλ‹€.

javascript
let x = 1, y = 2;
// ν”„λ‘œνΌν‹° μΆ•μ•½ ν‘œν˜„
const obj = {
x, // x: x 와 κ°™λ‹€
y, // y: y 와 κ°™λ‹€
};
console.log(obj); // {x: 1, y: 2}

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

ES6μ—μ„œλŠ” λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•Œ, function ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•œ μΆ•μ•½ ν‘œν˜„μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

javascript
const obj = {
name: 'Sop',
// λ©”μ„œλ“œ μΆ•μ•½ ν‘œν˜„
sayHi() {
console.log('Hi! ' + this.name);
}
};
obj.sayHi(); // Hi! Sop

λ©”μ„œλ“œ μΆ•μ•½ ν‘œν˜„μœΌλ‘œ μ •μ˜ν•œ λ©”μ„œλ“œλŠ” ν”„λ‘œνΌν‹°μ— ν• λ‹Ήν•œ ν•¨μˆ˜μ™€ λ‹€λ₯΄κ²Œ λ™μž‘ν•œλ‹€.

κ³„μ‚°λœ ν”„λ‘œνΌν‹°

ES6μ—μ„œλŠ” 객체λ₯Ό λ§Œλ“€ λ•Œ 객체 λ¦¬ν„°λŸ΄ μ•ˆμ˜ ν”„λ‘œνΌν‹° ν‚€κ°€ λŒ€κ΄„ν˜Έλ‘œ λ‘˜λŸ¬μ‹Έμ—¬ μžˆλŠ” 경우, 이λ₯Ό κ³„μ‚°λœ ν”„λ‘œνΌν‹°(computed property) 라고 λΆ€λ₯Έλ‹€.

javascript
let fruit = "apple";
let bag = {
[fruit]: '사과',
};
console.log(bag.apple);

객체 λ¦¬ν„°λŸ΄ λ‚΄λΆ€μ—μ„œ ν”„λ‘œνΌν‹° ν‚€ 동적 생성

μœ„λ₯Ό ν™œμš©ν•˜λ©΄ 객체 λ¦¬ν„°λŸ΄ λ‚΄λΆ€μ—μ„œλ„ κ³„μ‚°λœ ν”„λ‘œνΌν‹° μ΄λ¦„μœΌλ‘œ ν”„λ‘œνΌν‹° ν‚€λ₯Ό 동적 생성할 수 μžˆλ‹€.

javascript
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}

ν€΄μ¦ˆ

Q1. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 클래슀 없이 객체λ₯Ό 생성할 수 μ—†λ‹€. ( O / X )

  • A.
    X, μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 클래슀 없이 객체 생성이 κ°€λŠ₯ν•˜λ‹€.

Q2. λΈŒλΌμš°μ € ν™˜κ²½κ³Ό node.js의 각각 μ „μ—­ κ°μ²΄λŠ” 무엇인가

  • A.
    window, global

Q3. window μ „μ—­ 객체가 가지고 μžˆλŠ” μ „μ—­ 객체 ν”„λ‘œνΌν‹° 3가지 이상

  • A.
    Object, String, Number, Boolean, Function, Array, RegExp, Date, Math, Promise
logo
Things I've Learned