λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Language/Javascript

[Javascript]μžλ°”μŠ€ν¬λ¦½νŠΈ 객체 μ™„λ²½ κ°€μ΄λ“œ: μ„ μ–Έ, μ‚¬μš©λ²•, 볡사

by YJ Dev 2024. 6. 22.
728x90
λ°˜μ‘ν˜•
SMALL

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체(Object)λŠ” 맀우 μ€‘μš”ν•œ κ°œλ…μž…λ‹ˆλ‹€. κ°μ²΄λŠ” λ‹€μ–‘ν•œ 데이터λ₯Ό ν•˜λ‚˜μ˜ ꡬ쑰둜 λ¬Άμ–΄ 관리할 수 있게 ν•΄ μ€λ‹ˆλ‹€. 이 κΈ€μ—μ„œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 객체에 λŒ€ν•œ κΈ°λ³Έ κ°œλ…λΆ€ν„° κ³ κΈ‰ ν™œμš©λ²•κΉŒμ§€λ₯Ό μžμ„Ένžˆ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

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


μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체와 λ°°μ—΄μ˜ μ£Όμš” 차이점은 데이터 ꡬ쑰에 μžˆμŠ΅λ‹ˆλ‹€. κ°μ²΄λŠ” ν‚€-κ°’ 쌍으둜 κ΅¬μ„±λ˜μ–΄ μžˆμ–΄μ„œ 각 데이터에 이름을 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. 반면, 배열은 μˆœμ„œκ°€ μžˆλŠ” 리슀트 ν˜•νƒœλ‘œ 데이터λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. κ°μ²΄λŠ” 각 데이터에 κ³ μœ ν•œ μ‹λ³„μž(ν‚€)λ₯Ό λΆ€μ—¬ν•˜κ³ , 배열은 μˆœμ„œμ— 따라 인덱슀둜 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
배열에 κ΄€ν•œ λ‚΄μš©μ€ μ•„λž˜ ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•΄ μ£Όμ„Έμš”πŸ‘€

""

[μžλ°”μŠ€ν¬λ¦½νŠΈ]JavaScript λ°°μ—΄ μ™„λ²½ κ°€μ΄λ“œ: λ°°μ—΄ λ©”μ†Œλ“œμ™€ ν™œμš©λ²• 총정리

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ°°μ—΄ ν•¨μˆ˜λŠ” 데이터 처리λ₯Ό 효율적으둜 ν•  수 있게 λ„μ™€μ£ΌλŠ” μ€‘μš”ν•œ λ„κ΅¬μž…λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” 자주 μ‚¬μš©λ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ λ°°μ—΄ ν•¨μˆ˜λ“€μ„ μ •λ¦¬ν•˜κ³ , 각각의 ν•¨μˆ˜κ°€ μ–΄λ–€

creativevista.tistory.com


01. 객체의 κΈ°λ³Έ κ°œλ…πŸ”

μžλ°”μŠ€ν¬λ¦½νŠΈ κ°μ²΄λŠ” 데이터λ₯Ό κ΅¬μ‘°ν™”ν•˜κ³  μ €μž₯ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” κΈ°λ³Έ λ‹¨μœ„μž…λ‹ˆλ‹€. κ°μ²΄λŠ” 속성(ν”„λ‘œνΌν‹°)κ³Ό λ©”μ„œλ“œ(ν•¨μˆ˜)둜 κ΅¬μ„±λ˜λ©°, 각각의 속성은 킀와 κ°’μ˜ 쌍으둜 이루어져 μžˆμŠ΅λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 객체의 κΈ°λ³Έ κ°œλ…μ„ μ΄ν•΄ν•˜λŠ” 것은 μ›Ή 개발의 ν•΅μ‹¬μž…λ‹ˆλ‹€.

객체의 μ •μ˜

κ°μ²΄λŠ” 킀와 κ°’μ˜ 쌍으둜 κ΅¬μ„±λœ 데이터 κ΅¬μ‘°μž…λ‹ˆλ‹€. ν‚€λŠ” λ¬Έμžμ—΄μ΄κ³ , 값은 μ–΄λ–€ νƒ€μž…μ΄λ“  κ°€λŠ₯ν•©λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 객체 λ¦¬ν„°λŸ΄ ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•˜μ—¬ μ‰½κ²Œ 객체λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

const person = {
  name: 'John',
  age: 30,
  city: 'New York'
};

