Responsive Advertisement

JavaScript Object Properties: ์†์„ฑ ์ •์˜์™€ ํ™œ์šฉ ๋ฐฉ๋ฒ•

JavaScript์—์„œ ๊ฐ์ฒด(Object)๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘์š”ํ•œ ๊ตฌ์กฐ์ด๋ฉฐ, ๊ฐ์ฒด์˜ ์†์„ฑ(Properties)์€ ๊ฐ์ฒด ๋‚ด๋ถ€์— ์ €์žฅ๋œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด ์†์„ฑ์€ ํ‚ค-๊ฐ’(Key-Value) ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” JavaScript ๊ฐ์ฒด ์†์„ฑ์— ๋Œ€ํ•œ ๊ฐœ๋…, ์†์„ฑ ์ •์˜ ๋ฐฉ๋ฒ•, ์ ‘๊ทผ ๋ฐ ์ˆ˜์ • ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃจ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ์ฒด ์†์„ฑ(Property) ์ •์˜

๊ฐ์ฒด ์†์„ฑ์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, key์™€ value์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ key๋Š” ๋ฌธ์ž์—ด์ด๋‚˜ Symbol์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, value๋Š” ๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ถˆ๋ฆฌ์–ธ, ํ•จ์ˆ˜ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let car = {
    brand: "Tesla",
    model: "Model 3",
    year: 2021
};

์œ„ ์˜ˆ์ œ์—์„œ ๊ฐ์ฒด car๋Š” brand, model, year๋ผ๋Š” ์„ธ ๊ฐ€์ง€ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์†์„ฑ์€ ํ•ด๋‹น ์ž๋™์ฐจ์˜ ๋ธŒ๋žœ๋“œ, ๋ชจ๋ธ, ์ œ์กฐ ์—ฐ๋„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๊ฐ์ฒด ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ธฐ

๊ฐ์ฒด์˜ ์†์„ฑ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: ์  ํ‘œ๊ธฐ๋ฒ•๊ณผ ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

์  ํ‘œ๊ธฐ๋ฒ•

์  ํ‘œ๊ธฐ๋ฒ•์€ ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ, ๊ฐ์ฒด์˜ ํŠน์ • ์†์„ฑ์— ์ ‘๊ทผํ•  ๋•Œ ๊ฐ์ฒด๋ช….์†์„ฑ๋ช…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

console.log(car.brand);   // ๊ฒฐ๊ณผ: "Tesla"
console.log(car.year);    // ๊ฒฐ๊ณผ: 2021

์œ„ ์ฝ”๋“œ์—์„œ๋Š” car ๊ฐ์ฒด์˜ brand์™€ year ์†์„ฑ์— ์ ‘๊ทผํ•˜์—ฌ ๊ทธ ๊ฐ’์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•

๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์€ ์†์„ฑ ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ์ง€์ •ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ณ€์ˆ˜์— ์†์„ฑ๋ช…์„ ์ €์žฅํ•ด ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

console.log(car["model"]);  // ๊ฒฐ๊ณผ: "Model 3"

let property = "year";
console.log(car[property]);   // ๊ฒฐ๊ณผ: 2021

์œ„ ์˜ˆ์ œ์—์„œ car["model"]๋กœ ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ณ , ๋ณ€์ˆ˜ property๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ year ์†์„ฑ์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด ์†์„ฑ ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ •

JavaScript์—์„œ๋Š” ๊ฐ์ฒด์— ๋™์ ์œผ๋กœ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์†์„ฑ์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์  ํ‘œ๊ธฐ๋ฒ• ๋˜๋Š” ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ด ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ ์ถ”๊ฐ€

car.color = "red";  // ์ƒˆ๋กœ์šด ์†์„ฑ ์ถ”๊ฐ€
console.log(car.color);  // ๊ฒฐ๊ณผ: "red"

์œ„ ์ฝ”๋“œ์—์„œ๋Š” car ๊ฐ์ฒด์— color๋ผ๋Š” ์ƒˆ๋กœ์šด ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐ’์„ "red"๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ ๊ฐ’ ์ˆ˜์ •

car.year = 2022;  // ๊ธฐ์กด ์†์„ฑ ์ˆ˜์ •
console.log(car.year);  // ๊ฒฐ๊ณผ: 2022

