๐Ÿณ๊ฐ์ฒด ๊ธ€์„ ๋ณด๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค ๐Ÿณ

1. ๊ฐ์ฒด(Object)๋ž€?

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ์ฒด(object) ๊ธฐ๋ฐ˜์˜ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์ด๋ฉฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ๊ฑฐ์˜ โ€œ๋ชจ๋“  ๊ฒƒโ€์ด ๊ฐ์ฒด์ด๋‹ค.
    ย 

1) ํ”„๋กœํผํ‹ฐ

ํ”„๋กœํผํ‹ฐ๋Š” ํ”„๋กœํผํ‹ฐ ํ‚ค(์ด๋ฆ„)์™€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ํ”„๋กœํผํ‹ฐ๋Š” ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ํ”„๋กœํผํ‹ฐ ํ‚ค๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์‹๋ณ„์ž(identifier)๋‹ค. ํ”„๋กœํผํ‹ฐ ํ‚ค์˜ ๋ช…๋ช… ๊ทœ์น™๊ณผ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
- ํ”„๋กœํผํ‹ฐ ํ‚ค : ๋นˆ ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด ๋˜๋Š” symbol ๊ฐ’
- ํ”„๋กœํผํ‹ฐ ๊ฐ’ : ๋ชจ๋“  ๊ฐ’
ํ”„๋กœํผํ‹ฐ ํ‚ค์— ๋ฌธ์ž์—ด์ด๋‚˜ symbol ๊ฐ’ ์ด์™ธ์˜ ๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด ์•”๋ฌต์ ์œผ๋กœ ํƒ€์ž…์ด ๋ณ€ํ™˜๋˜์–ด ๋ฌธ์ž์—ด์ด ๋œ๋‹ค. ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ์ค‘๋ณต ์„ ์–ธํ•˜๋ฉด ๋‚˜์ค‘์— ์„ ์–ธํ•œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋จผ์ € ์„ ์–ธํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฎ์–ด์“ด๋‹ค. ๋ฐฐ์—ด๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๊ฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์—ด๊ฑฐํ•  ๋•Œ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
ย 

2) ๋ฉ”์†Œ๋“œ

ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ํ•จ์ˆ˜์ผ ๊ฒฝ์šฐ, ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์†Œ๋“œ๋ผ ๋ถ€๋ฅธ๋‹ค. ์ฆ‰, ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด์— ์ œํ•œ๋˜์–ด ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
ย 

2. ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ•

1) ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹์ด๋‹ค. ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์™€ ๋น„๊ตํ•  ๋•Œ ๋งค์šฐ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ({})๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ {} ๋‚ด์— 1๊ฐœ ์ด์ƒ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ธฐ์ˆ ํ•˜๋ฉด ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. {} ๋‚ด์— ์•„๋ฌด๊ฒƒ๋„ ๊ธฐ์ˆ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

var emptyObject = {};
console.log(typeof emptyObject); // object

var person = {
  name: 'Lee',
  gender: 'male',
  sayHello: function () {
    console.log('Hi! My name is ' + this.name);
  }
};

console.log(typeof person); // object
console.log(person); // {name: "Lee", gender: "male", sayHello: ฦ’}

person.sayHello(); // Hi! My name is Lee

ย 

2) Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜

new ์—ฐ์‚ฐ์ž์™€ Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
- ์ƒ์„ฑ์ž(constructor) ํ•จ์ˆ˜๋ž€ new ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šค(instance)๋ผ ํ•œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ด์™ธ์—๋„ String, Number, Boolean, Array, Date, RegExp ๋“ฑ์˜ ๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ํŒŒ์Šค์นผ ์ผ€์ด์Šค(PascalCase)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

// ๋นˆ ๊ฐ์ฒด์˜ ์ƒ์„ฑ
var person = new Object();
// ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€
person.name = 'Lee';
person.gender = 'male';
person.sayHello = function () {
  console.log('Hi! My name is ' + this.name);
};

console.log(typeof person); // object
console.log(person); // {name: "Lee", gender: "male", sayHello: ฦ’}

person.sayHello(); // Hi! My name is Lee
  • ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” ๊ฒฐ๊ตญ ๋นŒํŠธ์ธ(Built-in) ํ•จ์ˆ˜์ธ Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋‹จ์ˆœํ™”์‹œํ‚จ ์ถ•์•ฝ ํ‘œํ˜„(short-hand)์ด๋‹ค.
    ย 