μœ„μ˜ μ˜ˆμ œμ—μ„œ person κ°μ²΄λŠ” name, age, cityλΌλŠ” μ„Έ 가지 속성을 가지고 μžˆμŠ΅λ‹ˆλ‹€.


02. μžλ°”μŠ€ν¬λ¦½νŠΈ 객체 생성 및 μ‚¬μš©πŸ’‘

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 방법은 λ‹€μ–‘ν•©λ‹ˆλ‹€. 객체 λ¦¬ν„°λŸ΄, μƒμ„±μž ν•¨μˆ˜, ES6 클래슀 문법 등을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1. 객체 λ¦¬ν„°λŸ΄μ„ μ‚¬μš©ν•œ 객체 생성

객체 λ¦¬ν„°λŸ΄μ€ κ°€μž₯ κ°„λ‹¨ν•˜κ³  널리 μ‚¬μš©λ˜λŠ” λ°©λ²•μœΌλ‘œ, μ€‘κ΄„ν˜Έ {}λ₯Ό μ‚¬μš©ν•˜μ—¬ 객체λ₯Ό μƒμ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 방법은 객체λ₯Ό 직접 μ •μ˜ν•˜κ³  μ΄ˆκΈ°ν™”ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ: 객체 λ¦¬ν„°λŸ΄μ„ μ‚¬μš©ν•œ 객체 생성

// 객체 λ¦¬ν„°λŸ΄λ‘œ 객체 생성
let person = {
  name: "John",
  age: 30,
  greet: function() {
    console.log(`Hello, my name is ${this.name}.`);
  }
};

console.log(person); // { name: "John", age: 30, greet: [Function: greet] }

person.greet(); // Hello, my name is John.
"

νŠΉμ§•

  • μ€‘κ΄„ν˜Έ {} 내뢀에 key: value ν˜•νƒœλ‘œ ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
  • 각 ν”„λ‘œνΌν‹°λŠ” μ‰Όν‘œλ‘œ κ΅¬λΆ„λ©λ‹ˆλ‹€.
  • ν•¨μˆ˜(λ©”μ„œλ“œ)λ₯Ό 포함할 수 있으며, ν•¨μˆ˜λŠ” 일반 ν•¨μˆ˜ μ„ μ–Έ λ˜λŠ” ES6 ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 객체 λ¦¬ν„°λŸ΄μ„ μ‚¬μš©ν•˜λ©΄ 객체λ₯Ό κ°„νŽΈν•˜κ²Œ μ •μ˜ν•˜κ³  μ΄ˆκΈ°ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μΆ”κ°€ μ˜ˆμ‹œ: κ³„μ‚°λœ 속성 이름 (Computed Property Names)

κ³„μ‚°λœ 속성 이름(computed property names)을 μ‚¬μš©ν•˜λ©΄ 객체 λ¦¬ν„°λŸ΄ λ‚΄μ—μ„œ ν”„λ‘œνΌν‹° 이름을 λ™μ μœΌλ‘œ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

let propertyName = "age";

let person = {
  name: "John",
  [propertyName]: 30,
};

console.log(person); // { name: "John", age: 30 }

μ£Όμ˜μ‚¬ν•­

  • 객체 λ¦¬ν„°λŸ΄μ„ μ‚¬μš©ν•˜μ—¬ 객체λ₯Ό 생성할 λ•ŒλŠ” 단일 μΈμŠ€ν„΄μŠ€λ§Œ μƒμ„±λ©λ‹ˆλ‹€. 즉, ν΄λž˜μŠ€λ‚˜ μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” κ²ƒκ³ΌλŠ” λ‹€λ¦…λ‹ˆλ‹€.
  • 객체 λ¦¬ν„°λŸ΄μ€ μ½”λ“œμ˜ 가독성을 높이고 κ°„νŽΈν•˜κ²Œ 객체λ₯Ό μ •μ˜ν•  수 μžˆμ–΄ 맀우 μœ μš©ν•©λ‹ˆλ‹€.

객체 λ¦¬ν„°λŸ΄μ˜ ν™œμš©

  • λ‹¨μˆœν•œ 데이터 ꡬ쑰: κ°„λ‹¨ν•œ ꡬ쑰의 데이터λ₯Ό ν‘œν˜„ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.
  • 객체 μ΄ˆκΈ°ν™”: 초기 값이 μžˆλŠ” 객체λ₯Ό 효율적으둜 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • JSON 데이터: JSONκ³Ό μœ μ‚¬ν•œ ν˜•νƒœμ˜ 데이터λ₯Ό μžλ°”μŠ€ν¬λ¦½νŠΈ 객체둜 λ³€ν™˜ν•  λ•Œ ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

2. μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œ 객체 생성

μƒμ„±μž ν•¨μˆ˜λŠ” 객체λ₯Ό μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 일반 ν•¨μˆ˜μ™€ μœ μ‚¬ν•˜κ²Œ μ •μ˜λ˜μ§€λ§Œ, 일반적으둜 첫 κΈ€μžλ₯Ό λŒ€λ¬Έμžλ‘œ μ‹œμž‘ν•˜μ—¬ κ΅¬λ³„ν•©λ‹ˆλ‹€. μƒμ„±μž ν•¨μˆ˜λŠ” new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœλ˜μ–΄ 객체λ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ: μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œ 객체 생성

// μƒμ„±μž ν•¨μˆ˜ μ •μ˜
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// μΈμŠ€ν„΄μŠ€ 생성
let person1 = new Person("John", 30);
let person2 = new Person("Jane", 25);

console.log(person1); // Person { name: "John", age: 30 }
console.log(person2); // Person { name: "Jane", age: 25 }

νŠΉμ§•

  • μƒμ„±μž ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ this ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•˜κ³  μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.
  • new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ, μƒˆλ‘œμš΄ 객체가 μƒμ„±λ˜κ³  thisλŠ” 이 μƒˆλ‘œμš΄ 객체λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  • μƒμ„±μž ν•¨μˆ˜λŠ” 일반 ν•¨μˆ˜μ™€ λ™μΌν•˜κ²Œ λ©”μ„œλ“œλ„ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. ES6 클래슀 문법을 μ‚¬μš©ν•œ 객체 생성: new Object()

ES6μ—μ„œ λ„μž…λœ ν΄λž˜μŠ€λŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 클래슀 κ°œλ…κ³Ό μœ μ‚¬ν•˜κ²Œ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 문법적 섀탕(syntactic sugar)μž…λ‹ˆλ‹€. 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄ μƒμ„±μž ν•¨μˆ˜λ³΄λ‹€ 더 κ°„κ²°ν•˜κ³  λͺ…ν™•ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ: 클래슀λ₯Ό μ‚¬μš©ν•œ 객체 생성

// 클래슀 μ •μ˜
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  
  sayHello() {
    console.log(`Hello, my name is ${this.name}.`);
  }
}

// μΈμŠ€ν„΄μŠ€ 생성
let person1 = new Person("John", 30);
let person2 = new Person("Jane", 25);

console.log(person1); // Person { name: "John", age: 30 }
console.log(person2); // Person { name: "Jane", age: 25 }

person1.sayHello(); // Hello, my name is John.
person2.sayHello(); // Hello, my name is Jane.

νŠΉμ§•

  • ν΄λž˜μŠ€λŠ” class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜λ©λ‹ˆλ‹€.
  • constructor λ©”μ„œλ“œλŠ” 객체가 생성될 λ•Œ 호좜되며, 객체의 μ΄ˆκΈ°ν™”λ₯Ό λ‹΄λ‹Ήν•©λ‹ˆλ‹€.
  • 클래슀 λ‚΄λΆ€μ—μ„œ λ©”μ„œλ“œλŠ” ν•¨μˆ˜ μ„ μ–Έλ§ŒμœΌλ‘œ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν΄λž˜μŠ€λŠ” 상속을 μ§€μ›ν•˜λ―€λ‘œ, κΈ°μ‘΄ 클래슀λ₯Ό ν™•μž₯ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

선택 κΈ°μ€€

  1. 가독성과 μœ μ§€λ³΄μˆ˜μ„±: ν΄λž˜μŠ€λŠ” 일반적으둜 가독성이 λ†’κ³  μ§κ΄€μ μž…λ‹ˆλ‹€. μ½”λ“œλ₯Ό 읽고 μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€μ–΄μ€λ‹ˆλ‹€.
  2. 상속과 ν™•μž₯: ν΄λž˜μŠ€λŠ” 상속을 톡해 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€. 상속 관계가 ν•„μš”ν•œ 경우 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μœ λ¦¬ν•©λ‹ˆλ‹€.
  3. ES6 지원 μ—¬λΆ€: μ΅œμ‹  μžλ°”μŠ€ν¬λ¦½νŠΈ ν™˜κ²½μ—μ„œλŠ” 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€. λ˜ν•œ, ν΄λž˜μŠ€λŠ” λͺ¨λ“ˆν™”와 결합성을 더 잘 λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€.