๊ธฐ์กด ์†์„ฑ year์˜ ๊ฐ’์„ 2022๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด ์†์„ฑ์€ ์–ธ์ œ๋“ ์ง€ ์ด๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์ฒด ์†์„ฑ ์‚ญ์ œ

๊ฐ์ฒด์˜ ํŠน์ • ์†์„ฑ์„ ์‚ญ์ œํ•˜๋ ค๋ฉด delete ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์†์„ฑ์„ ์‚ญ์ œํ•˜๋ฉด ํ•ด๋‹น ์†์„ฑ์€ ๋” ์ด์ƒ ๊ฐ์ฒด์— ์กด์žฌํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

delete car.model;  // model ์†์„ฑ ์‚ญ์ œ
console.log(car.model);  // ๊ฒฐ๊ณผ: undefined

model ์†์„ฑ์„ ์‚ญ์ œํ•œ ํ›„์— ํ•ด๋‹น ์†์„ฑ์— ์ ‘๊ทผํ•˜๋ฉด undefined๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์†์„ฑ์˜ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ

๊ฐ์ฒด์—์„œ ํŠน์ • ์†์„ฑ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด in ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

console.log("brand" in car);  // ๊ฒฐ๊ณผ: true
console.log("model" in car);  // ๊ฒฐ๊ณผ: false

์œ„ ์ฝ”๋“œ์—์„œ "brand" ์†์„ฑ์€ ๊ฐ์ฒด์— ์กด์žฌํ•˜์ง€๋งŒ, ์•ž์„œ ์‚ญ์ œ๋œ "model" ์†์„ฑ์€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— false๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์†์„ฑ์˜ ์†์„ฑ ๊ธฐ์ˆ ์ž

JavaScript ๊ฐ์ฒด์˜ ๊ฐ ์†์„ฑ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์†์„ฑ ๊ธฐ์ˆ ์ž(Property Descriptor)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์†์„ฑ ๊ธฐ์ˆ ์ž๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€๋ฅผ ์ •์˜ํ•˜๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•ด ์†์„ฑ์„ ๋”์šฑ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • value: ์†์„ฑ์˜ ๊ฐ’
  • writable: ์†์„ฑ์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€
  • enumerable: ์†์„ฑ์„ ๋ฐ˜๋ณต๋ฌธ์—์„œ ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€
  • configurable: ์†์„ฑ์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์†์„ฑ ๊ธฐ์ˆ ์ž๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€

์†์„ฑ ๊ธฐ์ˆ ์ž๋Š” Object.defineProperty() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ ๊ธฐ์ˆ ์ž ์„ค์ • ์˜ˆ์ œ

let person = {
    name: "Alice"
};

Object.defineProperty(person, "age", {
    value: 25,
    writable: false,
    enumerable: true,
    configurable: false
});

console.log(person.age);  // ๊ฒฐ๊ณผ: 25
person.age = 30;  // writable: false ์ด๋ฏ€๋กœ ๊ฐ’ ๋ณ€๊ฒฝ ์•ˆ ๋จ
console.log(person.age);  // ๊ฒฐ๊ณผ: 25

์œ„ ์ฝ”๋“œ์—์„œ๋Š” age ์†์„ฑ์„ ์ •์˜ํ•  ๋•Œ writable์„ false๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์†์„ฑ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ์ฒด ์†์„ฑ์˜ ์—ด๊ฑฐ

for...in ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ(enumerable) ์†์„ฑ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

for (let key in car) {
    console.log(key + ": " + car[key]);
}

์œ„ ์ฝ”๋“œ์—์„œ๋Š” car ๊ฐ์ฒด์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์†์„ฑ ํ‚ค์™€ ๊ทธ ๊ฐ’์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

JavaScript ๊ฐ์ฒด ์†์„ฑ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์†์„ฑ์„ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์†์„ฑ ๊ธฐ์ˆ ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ์ฒด์˜ ๋™์ž‘์„ ๋”์šฑ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด์˜ ์†์„ฑ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ๋‚˜๋ฉด, ๋” ํšจ์œจ์ ์œผ๋กœ JavaScript ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๊ฐ์ฒด ์†์„ฑ์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ํ™œ์šฉํ•ด ๋ณด์„ธ์š”!

๋Œ“๊ธ€ ์“ฐ๊ธฐ