3) ์ƒ์„ฑ์ž ํ•จ์ˆ˜

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹๊ณผ Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋ฐฉ์‹์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœํผํ‹ฐ ๊ฐ’๋งŒ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ถˆํŽธํ•˜๋‹ค. ๋™์ผํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋งค๋ฒˆ ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ธฐ์ˆ ํ•ด์•ผ ํ•œ๋‹ค.

var person1 = {
  name: 'Lee',
  gender: 'male',
  sayHello: function () {
    console.log('Hi! My name is ' + this.name);
  }
};

var person2 = {
  name: 'Kim',
  gender: 'female',
  sayHello: function () {
    console.log('Hi! My name is ' + this.name);
  }
};
์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งˆ์น˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ(ํด๋ž˜์Šค)์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋™์ผํ•œ ๊ฐ์ฒด ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Person(name, gender) {
  this.name = name;
  this.gender = gender;
  this.sayHello = function(){
    console.log('Hi! My name is ' + this.name);
  };
}

// ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ
var person1 = new Person('Lee', 'male');
var person2 = new Person('Kim', 'female');

console.log('person1: ', typeof person1);
console.log('person2: ', typeof person2);
console.log('person1: ', person1);
console.log('person2: ', person2);

person1.sayHello();
person2.sayHello();
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ด๋ฆ„์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ž„์„ ์ธ์‹ํ•˜๋„๋ก ๋„์›€์„ ์ค€๋‹ค.
  • ํ”„๋กœํผํ‹ฐ ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ช… ์•ž์— ๊ธฐ์ˆ ํ•œ this๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค(instance)๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • this์— ์—ฐ๊ฒฐ(๋ฐ”์ธ๋”ฉ)๋˜์–ด ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์†Œ๋“œ๋Š” public(์™ธ๋ถ€์—์„œ ์ฐธ์กฐ ๊ฐ€๋Šฅ)ํ•˜๋‹ค.
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธ๋œ ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋Š” private(์™ธ๋ถ€์—์„œ ์ฐธ์กฐ ๋ถˆ๊ฐ€๋Šฅ)ํ•˜๋‹ค. ์ฆ‰, ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” ์ž์œ ๋กญ๊ฒŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‚˜ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
function Person(name, gender) {
  var married = true;         // private
  this.name = name;           // public
  this.gender = gender;       // public
  this.sayHello = function(){ // public
    console.log('Hi! My name is ' + this.name);
  };
}

var person = new Person('Lee', 'male');

console.log(typeof person); // object
console.log(person); // Person { name: 'Lee', gender: 'male', sayHello: [Function] }

console.log(person.gender);  // 'male'
console.log(person.married); // undefined

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”์™€ ๊ฐ™์€ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์˜ ์ƒ์„ฑ์ž(constructor)์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๊ทธ ํ˜•์‹์ด ์ •ํ•ด์ ธ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ธฐ์กด ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  new ์—ฐ์‚ฐ์ž๋ฅผ ๋ถ™์—ฌ์„œ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค.

์ด๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ํ•จ์ˆ˜์— new ์—ฐ์‚ฐ์ž๋ฅผ ๋ถ™์—ฌ ํ˜ธ์ถœํ•˜๋ฉด ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ช…์€ ์ฒซ๋ฌธ์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ๊ธฐ์ˆ ํ•˜์—ฌ ํ˜ผ๋ž€์„ ๋ฐฉ์ง€ํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์„ ํ•œ๋‹ค.

new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด this ๋ฐ”์ธ๋”ฉ์ด ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.
ย 

3. ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ

1) ํ”„๋กœํผํ‹ฐ ํ‚ค