03. 객체 ν”„λ‘œνΌν‹° μ ‘κ·Όκ³Ό μˆ˜μ •πŸ”§

객체의 속성에 μ ‘κ·Όν•˜λŠ” 방법은 두 가지가 μžˆμŠ΅λ‹ˆλ‹€: 점 ν‘œκΈ°λ²•(dot notation)κ³Ό λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•(bracket notation)μž…λ‹ˆλ‹€.

1. 점 ν‘œκΈ°λ²• (Dot Notation)

점 ν‘œκΈ°λ²•μ€ 객체의 속성λͺ…을 직접 점(.) 뒀에 λΆ™μ—¬μ„œ μ ‘κ·Όν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 이 방법은 속성λͺ…이 μœ νš¨ν•œ λ³€μˆ˜λͺ… κ·œμΉ™μ„ 따라야 ν•©λ‹ˆλ‹€.

let person = {
  name: "John",
  age: 30,
  address: {
    city: "New York",
    zipcode: "10001"
  }
};

console.log(person.name); // "John"
console.log(person.age); // 30
console.log(person.address.city); // "New York"
console.log(person.address.zipcode); // "10001"

2. λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²• (Bracket Notation)

λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•μ€ 객체의 속성λͺ…을 λ¬Έμžμ—΄ ν˜•νƒœλ‘œ λŒ€κ΄„ν˜Έ([]) μ•ˆμ— λ„£μ–΄ μ ‘κ·Όν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 이 방법을 μ‚¬μš©ν•˜λ©΄ 객체 속성λͺ…μœΌλ‘œ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 있고, 특수 λ¬Έμžλ‚˜ 곡백이 ν¬ν•¨λœ 속성λͺ…에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

let person = {
  name: "John",
  age: 30,
  "home address": "123 Main St"
};

let propertyName = "name";

console.log(person[propertyName]); // "John"
console.log(person["age"]); // 30
console.log(person["home address"]); // "123 Main St"

동적 속성 μ ‘κ·Ό

λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•μ€ 속성λͺ…을 λ™μ μœΌλ‘œ κ²°μ •ν•  수 μžˆλŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€. μœ„ μ˜ˆμ œμ—μ„œ propertyName λ³€μˆ˜μ— μ €μž₯된 속성λͺ…을 μ΄μš©ν•΄ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν”„λ‘œκ·Έλž˜λ°ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

let person = {
  name: "John",
  age: 30,
};

let propertyName = "age";

console.log(person[propertyName]); // 30

μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 속성에 μ ‘κ·Όν•  λ•Œ

점 ν‘œκΈ°λ²•μœΌλ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 속성에 μ ‘κ·Όν•˜λ©΄ undefinedκ°€ λ°˜ν™˜λ©λ‹ˆλ‹€. λ°˜λ©΄μ— λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•μ—μ„œλŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 속성에 μ ‘κ·Όν•˜λ©΄ undefinedκ°€ λ°˜ν™˜λ©λ‹ˆλ‹€.


객체의 속성 μˆ˜μ •, μΆ”κ°€, μ‚­μ œ

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체의 속성을 λ‹€λ£¨λŠ” 방법은 κ°„λ‹¨ν•˜μ§€λ§Œ μ€‘μš”ν•©λ‹ˆλ‹€. 객체의 속성을 μˆ˜μ •, μΆ”κ°€, μ‚­μ œν•  수 μžˆλŠ” 방법을 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

1. 속성 μˆ˜μ • (Property Modification)

κΈ°μ‘΄ 객체의 속성 값을 λ³€κ²½ν•˜λŠ” 것을 속성 μˆ˜μ •μ΄λΌκ³  ν•©λ‹ˆλ‹€. 점 ν‘œκΈ°λ²•κ³Ό λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²• λͺ¨λ‘ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.

let person = {
  name: "John",
  age: 30,
};

person.age = 31; // 점 ν‘œκΈ°λ²•
person["name"] = "Jane"; // λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•

