์๋ฃํ์๋ 8๊ฐ์ง ์๋ฃํ์ด ์๋๋ฐ ๊ทธ ์ค 7๊ฐ๋ ์์ํ์ด๋ค.
์์ํ์ ์ค์ง ํ๋์ ๋ฐ์ดํฐ(๋ฌธ์์ด, ์ซ์ ๋ฑ)๋ง ๋ด์ ์ ์๊ธฐ ๋๋ฌธ์ '์์ํ'์ด๋ผ ๋ถ๋ฅธ๋ค.
๊ทธ๋ฌ๋ ๊ฐ์ฒดํ์ ์์ํ๊ณผ ๋ฌ๋ฆฌ ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์๋ค.
๐๊ฐ์ฒดํ
- ํค๋ก ๊ตฌ๋ถ๋ ๋ฐ์ดํฐ ์งํฉ์ด๋ ๋ณต์กํ ๊ฐ์ฒด(entity)๋ฅผ ์ ์ฅํ ์ ์๋ค.
- {...} ์ค๊ดํธ๋ฅผ ์ฌ์ฉํด ๋ง๋ค๊ณ , ์ค๊ดํธ ์์๋ 'key-value' ํํ์ธ ํ๋กํผํฐ๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ฃ์ ์ ์๋ค.
- ์ค๊ดํธ๋ฅผ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ ์ ์ธํ๋ ๊ฒ์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ ๊ฐ์ฒด ์ ์ธ ์ ์ฃผ๋ก ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
- key -> ๋ฌธ์ํ๋ง ํ์ฉ / value -> ๋ชจ๋ ์๋ฃํ ํ์ฉ
- ํ๋กํผํฐ ํค๋ ํ๋กํผํฐ์ ์ด๋ฆ ๋๋ ์๋ณ์๋ผ๊ณ ๋ ํ๋ค.
๐ ๋ฆฌํฐ๋ด๊ณผ ํ๋กํผํฐ
// 'user' ๋ผ๋ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์
let user = {
	name: 'john', 	// name: 'john' ์ด๋ผ๋ ํ๋กํผํฐ์
    age: 30		// age: 20 ์ด๋ผ๋ ํ๋กํผํฐ๋ค๋ก ๊ตฌ์ฑ๋์ด์๋ค.
}
๐ฉ๐ป ํ๋กํผํฐ ๊ฐ ์ฝ์ด์ค๊ธฐ
let user = {
	name: 'John',
    age: 30,
    'likes birds': true
};
1) ๋๊ดํธ ํ๊ธฐ๋ฒ
- ์ฌ๋ฌ ๋จ์ด๋ฅผ ์กฐํฉํด ํ๋กํผํฐ ํค๋ฅผ ๋ง๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
console.log(user['likes birds']);	// true
2) ์  ํ๊ธฐ๋ฒ
console.log(user.name); // Johnโ ๏ธ const๋ก ์ ์ธ๋ ๊ฐ์ฒด๋ ์์ ์ด ๊ฐ๋ฅํ๋ค.
const user = {
	name: 'John'
}
user.name = 'Amy';
console.log(user.name);	// Amy- const๋ user์ ๊ฐ์ ๊ณ ์ ํ์ง๋ง ํด๋น ๋ด์ฉ์ ๊ณ ์ ํ์ง ์๋๋ค.
๐งฎ ๊ณ์ฐ๋ ํ๋กํผํฐ
- ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ๊ฐ์ฒด ๋ฆฌํฐ๋ด ์์ ํ๋กํผํฐ ํค๊ฐ ๋๊ดํธ๋ก ๋๋ฌ์ธ์ฌ ์๋ ๊ฒฝ์ฐ
let age = '๋์ด';
let soo = {
	name: 'soo',
    [age]: 27
}
console.log(soo);	// {name: 'soo', ๋์ด: 27}
console.log(soo[age]);	//27
๐ ๋จ์ถ ํ๋กํผํฐ
- ํ๋กํผํฐ ๊ฐ์ ๊ธฐ์กด ๋ณ์์์ ๋ฐ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ
function makeUser(name, age) {
	return {
    	name: name, // ์ด๋ฆ๊ณผ ๊ฐ์ด ๋ณ์์ ์ด๋ฆ๊ณผ ๋์ผํ๋ค
        age: age,
    }
}
let user = makeUser('John', 20);
console.log(user.name);	// John// ์ด๋ด ๊ฒฝ์ฐ ํ๋กํผํฐ ๊ฐ ๋จ์ถ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ์งง๊ฒ ์ค์ผ ์ ์๋ค.
function makeUser(name, age) {
	return {
    	name, // ํ๋กํผํฐ ๊ฐ ๋จ์ถ ๊ตฌ๋ฌธ
        age,
    }
}
let user = makeUser('John', 20);
console.log(user.name);	// John
๐ ํ๋กํผํฐ ์ด๋ฆ์ ์ ์ฝ ์ฌํญ
- ๋ณ์ ์ด๋ฆ์๋ 'for', 'let', 'return' ๊ฐ์ ์์ฝ์ด๋ฅผ ์ฌ์ฉํด์๋ ์๋๋๋ฐ, ๊ฐ์ฒด์๋ ์ด๋ฐ ์ ์ฝ์ด ์์ง๋ ์๋ค.
- ๊ทธ๋ฌ๋ ํน๋ณํ๊ฒ ์ ์ฝ์ด ๋๋ ์ด๋ฆ์ด ํ๋ ์๋ค. --> '__proto__'
๐ ํ๋กํผํฐ ์กด์ฌ ์ฌ๋ถ ํ์ธ in'
- 'in' ์ฐ์ฐ์ ์ฌ์ฉ
let user = { age: 30 };
let key = "age";
console.log(key in age); // true
๐ for...in ๋ฐ๋ณต๋ฌธ
- ๊ฐ์ฒด์ ๋ชจ๋ ํค๋ฅผ ์ํํ ์ ์๋ค.
for(key in object) {
	...
}let user = {
	name: 'soo',
    age: 27,
    isAdmin: true
}
for(let key in user) {
	
    // ํค
	console.log(key);	// name, age, isAdmin
    
    // ํค์ ํด๋นํ๋ ๊ฐ
   	console.log([key]);	// soo, 27, true
}โจ ๋ฉ์๋, Method
- ๊ฐ์ฒด ํ๋กํผํฐ์ ์ ์ฅ๋ ํจ์
- this๋ก ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.
let user = {
	name: 'John',
    age: 30
}
// ๊ฐ์ฒด ํ๋กํผํฐ user.sayHi์ ํจ์๋ฅผ ํ ๋นํด์ค
// ํ ๋น๋ ํจ์๊ฐ Method!
user.sayHi = function() {
	alert('hello')
}
user.sayHi();
- ๋ฉ์๋ ๋จ์ถ ๊ตฌ๋ฌธ
user = {
	sayHi: function() {
    	alert('Hello');
    }
};
// ์์ ํจ์๋ฅผ ๋จ์ถ ๊ตฌ๋ฌธ์ผ๋ก ๋ฐ๊ฟ๋ณด๊ธฐ
user = {
	sayHi() {
    	alert('Hello');
    }
};๐โ๏ธ ๋ฉ์๋์ this
- ๋ฉ์๋๋ ๊ฐ์ฒด์ ์ ์ฅ๋ ์ ๋ณด์ ์ ๊ทผํ ์ ์์ด์ผ ์  ์ญํ ์ ํ ์ ์๋ค.(๋๋ถ๋ถ์ ๋ฉ์๋๊ฐ ๊ฐ์ฒด ํ๋กํผํฐ์ ๊ฐ์ ํ์ฉํ๋ค.)
- ๋ฉ์๋ ๋ด๋ถ์์ this ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋ค.
let user = {
	name: 'John',
    age: 30,
    
    // ์ด๋ this๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด๋ 'ํ์ฌ ๊ฐ์ฒด' ์ฆ, user
    sayHi() {
    	console.log('hello ' + this.name); // hello John
    }
}
// user.sayHi()๊ฐ ์คํ๋๋ ๋์์ this๋ user ๋ํ๋ธ๋ค. 
user.sayHi();
- this๋ ์์ ๋กญ๋ค -> 'strict mode' ๊ฐ ์๋๋๋ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.
๐ ์์ ๋ก์ด this๊ฐ ๋ง๋ ๊ฒฐ๊ณผ
- this๊ฐ ํญ์ ๋ฉ์๋๊ฐ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๊ฒ์ด๋ผ๊ณ ์ฐฉ๊ฐํ๊ฒ ๋๋ค. -> bound this
- ์๋ฐ์คํฌ๋ฆฝํธ์์ this๋ ๋ฐํ์ ๋ ๊ฒฐ์ ๋๋ค.
- ๋ฉ์๋๊ฐ ์ด๋์ ์ ์๋์๋๊ฐ์ ์๊ด์์ด '.' ์์ ๊ฐ์ฒด๊ฐ ๋ฌด์์ธ๊ฐ์ ๋ฐ๋ผ ์์ ๋กญ๊ฒ ๊ฒฐ์ ๋๋ค.
- ES6์์๋ Arrow function ๋์ (์์ ๋ง์ this๋ฅผ ๊ฐ์ง์ง ์๊ธฐ ๋๋ฌธ)
- Arrow fucntion ์์ this ์ฐธ์กฐํ๋ฉด arrow function ๋ด๋ถ๊ฐ ์๋ ํ๋ฒํ ์ธ๋ถํจ์์์ this ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
- ๋ณ๊ฐ์ this๊ฐ ๋ง๋ค์ด์ง๋๊ฑด ์ํ์ง ์๊ณ , ์ธ๋ถ์ ์๋ this๋ฅผ ์ฐธ์กฐํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉ
โจ new ์ฐ์ฐ์, ์์ฑ์ ํจ์
- ์ ์ฌํ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด์ผ ํ ๋ ์ฌ์ฉํ๋ค.
๐ฉ๐ป ์์ฑ์ ํจ์ ๋ง๋ค๊ธฐ
1) ํจ์ ์ด๋ฆ์ ์ฒซ ๊ธ์๋ ๋๋ฌธ์๋ก ์์
2) ๋ฐ๋์ 'new' ์ฐ์ฐ์๋ฅผ ๋ถ์ฌ ์คํํ๋ค.
- new User() ์จ์ ํจ์ ์คํํ ๋์ ์๊ณ ๋ฆฌ์ฆ
1) ๋น ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด this์ ํ ๋น
2) ํจ์ ๋ณธ๋ฌธ ์คํ, this์ ์๋ก์ด ํ๋กํผํฐ ์ถ๊ฐํด this ์์ 
3) this ๋ฐํ
function User(name) {
// this = {}; ๋น ๊ฐ์ฒด๊ฐ ์์์ ์ผ๋ก ๋ง๋ค์ด์ง
	// ์๋ก์ด ํ๋กํผํฐ๋ฅผ this์ ์ถ๊ฐ
	this.name = name;
    this.isAdmin = false;
    
    // return this; this ์์์ ์ผ๋ก ๋ฐํ
}
// 1) ํจ์ ์ด๋ฆ์ ์ฒซ ๊ธ์๋ ๋๋ฌธ์๋ก ์์
// 2) ๋ฐ๋์ 'new' ์ฐ์ฐ์ ๋ถ์ฌ ์คํ
let user = new User('์์');
console.log(user.name);	// ์์
console.log(user.isAdmin);	// false
๐ต๏ธ ์ต๋ช ์์ฑ์ ํจ์
- ์ฌ์ฌ์ฉํ ํ์๊ฐ ์๋ ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํ ๋ ์ฌ์ฉ
- ์ต๋ช ํจ์๋ ์ด๋์๋ ์ ์ฅ๋์ง ์๋๋ค.
- ์ฒ์๋ถํฐ ๋จ ํ๋ฒ์ ํธ์ถ์ ์ํด ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์ฉ ๋ถ๊ฐ
- ์ฌ์ฌ์ฉ์ ๋ง์ผ๋ฉด์ ์ฝ๋๋ฅผ ์บก์ํ ํ ์ ์๋ค.
let user = new function() {
	this.name = '์์';
    this.isAdmin = true;
}
๐โ๏ธ ์บก์ํ?
- Encapsulation
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์
1) ๊ฐ์ฒด์ ์์ฑ๊ณผ ํ์๋ฅผ ํ๋๋ก ๋ฌถ๊ณ
2) ์ค์  ๊ตฌํ ๋ด์ฉ ์ผ๋ถ๋ฅผ ๋ด๋ถ์ ๊ฐ์ถ์ด ์๋ํ๋ค.
- ํด๋์ค ๋ด๋ถ ๋ณ์์ ๋ฉ์๋๋ฅผ ํ๋๋ก ํจํค์ง ํ๋ ๊ฒ.