ํ”„๋กœํผํ‹ฐ ํ‚ค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ž์—ด(๋นˆ ๋ฌธ์ž์—ด ํฌํ•จ)์„ ์ง€์ •ํ•œ๋‹ค. ํ”„๋กœํผํ‹ฐ ํ‚ค์— ๋ฌธ์ž์—ด์ด๋‚˜ symbol ๊ฐ’ ์ด์™ธ์˜ ๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด ์•”๋ฌต์ ์œผ๋กœ ํƒ€์ž…์ด ๋ณ€ํ™˜๋˜์–ด ๋ฌธ์ž์—ด์ด ๋œ๋‹ค. ๋˜ํ•œ ๋ฌธ์ž์—ด ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ ์ˆ˜๋ ด๋  ์ˆ˜ ์žˆ๋Š” ํ‘œํ˜„์‹๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ”„๋กœํผํ‹ฐ ํ‚ค๋Š” ๋ฌธ์ž์—ด์ด๋ฏ€๋กœ ๋”ฐ์˜ดํ‘œ(โ€˜โ€™ ๋˜๋Š” โ€œโ€œ)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์œ ํšจํ•œ ์ด๋ฆ„์ธ ๊ฒฝ์šฐ, ๋”ฐ์˜ดํ‘œ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋งํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์œ ํšจํ•œ ์ด๋ฆ„์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ๋ฐ˜๋“œ์‹œ ๋”ฐ์˜ดํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

ํ”„๋กœํผํ‹ฐ ๊ฐ’์€ ๋ชจ๋“  ๊ฐ’๊ณผ ํ‘œํ˜„์‹์ด ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ ์ด๋ฅผ ๋ฉ”์†Œ๋“œ๋ผ ํ•œ๋‹ค.

var person = {
  'first-name': 'Ung-mo',
  'last-name': 'Lee',
  gender: 'male',
  1: 10,
  function: 1 // OK. ํ•˜์ง€๋งŒ ์˜ˆ์•ฝ์–ด๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.
};

console.log(person);

ํ”„๋กœํผํ‹ฐ ํ‚ค first-name์—๋Š” ๋ฐ˜๋“œ์‹œ ๋”ฐ์˜ดํ‘œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€๋งŒ first_name์—๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค. first-name์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์œ ํšจํ•œ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ โ€˜-โ€˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š” ํ‘œํ˜„์‹์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

var person = {
  first-name: 'Ung-mo', // SyntaxError: Unexpected token -
};

ํ‘œํ˜„์‹์„ ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ‚ค๋กœ ์‚ฌ์šฉํ•  ํ‘œํ˜„์‹์„ ๋Œ€๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ‘œํ˜„์‹์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์‹๋ณ„์ž first๋ฅผ ์ฐพ์„ ๊ฒƒ์ด๊ณ  ์ด๋•Œ ReferenceError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

var person = {
  [first-name]: 'Ung-mo', // ReferenceError: first is not defined
};

์˜ˆ์•ฝ์–ด๋ฅผ ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜์—ฌ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜ˆ์•ฝ์–ด๋ฅผ ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์˜ˆ์•ฝ์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

abstract  arguments boolean break byte
case  catch char  class*  const
continue  debugger  default delete  do
double  else  enum* eval  export*
extends*  false final finally float
for function  goto  if  implements
import* in  instanceof  int interface
let long  native  new null
package private protected public  return
short static  super*  switch  synchronized
this  throw throws  transient true
try typeof  var void  volatile
while with  yield
// *๋Š” ES6์—์„œ ์ถ”๊ฐ€๋œ ์˜ˆ์•ฝ์–ด

ย 

2) ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์ฝ๊ธฐ

๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งˆ์นจํ‘œ(.) ํ‘œ๊ธฐ๋ฒ•๊ณผ ๋Œ€๊ด„ํ˜ธ([]) ํ‘œ๊ธฐ๋ฒ•์ด ์žˆ๋‹ค.

var person = {
  'first-name': 'Ung-mo',
  'last-name': 'Lee',
  gender: 'male',
  1: 10
};

console.log(person);

console.log(person.first-name);    // NaN: undefined-undefined
console.log(person[first-name]);   // ReferenceError: first is not defined
console.log(person['first-name']); // 'Ung-mo'

console.log(person.gender);    // 'male'
console.log(person[gender]);   // ReferenceError: gender is not defined
console.log(person['gender']); // 'male'

console.log(person['1']); // 10
console.log(person[1]);   // 10 : person[1] -> person['1']
console.log(person.1);    // SyntaxError

ํ”„๋กœํผํ‹ฐ ํ‚ค๊ฐ€ ์œ ํšจํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ด๋ฆ„์ด๊ณ  ์˜ˆ์•ฝ์–ด๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ํ”„๋กœํผํ‹ฐ ๊ฐ’์€ ๋งˆ์นจํ‘œ ํ‘œ๊ธฐ๋ฒ•, ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ• ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์ด ์œ ํšจํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ด๋ฆ„์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ์˜ˆ์•ฝ์–ด์ธ ๊ฒฝ์šฐ ํ”„๋กœํผํ‹ฐ ๊ฐ’์€ ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์ฝ์–ด์•ผ ํ•œ๋‹ค. ๋Œ€๊ด„ํ˜ธ([]) ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋Œ€๊ด„ํ˜ธ ๋‚ด์— ๋“ค์–ด๊ฐ€๋Š” ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•œ๋‹ค.