console.log(person); // { name: "Jane", age: 31 }

2. 속성 μΆ”κ°€ (Property Addition)

객체에 μƒˆλ‘œμš΄ 속성을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이미 μ‘΄μž¬ν•˜λŠ” 속성에 λŒ€ν•΄μ„œλ„ λ™μΌν•œ λ°©λ²•μœΌλ‘œ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

let person = {
  name: "John",
  age: 30,
};

person.address = "123 Main St"; // 점 ν‘œκΈ°λ²•
person["email"] = "john@example.com"; // λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•

console.log(person); // { name: "John", age: 30, address: "123 Main St", email: "john@example.com" }

3. 속성 μ‚­μ œ (Property Deletion)

κ°μ²΄μ—μ„œ 속성을 μ‚­μ œν•  λ•ŒλŠ” delete ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 점 ν‘œκΈ°λ²•κ³Ό λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²• λͺ¨λ‘ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.

let person = {
  name: "John",
  age: 30,
  address: "123 Main St",
};

delete person.age; // 점 ν‘œκΈ°λ²•
delete person["address"]; // λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•

console.log(person); // { name: "John" }

μ£Όμ˜μ‚¬ν•­

  • delete ν‚€μ›Œλ“œλ‘œ μ‚­μ œλœ 속성은 객체 내뢀에 더 이상 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • μ‚­μ œλœ 속성을 μ ‘κ·Όν•˜λ©΄ undefinedκ°€ λ°˜ν™˜λ©λ‹ˆλ‹€.
  • λ°°μ—΄μ˜ μš”μ†Œ μ‚­μ œμ™€λŠ” λ‹€λ₯΄κ²Œ, 객체 속성 μ‚­μ œλŠ” λ©”λͺ¨λ¦¬μ—μ„œ ν•΄λ‹Ή 속성을 μ œκ±°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 객체의 λ‹€λ₯Έ μ°Έμ‘°μ—μ„œλŠ” μ—¬μ „νžˆ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

04. 객체의 νŠΉμ„±κ³Ό const μ„ μ–ΈπŸ“‘

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ ν•΄λ‹Ή λ³€μˆ˜λŠ” μž¬ν• λ‹Ήμ΄ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 객체의 경우, const둜 μ„ μ–Έν•œ 후에도 객체 λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‹°λŠ” λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 객체 μžμ²΄κ°€ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλœ μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” 값이 const둜 μ„ μ–Έλ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 객체 자체의 λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ λ³€ν•˜μ§€ μ•ŠμœΌλ©°, κ·Έ μ•ˆμ˜ λ‚΄μš©(ν”„λ‘œνΌν‹°)만 λ³€κ²½ κ°€λŠ₯ν•©λ‹ˆλ‹€.

const icecream = {
  flavor: "민트 μ΄ˆμ½”",
  color: "민트",
};

console.log(icecream); // { flavor: "민트 μ΄ˆμ½”", color: "민트" }

// 객체의 ν”„λ‘œνΌν‹°λŠ” λ³€κ²½ κ°€λŠ₯
icecream.color = "μ΄ˆμ½”";
console.log(icecream); // { flavor: "민트 μ΄ˆμ½”", color: "μ΄ˆμ½”" }

// 객체 자체λ₯Ό μž¬ν• λ‹Ήν•˜λ €κ³  ν•˜λ©΄ 였λ₯˜ λ°œμƒ
// icecream = {}; // TypeError: Assignment to constant variable.

// 객체의 μƒˆλ‘œμš΄ ν”„λ‘œνΌν‹° 좔가도 κ°€λŠ₯
icecream.newFlavor = "바닐라";
console.log(icecream); // { flavor: "민트 μ΄ˆμ½”", color: "μ΄ˆμ½”", newFlavor: "바닐라" }

μœ„ μ˜ˆμ œμ—μ„œ λ³Ό 수 μžˆλ“―μ΄, icecream κ°μ²΄λŠ” const둜 μ„ μ–Έλ˜μ—ˆμ§€λ§Œ, 객체 λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‹°λ“€μ€ 자유둭게 μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 객체 자체λ₯Ό λ‹€λ₯Έ 객체둜 λ³€κ²½ν•˜λ €κ³  ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λ™μž‘μ€ 객체가 기본적으둜 μ°Έμ‘° νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ— λ°œμƒν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 객체가 ν• λ‹Ήλœ λ³€μˆ˜λŠ” 객체의 λ©”λͺ¨λ¦¬ μœ„μΉ˜(μ°Έμ‘°)λ₯Ό 가리킀며, constλŠ” 이 μ°Έμ‘° 값을 λ³€κ²½ν•  수 μ—†κ²Œ λ§Œλ“­λ‹ˆλ‹€. λ”°λΌμ„œ 객체의 λ‚΄μš©(ν”„λ‘œνΌν‹°)은 μˆ˜μ •ν•  수 μžˆμ§€λ§Œ, λ‹€λ₯Έ 객체둜의 μ™„μ „ν•œ μž¬ν• λ‹Ήμ€ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

이 νŠΉμ„±μ„ μ΄ν•΄ν•˜λ©΄μ„œ const둜 μ„ μ–Έν•œ 객체λ₯Ό μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•˜κ³ , 객체 λ‚΄λΆ€μ˜ 변경이 ν•„μš”ν•œ κ²½μš°μ—λŠ” ν”„λ‘œνΌν‹° μˆ˜μ •μ„ ν™œμš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.


객체의 킀와 κ°’ μΆ”μΆœπŸ”

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체의 킀와 값은 λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ μΆ”μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. 주둜 Object.keys(), Object.values(), Object.entries() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 객체λ₯Ό μ‘°μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1. Object.keys(): 객체의 ν‚€(key) μΆ”μΆœ

Object.keys() λ©”μ„œλ“œλŠ” 객체의 λͺ¨λ“  ν‚€λ₯Ό λ°°μ—΄λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

let person = {
  name: "John",
  age: 30,
  city: "New York",
};

let keys = Object.keys(person);

console.log(keys); // ["name", "age", "city"]

2. Object.values(): 객체의 κ°’(value) μΆ”μΆœ

Object.values() λ©”μ„œλ“œλŠ” 객체의 λͺ¨λ“  값듀을 λ°°μ—΄λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

let person = {
  name: "John",
  age: 30,
  city: "New York",
};

let values = Object.values(person);

console.log(values); // ["John", 30, "New York"]

3. Object.entries(): ν‚€(key)와 κ°’(value)의 쌍 μΆ”μΆœ

Object.entries() λ©”μ„œλ“œλŠ” 객체의 각 킀와 κ°’μ˜ μŒμ„ [key, value] ν˜•νƒœμ˜ λ°°μ—΄λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

let person = {
  name: "John",
  age: 30,
  city: "New York",
};

let entries = Object.entries(person);

console.log(entries);
// [
//   ["name", "John"],
//   ["age", 30],
//   ["city", "New York"]
// ]

μ£Όμ˜μ‚¬ν•­

  • Object.keys(), Object.values(), Object.entries() λ©”μ„œλ“œλŠ” λͺ¨λ‘ 객체의 μ—΄κ±° κ°€λŠ₯ν•œ(enumerable) μ†μ„±λ§Œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • 상속받은 ν”„λ‘œνΌν‹°λ‚˜ μ—΄κ±°ν•  수 μ—†λŠ”(non-enumerable) ν”„λ‘œνΌν‹°λŠ” ν¬ν•¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ°˜ν™˜λœ λ°°μ—΄μ˜ μˆœμ„œλŠ” 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•œ μˆœμ„œμ™€ λ™μΌν•©λ‹ˆλ‹€.

객체 볡사와 μ°Έμ‘°πŸ”—

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κ°μ²΄λŠ” μ°Έμ‘° νƒ€μž…(reference type)μ΄λ―€λ‘œ λ³€μˆ˜μ— 할당될 λ•Œ 객체 μžμ²΄κ°€ λ³΅μ‚¬λ˜λŠ” 것이 μ•„λ‹ˆλΌ 객체의 μ°Έμ‘°(λ©”λͺ¨λ¦¬ μ£Όμ†Œ)κ°€ λ³΅μ‚¬λ©λ‹ˆλ‹€. λ”°λΌμ„œ 객체λ₯Ό λ³΅μ‚¬ν•˜λ©΄ λ³΅μ‚¬λœ λ³€μˆ˜μ™€ 원본 λ³€μˆ˜λŠ” 같은 객체λ₯Ό μ°Έμ‘°ν•˜κ²Œ λ©λ‹ˆλ‹€. 이 κ°œλ…μ„ μ΄ν•΄ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ 방법을 μ‚΄νŽ΄λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 객체 볡사와 μ°Έμ‘°λŠ” λ©”λͺ¨λ¦¬ 관리와 객체의 μƒνƒœ 변경에 μ€‘μš”ν•œ 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€.

객체의 참쑰

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κ°μ²΄λŠ” λ³€μˆ˜μ— 할당될 λ•Œ 객체 μžμ²΄κ°€ λ³΅μ‚¬λ˜λŠ” 것이 μ•„λ‹ˆλΌ 객체의 μ°Έμ‘°(λ©”λͺ¨λ¦¬ μ£Όμ†Œ)κ°€ λ³΅μ‚¬λ©λ‹ˆλ‹€. λ”°λΌμ„œ ν•œ λ³€μˆ˜λ₯Ό 톡해 객체λ₯Ό λ³€κ²½ν•˜λ©΄ λ‹€λ₯Έ λ³€μˆ˜μ—μ„œλ„ λ³€κ²½λœ 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

let originalObj = {
  name: "John",
};

let cloneObj = originalObj; // μ°Έμ‘° 볡사

cloneObj.name = "Jane";

console.log(originalObj.name); // "Jane"
console.log(cloneObj.name); // "Jane"

μœ„μ˜ μ˜ˆμ‹œμ—μ„œ originalObj와 cloneObjλŠ” λ™μΌν•œ 객체λ₯Ό μ°Έμ‘°ν•˜λ―€λ‘œ ν•˜λ‚˜μ˜ 객체λ₯Ό μˆ˜μ •ν•˜λ©΄ λ‹€λ₯Έ λ³€μˆ˜μ—μ„œλ„ μˆ˜μ •λœ λ‚΄μš©μ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체λ₯Ό λ³΅μ‚¬ν•˜κ³  μ°Έμ‘°ν•˜λŠ” 방법은 객체의 ꡬ쑰와 λ³΅μž‘μ„±μ— 따라 λ‹€λ¦…λ‹ˆλ‹€. 얕은 λ³΅μ‚¬λŠ” 객체의 μ΅œμƒμœ„ 레벨 ν”„λ‘œνΌν‹°λ“€λ§Œ λ³΅μ‚¬ν•˜λ©° λ‚΄λΆ€ κ°μ²΄λŠ” μ°Έμ‘°λ₯Ό μœ μ§€ν•©λ‹ˆλ‹€. κΉŠμ€ λ³΅μ‚¬λŠ” λ‚΄λΆ€ κ΅¬μ‘°κΉŒμ§€ μž¬κ·€μ μœΌλ‘œ λ³΅μ‚¬ν•˜μ—¬ μ™„μ „νžˆ 독립적인 μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“­λ‹ˆλ‹€.


1. 얕은 볡사 (Shallow Copy)

객체의 μ΅œμƒμœ„ μ†μ„±λ“€λ§Œ λ³΅μ‚¬λ˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. λ‚΄λΆ€ κ°μ²΄λ‚˜ 배열은 참쑰둜 λ³΅μ‚¬λ©λ‹ˆλ‹€.

방법 1: Spread μ—°μ‚°μž μ‚¬μš©

let originalObj = {
  name: "John",
  age: 30,
  address: {
    city: "New York",
    zipcode: "10001"
  }
};

// Spread μ—°μ‚°μžλ₯Ό μ΄μš©ν•œ 얕은 볡사
let cloneObj = { ...originalObj };

console.log(cloneObj === originalObj); // false
console.log(cloneObj); // { name: "John", age: 30, address: { city: "New York", zipcode: "10001" } }

// λ‚΄λΆ€ κ°μ²΄λŠ” λ™μΌν•œ 객체λ₯Ό μ°Έμ‘°
console.log(cloneObj.address === originalObj.address); // true

방법 2: Object.assign() λ©”μ„œλ“œ μ‚¬μš©

let originalObj = {
  name: "John",
  age: 30,
  address: {
    city: "New York",
    zipcode: "10001"
  }
};

// Object.assign() λ©”μ„œλ“œλ₯Ό μ΄μš©ν•œ 얕은 볡사
let cloneObj = Object.assign({}, originalObj);

console.log(cloneObj === originalObj); // false
console.log(cloneObj); // { name: "John", age: 30, address: { city: "New York", zipcode: "10001" } }

// λ‚΄λΆ€ κ°μ²΄λŠ” λ™μΌν•œ 객체λ₯Ό μ°Έμ‘°
console.log(cloneObj.address === originalObj.address); // true

2. κΉŠμ€ 볡사 (Deep Copy)

κΉŠμ€ λ³΅μ‚¬λŠ” 객체의 λͺ¨λ“  ꡬ쑰λ₯Ό μž¬κ·€μ μœΌλ‘œ λ³΅μ‚¬ν•˜μ—¬ μ™„μ „νžˆ μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“œλŠ” λ°©μ‹μž…λ‹ˆλ‹€. 객체의 λͺ¨λ“  λ ˆλ²¨μ—μ„œ 볡사가 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

방법 1: μž¬κ·€μ  ν•¨μˆ˜ μ‚¬μš©

function deepCopy(obj) {
  let result = Array.isArray(obj) ? [] : {};
  
  for (let key in obj) {
    if (typeof obj[key] === 'object' && obj[key] !== null) {
      result[key] = deepCopy(obj[key]); // μž¬κ·€μ μœΌλ‘œ λ‚΄λΆ€ 객체 볡사
    } else {
      result[key] = obj[key]; // κΈ°λ³Έ νƒ€μž… κ°’ 볡사
    }
  }
  
  return result;
}

let obj = {
  a: 1,
  b: {
    c: 2
  }
};

let deepClone = deepCopy(obj);

console.log(deepClone); // { a: 1, b: { c: 2 } }

console.log(obj === deepClone); // false
console.log(obj.b === deepClone.b); // false (λ‚΄λΆ€ 객체도 μƒˆλ‘œμš΄ 객체둜 볡사됨)

방법 2: μ™ΈλΆ€ 라이브러리 μ‚¬μš© (lodash의 _.cloneDeep() μ˜ˆμ‹œ)

const _ = require('lodash');

let obj = {
  a: 1,
  b: {
    c: 2
  }
};

let deepClone = _.cloneDeep(obj);

console.log(deepClone); // { a: 1, b: { c: 2 } }

console.log(obj === deepClone); // false
console.log(obj.b === deepClone.b); // false (λ‚΄λΆ€ 객체도 μƒˆλ‘œμš΄ 객체둜 볡사됨)

μ£Όμ˜μ‚¬ν•­

  • 얕은 λ³΅μ‚¬λŠ” 객체의 λ‚΄λΆ€ κ°μ²΄λŠ” μ°Έμ‘°λ₯Ό κ³΅μœ ν•˜μ§€λ§Œ, κΉŠμ€ λ³΅μ‚¬λŠ” λͺ¨λ“  λ‚΄λΆ€ κ°μ²΄κΉŒμ§€ μƒˆλ‘œμš΄ 볡사본을 λ§Œλ“­λ‹ˆλ‹€.
  • κΉŠμ€ λ³΅μ‚¬λŠ” μž¬κ·€μ μœΌλ‘œ λͺ¨λ“  속성을 λ³΅μ‚¬ν•˜κΈ° λ•Œλ¬Έμ— μ„±λŠ₯적인 μΈ‘λ©΄μ—μ„œ λΉ„μš©μ΄ 많이 λ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 객체가 λ³΅μž‘ν•˜κ³  μ€‘μ²©λœ κ²½μš°μ—λŠ” κΉŠμ€ 볡사λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ•ˆμ „ν•©λ‹ˆλ‹€.

객체λ₯Ό 볡사할 λ•ŒλŠ” λ³΅μ‚¬μ˜ κΉŠμ΄μ™€ μ„±λŠ₯ μš”κ΅¬ 사항을 κ³ λ €ν•˜μ—¬ μ μ ˆν•œ 방법을 μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. 얕은 λ³΅μ‚¬λŠ” κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆμ§€λ§Œ, λ‚΄λΆ€ 객체의 변경이 원본에도 영ν–₯을 쀄 수 μžˆμŠ΅λ‹ˆλ‹€. κΉŠμ€ λ³΅μ‚¬λŠ” λͺ¨λ“  ꡬ쑰λ₯Ό μ™„λ²½ν•˜κ²Œ λ³΅μ œν•˜μ§€λ§Œ, 처리 μ‹œκ°„μ΄ κΈΈμ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.


핡심 λ‚΄μš©πŸ‘€

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

728x90
λ°˜μ‘ν˜•
LIST