๐ก ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ
ํ๋์ ๋ชจ๋ธ์ด ๋๋ ์ฒญ์ฌ์ง(blueprint)์ ๋ง๋ค๊ณ , ๊ทธ ์ฒญ์ฌ์ง์ ๋ฐํ์ผ๋ก ํ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ํ๋ก๊ทธ๋๋ฐ ํจํด.
์ฒญ์ฌ์ง์ ํด๋์ค(class)๋ผ๊ณ ๋ถ๋ฅด๊ณ , ์ฒญ์ฌ์ง์ ๋ฐํ์ผ๋ก ๋ง๋ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์ค ๊ฐ์ฒด(instance object) ์ค์ฌ์ ์ธ์คํด์ค ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํด๋์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
ES5์ด์ ๋ฌธ๋ฒ
function Car(brand, name, color) {
this.brand = brand;
this.name = name;
this.color = color;
} // ์์ฑ
Car.prototype.refuel = function(){
return "์ฐ๋ฃ ๊ณต๊ธ";
} // ๋ฉ์๋
Car.prototype.drive = function(){
return "์ด์ ์์";
} // ๋ฉ์๋
ES6 ๋ฌธ๋ฒ
class Car {
constructor(brand, name, color){
this.brand = brand;
this.name = name;
this.color = color;
} // ์์ฑ
refuel(){
return "์ฐ๋ฃ ๊ณต๊ธ";
} // ๋ฉ์๋
drive(){
return "์ด์ ์์";
} // ๋ฉ์๋
}
ES6๋ถํฐ๋ classํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ ์์ ์์ฑ์ ํจ์(constructor)์ ๋ฉ์๋๊ฐ ๋ค์ด์์ต๋๋ค.
์์ฑ์ ์ ์ํ ๋ this ํค์๋๊ฐ ๋ฑ์ฅํฉ๋๋ค. ์ฌ๊ธฐ์ this๋ ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋๋ฐ, parameter๋ก ๋์ด์จ ๋ธ๋๋, ์ด๋ฆ, ์์ ๋ฑ์ ์ธ์คํด์ค ์์ฑ ์ ์ง์ ๋ฉ๋๋ค.
์์ฑ๊ณผ ๋ฉ์๋
ํด๋์ค์ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ , ์ธ์คํด์ค์์ ์ฌ์ฉํฉ๋๋ค.
์๋์ฐจ๋ก ์๋ฅผ ๋ค๋ฉด ์์ฑ์ ๋ธ๋๋, ์ฐจ ์ด๋ฆ, ์์, ํ์ฌ ์ฐ๋ฃ๋, ์ต๊ณ ์๋ ฅ ๋ฑ์ผ๋ก ์๋์ฐจ์ ์ํ๋ฅผ ์ ์ํฉ๋๋ค.
๋ฉ์๋๋ ‘๊ฐ์ฒด์ ๋ธ๋ฆฐ ํจ์’์ ๋๋ค. ์ฐ๋ฃ ๊ณต๊ธ, ์ด์ ์์, ์๋ ฅ ์กฐ์ ๋ฑ ์๋์ฐจ์ ๋์์ ๊ฒฐ์ ํฉ๋๋ค.
๋ฉ์๋๋ ES5๊น์ง ๋ฉ์๋๋ prototype์ด๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํด์ผ ์ ์ํ ์ ์์์ง๋ง ES6๋ถํฐ๋ classํค์๋ ์์ชฝ์ ๋ฌถ์ด์ ์ ์ํฉ๋๋ค.
์ธ์คํด์ค์์ ์ฌ์ฉ
์์์ ์ค์ ํ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์ธ์คํด์ค์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
let avante = new Car("hyundai", "avante", "black")
avante.color; // "black"
avante.drive(); // "์ด์ ์์"
avante.refuel(); // "์ฐ๋ฃ ๊ณต๊ธ"
์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ new ํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ค๋ฅธ ํจ์์ ๊ตฌ๋ถํ๊ธฐ ์ํด ํด๋์ค๋ ๋ณดํต ๋๋ฌธ์๋ก ์์ํ๋ฉฐ ์ผ๋ฐ๋ช ์ฌ๋ก ๋ง๋ญ๋๋ค. ์ผ๋ฐ์ ์ธ ํจ์๋ ์ ์ ํ ๋์ฌ๋ฅผ ํฌํจํ๊ณ ์๋ฌธ์๋ก ์์ํฉ๋๋ค.
๊ฐ๊ฐ์ ์ธ์คํด์ค๋ ๊ณ ์ ํ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
์ฉ์ด ์ ๋ฆฌ
- constructor : ์ธ์คํด์ค๊ฐ ์ด๊ธฐํ๋ ๋ ์คํํ๋ ์์ฑ์ ํจ์
- prototype: ๋ชจ๋ธ์ ์ฒญ์ฌ์ง์ ๋ง๋ค ๋ ์ฐ๋ ์ํ ๊ฐ์ฒด(original form)
- this: ํจ์๊ฐ ์คํ๋ ๋, ํด๋น scope๋ง๋ค ์์ฑ๋๋ ๊ณ ์ ํ ์คํ context(execution context). newํค์๋๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ์ ๋์๋ ํด๋น ์ธ์คํด์ค๊ฐ this์ ๊ฐ์ด ๋๋ค.