๊ฐ์ฒด์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
ย 

3) ํ”„๋กœํผํ‹ฐ ๊ฐ’ ๊ฐฑ์‹ 

๊ฐ์ฒด๊ฐ€ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ ๊ฐ’์€ ๊ฐฑ์‹ ๋œ๋‹ค.

var person = {
  'first-name': 'Ung-mo',
  'last-name': 'Lee',
  gender: 'male',
};

person['first-name'] = 'Kim';
console.log(person['first-name'] ); // 'Kim'

ย 

4) ํ”„๋กœํผํ‹ฐ ๋™์  ์ƒ์„ฑ

๊ฐ์ฒด๊ฐ€ ์†Œ์œ ํ•˜๊ณ  ์žˆ์ง€ ์•Š์€ ํ”„๋กœํผํ‹ฐ ํ‚ค์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ํ•˜๋ฉด ์ฃผ์–ด์ง„ ํ‚ค์™€ ๊ฐ’์œผ๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•œ๋‹ค.

var person = {
  'first-name': 'Ung-mo',
  'last-name': 'Lee',
  gender: 'male',
};

person.age = 20;
console.log(person.age); // 20

ย 

5) ํ”„๋กœํผํ‹ฐ ์‚ญ์ œ

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

var person = {
  'first-name': 'Ung-mo',
  'last-name': 'Lee',
  gender: 'male',
};

delete person.gender;
console.log(person.gender); // undefined

delete person;
console.log(person); // Object {first-name: 'Ung-mo', last-name: 'Lee'}

ย 

6) for-in ๋ฌธ

for-in ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด(๋ฐฐ์—ด ํฌํ•จ)์— ํฌํ•จ๋œ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ๋ฃจํ”„๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

var person = {
  'first-name': 'Ung-mo',
  'last-name': 'Lee',
  gender: 'male'
};

// prop์— ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์ด ๋ฐ˜ํ™˜๋œ๋‹ค. ๋‹จ, ์ˆœ์„œ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.
for (var prop in person) {
  console.log(prop + ': ' + person[prop]);
}

/*
first-name: Ung-mo
last-name: Lee
gender: male
*/

var array = ['one', 'two'];

// index์— ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค
for (var index in array) {
  console.log(index + ': ' + array[index]);
}

/*
0: one
1: two
*/

for-in ๋ฌธ์€ ๊ฐ์ฒด์˜ ๋ฌธ์ž์—ด ํ‚ค(key)๋ฅผ ์ˆœํšŒํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ๋ฒ•์ด๋‹ค. ๋ฐฐ์—ด์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ, ํ”„๋กœํผํ‹ฐ์˜ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ์ด์œ ๋Š” ์›๋ž˜ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์—๋Š” ์ˆœ์„œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐฐ์—ด์€ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด์ง€๋งŒ ๊ฐ์ฒด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  2. ๋ฐฐ์—ด ์š”์†Œ๋“ค๋งŒ์„ ์ˆœํšŒํ•˜์ง€ ์•Š๋Š”๋‹ค.
// ๋ฐฐ์—ด ์š”์†Œ๋“ค๋งŒ์„ ์ˆœํšŒํ•˜์ง€ ์•Š๋Š”๋‹ค.
var array = ['one', 'two'];
array.name = 'my array';

for (var index in array) {
  console.log(index + ': ' + array[index]);
}

/*
0: one
1: two
name: my array
*/

์ด์™€ ๊ฐ™์€ for-in ๋ฌธ์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ES6์—์„œ for-of ๋ฌธ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
forโ€“in ๋ฌธ์€ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ˆœํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ  forโ€“of ๋ฌธ์€ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

const array = [1, 2, 3];
array.name = 'my array';

for (const value of array) {
  console.log(value);
}

/*
1
2
3
*/

for (const [index, value] of array.entries()) {
  console.log(index, value);
}

/*
0 1
1 2
2 3
*/

By Dozzing

๋‹ต๊ธ€ ๋‚จ๊ธฐ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค