๋ฐ์ํ
1๏ธโฃ class ๋?
- 2016๋ ES6 ๋ถํฐ ๋์ ๋ instance๋ฅผ ์์ฑํ๋ ์์ฑ์ ํจ์.
- ๊ฐ์ฒด๋ฅผ ์์ฐํ๋ ๋ถ์ด๋นต ํ๊ณผ ๊ฐ์ ๊ฐ๋ ์ผ๋ก ํํ ์ค๋ช ํ๋๋ฐ, ์์ฐ ๋๋ฉด ํน์ ์ฒญ์ฌ์ง์ด๋ผ๊ณ ๋ ํํํ ์ ์๋ค.
- class + ์ด๋ฆ + { constructor ... } ๋ก ๊ตฌ์ฑ.
- constructor()๋ new ์ฐ์ฐ์๋ก ํธ์ถ๋๋ ์ธ์คํด์ค์ ๊ธฐ๋ณธ ์ํ๋ฅผ ์๋์ผ๋ก ์ค์ ํด์ฃผ๋ ์์ฑ์ ๋ฉ์๋.
ํน๋ณํ ์ ์ฐจ ์์ด ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ ํ ์ ์๋ค. - class๋ด๋ถ์ ์๋ Field๋ ๋ณ์์ ๋น์ทํ๊ฒ ์ฌ์ฉ๋๋๋ฐ, Constructor์ Method ์ ์ฒด์์ ์ฌ์ฉ๋๋ฉฐ, ์๋ฉธ๋์ง ์๋๋ค๋ ํน์ง์ด ์๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ง์ ์ฌ์ฉ์ ์ ์ ํ์
์์ฑ(๊ฐ์ฒด ์์ฑ) ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ์ธ์ด์ ํด๋์ค ๋ฌธ๋ฒ์ฒ๋ผ ๋ฐ๊ฟ์ค ๊ฒ.
์ด์ฒ๋ผ ๋ด๋ถ์ ์ธ ๋์์ ๋์ผํ์ง๋ง ๋ ๋ณด๊ธฐ ์ข๊ณ ํธ๋ฆฌํ๊ฒ ๊ฐ์ ๋ ๋ฌธ๋ฒ์ Sugar Syntactic ์คํ ๋ฌธ๋ฒ์ด๋ผ๊ณ ํ๋ค. - ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ํ ๋ณด์ ์ค๋ช ์ด ํ์ํ๋ค๋ฉด ์ฐ์ธก ๊ฒ์๋ฌผ ์ฐธ๊ณ . [JAYโจ๏ธJS]๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ
// Robot์ด๋ผ๋ Class์ speak() ๋ฉ์๋ ์์ฑ
class Robot {
constructor(name) {
this.name = name;
}
speak() {
console.log(`์๋ฆฌ๋น๋ฆฌ. ์ ์ด๋ฆ์ ${this.name}์
๋๋ค.`);
}
}
// ๐ Encapsulation ์บก์ํ!
// new ํค์๋๋ก Robot ํ
ํ๋ฆฟ์ ๊ฐ์ ธ์์ newBot Object์ data In.
const newBot = new Robot('๐ค JAY');
// newBot instance์ Method ์คํ
// = ์๋ฆฌ๋น๋ฆฌ.์ ์ด๋ฆ์ ๐ค JAY์
๋๋ค.
newBot.speak();
2๏ธโฃ class ์์
- ํด๋์ค์ ์์์ extends ํค์๋๋ฅผ ์ฌ์ฉ.
- ๋ถ๋ชจ class์๊ฒ ์์์ ๋ฐ๋ ์์ class๋ ์๋ธ ํด๋์ค(subclass) ํน์ ํ์ ํด๋์ค(derived class) ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- super() ํจ์๋ ๋ถ๋ชจ ํด๋์ค์ constructor ์์ฑ์ ์์์ํค๋ ํน์ํ ๋ฉ์๋.
- ์๋ธ ํด๋์ค์๋ super([arguments]); ์์ฑ์ด ๋ด์ฅ๋์ด ์์ด์ ๋ถ๋ชจ ํด๋์ค์ fields ๋ด๋ถ์ ์์นํ ํ๋กํผํฐ๊ฐ ์์๋๋ค.
- super() ํจ์๊ฐ ์๋ ์๋ธ ํด๋์ค์์ this ๊ฐ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ๋์ this ๋ณด๋ค ๋จผ์ ์คํ๋์ด์ผ ํ๋ฉฐ
์๋ธ ํด๋์ค๊ฐ ์๋ ํด๋์ค์์ ์ฌ์ฉํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ฃผ์!
// 1. Robot์ด๋ผ๋ Class์ speak() ๋ฉ์๋ ์์ฑ
class Robot {
constructor(name) {
this.name = name;
}
speak() {
console.log(`์๋ฆฌ๋น๋ฆฌ. ์ ์ด๋ฆ์ ${this.name}์
๋๋ค.`);
}
}
// 2. class ์์
// ํด๋์ค์ ์์์ extends ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉ.
// ์๋ธ ํด๋์ค์ ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ๋ฐ๋์ ์์ฑ์ ํจ์์์์ super() ํจ์๋ฅผ ์ฌ์ฉ.
// extends ๋ช
๋ น์ด ์์ ๋ณ๋ ์์ด ์์๋ง ๋ฐ๋๋ค๋ฉด ์๋ต ๊ฐ๋ฅ
class clone extends Robot {
constructor([name]) {
super([name]);
}
// ์์ ๊ฐ์ฒด์ Method๋ฅผ ์ฌ์ ์ธํด์ ์ ์ํ๋ ๊ฒ์ Overriding์ด๋ผ๊ณ ํ๋ค.
speak() {
super.speak(); // = ๋ถ๋ชจ Class์ Method ์์!
console.log(`Super ${this.name} Overriding!`);
}
}
// extends ๋ช
๋ น์ด๋ก ์์ฑ๋ subclass 'clone'์ ๊ฐ์ ธ์์ ์บก์ํ.
const babyBot = new clone('๐ค BABY')
// babyBot instance์ Method ์คํ
// = ์๋ฆฌ๋น๋ฆฌ. ์ ์ด๋ฆ์ ๐ค BABY์
๋๋ค.
// = Super ๐ค BABY Overriding!
babyBot.speak();
3๏ธโฃ ๋น๊ณต๊ฐ(private) ํ๋กํผํฐ
- ๋น๊ณต๊ฐ ํ๋กํผํฐ๋ ๊ฐ์ฒด ์์ ์ค์ํ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ๋ณดํธํ์ฌ ํ๋ก๊ทธ๋จ์ด ๋ปํ์ง ์๊ฒ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ง๋ ์ญํ .
- Closerํจํด์ ํ์ฉํ๊ฑฐ๋ ํด์ํ๊ทธ(#)๊ธฐํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
1. Closer๋ฅผ ํ์ฉํ Private property
- Private property๋ ์ฝ๋ ์ ๊ทผ์ ์ ํ์ ํ๋ค๋ ์ ์ด์ธ์ ๋ถํ์ํ ๋ฉ์๋๊ฐ ์ ์ฒด ์ฝ๋์ ์ํฅ์ ์ฃผ๋ ์ํ์ ๋ฐฉ์ง.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ์์ ์ผ๋ก๋ ์ด๋ฐ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ง๋ง ํด๋ก์ ๋ฅผ ์ด์ฉํ์ฌ ํ๋ด๋ด๋ ๊ฒ์ด ๊ฐ๋ฅ.
- ์ด์ ๊ฐ์ด ๊ฐ์ฒด๊ฐ ์ด๋ค ๋ฐ์ดํฐ(property)์ ๋ฉ์๋๋ฅผ ์ฐ๊ด์ํค๋ ๋ฐฉ์์ผ๋ก ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ชจ๋ ํจํด์ด๋ผ๊ณ ํ๋ค.
// 'closer' ๋ฅผ ํ์ฉํ Private property
class Robot {
constructor(name, pw) {
this.model = name;
const getPassword = () => pw;
this.speak = () => console.log(`๐ค ์ ์ด๋ฆ์ ${this.model}์
๋๋ค. ๋น๋ฐ๋ฒํธ๋ ${getPassword()}`);
}
}
const closerBot = new Robot('๐ค ๋ฏธ์ถ์ ๋ก๋ด', '1234');
closerBot.password // = undefined // password์ ์ ๊ทผ ๋ถ๊ฐ๋ฅ!
2. # ํค์๋๋ฅผ ํ์ฉํ Private property
- # ํค์๋๋ฅผ ํ์ฉํ๋ฉด ๋น๊ณต๊ฐ ํ๋กํผํฐ๋ก ์ ํ๋๋ค.
- class๋ด์์๋ง ํ์ธ, ๋ณ๊ฒฝ ๊ฐ๋ฅํ๊ณ , Instance์์ ์ ๊ทผ ๋ถ๊ฐ
- ํ๋กํผํฐ์ ์ ๊ทผํ๋ ค๋ฉด getPassword() setPassword() ํจ์๋ฅผ ์ด์ฉํด์ผ๋ง ํ๋ค.
- ์ถ์๋์ง ์ผ๋ง ๋์ง ์์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ๊ณ ๋ คํด์ผ ํ๋ ์ ์ฃผ์!
// '#' ํค์๋๋ฅผ ํ์ฉํ Private property
class Robot {
// '#password' property๋ฅผ ๋น๊ณต๊ฐ ์ฒ๋ฆฌ
#password
constructor(name, pw) {
this.model = name;
this.#password = pw;
}
getPassword() {
return this.#password
}
setPassword(_pw) {
this.#password = _pw;
}
speak() {
console.log(`๐ค ์ ์ด๋ฆ์ ${this.model}์
๋๋ค. ๋น๋ฐ๋ฒํธ๋ ${this.getPassword()}`);
}
}
const privateBot = new Robot('๐ค ๋ฏธ์ถ์ ๋ก๋ด', '1234');
privateBot.password // = undefined // password์ ์ ๊ทผ ๋ถ๊ฐ๋ฅ!
4๏ธโฃ Get, Set Property
- get set ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด์ ํ๋กํผํฐ์ ์ ๊ทผํ๋ฏ ๊ฐ์ ๋ค๋ฃฐ์ ์๊ฒ ๋๋๋ฐ
๊ฐ์ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉํ๋ ํจ์๋ฅผ getter ๊ฐ์ ์ค์ ํ ๋ ์ฌ์ฉํ๋ ํจ์๋ค์ setter ๋ผ๊ณ ๋ถ๋ฅธ๋ค. - #๋ฅผ ํ์ฉํ ๋น๊ณต๊ฐ ํ๋กํผํฐ์๋ ์ ๊ทผํ ์ ์๊ฒ ๋๋ฏ๋ก ์ฃผ์!
- ํ์
์์๋ get, set ์์ ์ด๋ค ๋ก์ง์ด ์๋์ง ํ์
ํ๋๋ฐ ์ด๋ ค์์ด ์์ ์ ์์ผ๋
์ฃผ์์ด๋, ๊ฐ์ด๋ ๋ฌธ์๋ฅผ ๋ง๋ค์ด ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ฃผ๋๊ฒ์ด ์ข๋ค.
function HidePassword(password) {
return "๊ด๋ฆฌ์๋ง ๋ณผ ์ ์์ด์! ๐ซ";
}
class Robot {
#password;
constructor(name, pw) {
this.name = name;
this.#password = pw;
}
get password() {
return HidePassword(this._password);
}
set password(pw) {
this._password = pw;
}
speak() {
console.log(`๐ค ์ ๋ ${this.name}์
๋๋ค. ๋น๋ฐ๋ฒํธ๋ ${HidePassword(this._password)}`);
}
viewPassword() {
const hasOwnPassword = this.#password ? this.#password : '๋น๋ฐ๋ฒํธ๊ฐ ์์ต๋๋ค.';
console.log(`๐ ${hasOwnPassword}`);
}
}
const testBot1 = new Robot("๋ก๋ด1", "1234");
const testBot2 = new Robot("๋ก๋ด2");
testBot1.speak(); // = '๐ค ์ ๋ ๋ก๋ด1์
๋๋ค. ๋น๋ฐ๋ฒํธ๋ ๊ด๋ฆฌ์๋ง ๋ณผ ์ ์์ด์! ๐ซ'
testBot2.speak(); // = '๐ค ์ ๋ ๋ก๋ด2์
๋๋ค. ๋น๋ฐ๋ฒํธ๋ ๊ด๋ฆฌ์๋ง ๋ณผ ์ ์์ด์! ๐ซ'
testBot1.viewPassword(); // = '๐ 1234'
testBot2.viewPassword(); // = '๐ ๋น๋ฐ๋ฒํธ๊ฐ ์์ต๋๋ค.'
๐๐ปโ๏ธ ์์ฝ
- ์๋ฐ์คํฌ๋ฆฝํธ์์ class๋ ํจ์์ ํ ์ข
๋ฅ๋ก ๊ฐ์ฒด๋ฅผ ์์ฐํ๋ ๋ถ์ด๋นต ํ๊ณผ ๊ฐ์ ๊ฐ๋
์ผ๋ก ํํ ์ค๋ช
ํ๋๋ฐ,
์์ฐ๋๋ฉด ํน์ ์ฒญ์ฌ์ง์ด๋ผ๊ณ ๋ ํํํ ์ ์๋ค. - constructor()๋ new ์ฐ์ฐ์๋ก ํธ์ถ๋๋ ์ธ์คํด์ค์ ๊ธฐ๋ณธ ์ํ๋ฅผ ์๋์ผ๋ก ์ค์ ํด์ฃผ๋ ์์ฑ์ ๋ฉ์๋.ํน๋ณํ ์ ์ฐจ ์์ด ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ ํ ์ ์๋ค.
- ํด๋์ค์ ์์์ extends ํค์๋๋ฅผ ์ฌ์ฉ.
- ๋ถ๋ชจ class์๊ฒ ์์์ ๋ฐ๋ ์์ class๋ ์๋ธ ํด๋์ค(subclass) ํน์ ํ์ ํด๋์ค(derived class) ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- super() ํจ์๋ ๋ถ๋ชจ ํด๋์ค์ constructor ์์ฑ์ ์์์ํค๋ ํน์ํ ๋ฉ์๋.
- ๋น๊ณต๊ฐ ํ๋กํผํฐ๋ ๊ฐ์ฒด ์์ ์ค์ํ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ๋ณดํธํ์ฌ ํ๋ก๊ทธ๋จ์ด ๋ปํ์ง ์๊ฒ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ง๋ ์ญํ .
Closerํจํด์ ํ์ฉํ๊ฑฐ๋ ํด์ํ๊ทธ(#)๊ธฐํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. - get set ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด์ ํ๋กํผํฐ์ ์ ๊ทผํ๋ฏ ๊ฐ์ ๋ค๋ฃฐ์ ์๊ฒ ๋๋๋ฐ
๊ฐ์ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉํ๋ ํจ์๋ฅผ getter ๊ฐ์ ์ค์ ํ ๋ ์ฌ์ฉํ๋ ํจ์๋ค์ setter ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ฐ์ํ