-
ํด๋์ค์ ์์ฑ์ ํจ์์ ์ฐจ์ด์นดํ ๊ณ ๋ฆฌ ์์ 2023. 2. 27. 01:20
TLDR;
ํด๋์ค์ ์์ฑ์ ํจ์์ ์ฐจ์ด
ํด๋์ค๋ ์์ฑ์ ํจ์๋ณด๋ค ์๊ฒฉํ๋ฉฐ, ์์ฑ์ ํจ์์์๋ ์ ๊ณตํ์ง ์๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค.
- ํด๋์ค๋ฅผ new ์ฐ์ฐ์ ์์ด ํธ์ถํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ํ์ง๋ง ์์ฑ์ ํจ์๋ฅผ new ์ฐ์ฐ์ ์์ด ํธ์ถํ๋ฉด ์ผ๋ฐ ํจ์๋ก์ ํธ์ถ๋๋ค.
- ํด๋์ค๋ ์์์ ์ง์ํ๋ extends์ super ํค์๋๋ฅผ ์ ๊ณตํ๋ค.
- ํด๋์ค๋ ํธ์ด์คํ ์ด ๋ฐ์ํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋์ํ๋ค.
- ํด๋์ค ๋ด์ ๋ชจ๋ ์ฝ๋์๋ ์๋ฌต์ ์ผ๋ก strict mode๊ฐ ์ง์ ๋์ด ์คํ๋๋ค. ์์ฑ์ ํจ์๋ ์๋ฌต์ ์ผ๋ก strict mode๊ฐ ์ง์ ๋์ง ์๋๋ค.
- ํด๋์ค์ contructor, ํ๋กํ ํ์ ๋ฉ์๋, ์ ์ ๋ฉ์๋๋ ๋ชจ๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ Enumerable์ ๊ฐ์ด false๋ค. ์ฆ, ์ด๊ฑฐ๋์ง ์๋๋ค.
์ ์ ๋ฉ์๋์ ํ๋กํ ํ์ ๋ฉ์๋์ ์ฐจ์ด
- ์ ์ ๋ฉ์๋์ ํ๋กํ ํ์ ๋ฉ์๋๋ ์์ ์ด ์ํด ์๋ ํ๋กํ ํ์ ์ฒด์ธ์ด ๋ค๋ฅด๋ค. (Class vs ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด) ๋ค์ ๋งํด, ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์ ๋ฉ์๋๋ฅผ ํธ์ถํ์๊ฒฝ์ฐ, ํ๋กํ ํ์ ๋ฉ์๋๋ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๊ณ , ์ ์ ๋ฉ์๋๋ class๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- ์ ์ ๋ฉ์๋๋ ํด๋์ค๋ก ํธ์ถํ๊ณ , ํ๋กํ ํ์ ๋ฉ์๋๋ ์ธ์คํด์ค๋ก ํธ์ถํ๋ค.
- ์ ์ ๋ฉ์๋๋ ์ธ์คํด์ค ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ ์ ์์ง๋ง, ํ๋กํ ํ์ ๋ฉ์๋๋ ์ธ์คํด์ค ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
์ ์ ๋ฉ์๋๋ ์ด๋ค ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋๊ฐ?
์ ์ ๋ฉ์๋๋ ์ํ๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ฉฐ, ์์ง๋๊ฐ ๋์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์์ ์ฌ์ฉํ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ์ ์ญ ํจ์๋ก ์ ์ํ์ง ์๊ณ ๋ฉ์๋๋ก ๊ตฌ์กฐํ ํ ๋ ์ ์ฉํ๋ฐ, ๊ทธ ์์๋ก Mathํจ์์ ๊ฐ์ ํ์ค ๋นํธ์ธ ๊ฐ์ฒด๊ฐ ์๋ค.
๋ณธ ๊ธ์์๋ ํด๋์ค์ ๋ํด์ ๋ ์์๋ณด๋๋ก ํ์.
๊ฐ์ฒด๋ฅผ ์ผ์ผ์ด ๋ง๋ค์ง ์๊ณ ์์ฝ๊ฒ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์๋ค.
์์ฑ์ ํจ์
๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์๊ณผํด๋์ค
๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ด ์๋ค.์ผ๋ฐ ์์ฑ์ ํจ์๋ก ๋ง๋ค์ด๋ณด๊ธฐ
function Fruit(name, emoji){ this.name = name; this.emoji = emoji; this.display = () => { console.log(`${this.name} : ${this.emoji}`) } // return this; // ์๋ต ๊ฐ๋ฅ } const apple = new Fruit('apple', '๐'); console.log(apple.name); // ์ด๋ฐ ์์ผ๋ก ์ ๊ทผ๋ ๊ฐ๋ฅ
์์์ ๋ง๋ ์์ฑ์ ํจ์๋ฅผ ํด๋์ค๋ก ๋ง๋ค์ด๋ณด๊ธฐ
class Fruit { // ์์ฑ์(constructor) : new ํค์๋๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ํธ์ถ๋๋ ํจ์ constructor(name, emoji){ this.name = name; this.emoji = emoji; } display = () => { // function์ ๋ถ์ผ ํ์๊ฐ ์๋ค. console.log(`${this.name}: ${this.emoji}`) } } // apple์ Fruit ํด๋์ค์ ์ธ์คํด์ค์ด๋ค. const apple = new Fruit('apple', '๐');
์ ์ ๋ฉ์๋์ ํ๋กํผํฐ
์์์ ๋ง๋ ๊ฒ์ ๋ชจ๋ ์ธ์คํด์ค ๋ ๋ฒจ์ ๋ฉ์๋์ด๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ฝ ๋ชจ๋ ๊ฐ์ฒด๋ง๋ค ๋์ผํ๊ฒ ๊ฐ์ง๊ณ ์์ด์ผ ํ ์์ฑ์ด๋ ๋ฉ์๋๊ฐ ์๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น? ์ด ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ๋ฐ๋ก
ํด๋์ค ๋ ๋ฒจ์ ํ๋กํผํฐ์ ๋ฉ์๋์ธ ์ ์ ํ๋กํผํฐ์ ์ ์ ๋ฉ์๋
์ด๋ค.
์ ์ ๋ฉ์๋๋ฅผ ๋ง๋๋ ค๋ฉดstatic
ํค์๋๋ฅผ ๋ถ์ด๋ฉด ๋๋ค!class Fruit { static MAX_FRUITS = 10; // ์์ฑ์(constructor) : new ํค์๋๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ํธ์ถ๋๋ ํจ์ constructor(name, emoji){ this.name = name; this.emoji = emoji; } // ํด๋์ค ๋ ๋ฒจ์ ๋ฉ์๋ static makeRandomFruit() { // ํด๋์ค ๋ ๋ฒจ์ ๋ฉ์๋์์๋ this๋ฅผ ์ฐธ์กฐํ ์ ์์. ๊ทธ๋ฅ template์ด๊ธฐ ๋๋ฌธ return new Fruit('banana', '๐๐ป') } // ์ธ์คํด์ค ๋ ๋ฒจ์ ๋ฉ์๋ display = () => { // function์ ๋ถ์ผ ํ์๊ฐ ์๋ค. console.log(`${this.name}: ${this.emoji}`) } } const banana = Fruit.makeRandomFruit(); // ์ธ์คํด์ค๋ฅผ ํตํด์๋ ์ ๊ทผ X, ํด๋์ค๋ฅผ ํตํด์๋ง ์ ๊ทผ ๊ฐ๋ฅ // ๊ทธ๋ฆฌ๊ณ ๋ง๋ค์ด์ง ์ธ์คํด์ค ์์๋ ํด๋น ํจ์๊ฐ ์๋ค!!
์ฐ๋ฆฌ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ๋ Math, Number๋ฑ๊ณผ ๊ฐ์ ๋นํธ์ธ ๊ฐ์ฒด๋ ์ฌ์ค static ํจ์๋ค. ๋ฐ๋ผ์ object๋ฅผ ๋ง๋ค์ง ์๊ณ , ๊ฐ์ฒด ์์ ์ ์๋์ด ์๋ ํด๋น ํจ์๋ค์ ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค. ์ด์ฒ๋ผ ์ ์ ๋ฉ์๋๋ ๋น์ทํ ๋ด์ฉ์ ๋ฌถ์ด์ ๊ด๋ฆฌํ ๋ ํธํ๋ค.
Math.pow(); // ์ฌ์ค ์ด๋ฐ ๊ฒ๋ค์ static ํจ์๋ค! // object๋ฅผ ๋ง๋ค์ง ์์๋ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค! // ๋น์ทํ ๋ด์ฉ์ ๋ฌถ์ด์ ๊ด๋ฆฌํ ์ ์๋ค! Number.isFinite(1);
private ํ๋์ public ํ๋
์์์ ์ ์ ์ผ๋ก ๋ง๋ staticํจ์๋ ์ฌ์ ์๊ฐ ๊ฐ๋ฅํ๋ค. ๋ค์ ๋งํด, ์ธ๋ถ์์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. class์์ ํ๋ฒ ์ ํ๋ฉด ์ธ๋ถ์์ ๋ณ๊ฒฝ๋์ง ์๋๋ก ๋ง์์ฃผ๊ณ ์ถ๋ค๋ฉด! ์ด ๋ ์ฌ์ฉํ๋๊ฒ private ํ๋์ด๋ค. private์ผ๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ํ๋กํผํฐ๋ ๋ฉ์๋ ์์
#
์ ๋ถ์ด๋ฉด ๋๋ค. ์ฐธ๊ณ ๋ก ๋ค๋ฅธ ์ธ์ด์์๋ private, public, protected๊ฐ ์๋๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ์๋ ์ด๋ฐ ํค์๋๊ฐ ์๊ณ , ์ผ๋ฐ์ ์ผ๋ก ์์ฑํ๋ฉด ๋ชจ๋ ์ ๊ทผ ๊ฐ๋ฅํ public์ด ๋๋ค. ใฑ// ์ ๊ทผ ์ ์ด์ class Fruit { #name; // ์ด๊ฒ ํ๋์ธ๋ฐ, constructor์ ์์ผ๋ฉด ์๋ต ๊ฐ๋ฅ #emoji; #type = '๊ณผ์ผ'; // ์ด๊ธฐํ๊ฐ ๋ฏธ๋ฆฌ ๋์ด์์ constructor(name, emoji){ this.#name = name; this.#emoji = emoji; } display = () => { // function์ ๋ถ์ผ ํ์๊ฐ ์๋ค. console.log(`${this.name}: ${this.emoji}`) } } const apple = new Fruit('apple', '๐'); apple.#name = '์ค๋ ์ง'; // private์ด๊ธฐ ๋๋ฌธ์ ์ ๊ทผ ๋ถ๊ฐ๋ฅํจ undefined ์ถ๋ ฅ๋จ
ํด๋์ค์์์ Getter && Setter
์๋์ ์ฝ๋์์ fullName์ ๊ฐ์ ธ์ค๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด fullName์ด๋ ํจ์๋ฅผ ํธ์ถํด์ผ ํ๋ค.
student.fullName()
๊ทธ๋ฐ๋ฐ, ์ด๋ค ๊ฐ, ์ฆ ์ํ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฑด๋ฐ ํจ์์ฒ๋ผ ์ฐ๋๊ฒ ์กฐ๊ธ ์ด์ํ๋ค. ๊ทธ๋ฅ ํ๋กํผํฐ๋ก ๋ง๋ค๊ณ ์ถ๋ค! ์ด๋ด ๋ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก getter ์ด๋ค!class Student { constructor(firstName, lastName){ this.firstName = firstName; this.lastName = lastName; } fullName(){ return `${this.lastName} ${this.firstName}`; } } const student = new Student('์์ง', '๊น'); console.log(student.firstName); console.log(student.fullName()); // ์๋ ๊ทธ๋ฐ๋ฐ ์ด๊ฑฐ ์ฌ์ค ์ํ์ธ๋ฐ ํจ์์ฒ๋ผ ์ฐ๋๊ฒ ์ข ์ด์ํ๊ฑฐ ๊ฐ์.
Getter์ Settter๋ฅผ ์ฌ์ฉํด์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ ์ ์๊ฒ ๋ค.
class Student { constructor(firstName, lastName){ this.firstName = firstName; this.lastName = lastName; } get fullName(){ return `${this.lastName} ${this.firstName}`; } set fullName(value){ console.log(value); } } // ์ด๋ ๊ฒ getter๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด, ํ๋กํผํฐ์ฒ๋ผ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค! const student = new Student('์์ง', '๊น'); console.log(student.fullName); // getter ํธ์ถ student.fullName = '๊น์ฒ ์'; // setter ํธ์ถ
์์(ํ์ฅ extends)
extends
๋ผ๋ ํค์๋๋ฅผ ์ด์ฉํด์ ์ด๋ค ํด๋์ค์ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ ์๋ค.// Animal์ด๋ class๋ฅผ ๋ง๋ค์ด์ค๋ค. class Animal { constructor(color){ this.color = color; } eat() { console.log('๋จน์!'); } sleep(){ console.log('์๋ค'); } } // Tiger๋ผ๋ ํด๋์ค๋ Animal์ ์์๋ฅผ ๋ชจ๋ ์์๋ฐ๋๋ก ํ๋ค. class Tiger extends Animal {} const tiger = new Tiger('๋ ธ๋์ด'); tiger.sleep(); // ํ์ฅํ๊ธฐ๋๋ฌธ์ Animal์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. tiger.eat(); class Dog extends Animal{ play() { console.log('๋์์~~!') } } const dog = new Dog('๋นจ๊ฐ์ด'); dog.eat(); // ์์ํ ๋ฉ์๋ dog.play(); // ์๋ก ์ถ๊ฐํ ๋ฉ์๋
์ Dog๋ผ๋ class๋ Animal์ ์์๋ฐ์ ํ, ์๋ก์ด ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ง์ฝ์ ์๋ก์ด ํด๋์ค๋ง์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น? super๋ก ๋ถ๋ชจ๊บผ๋ฅผ ๊ฐ์ ธ์จ ํ, ์์ ๊บผ๋ฅผ ์ถ๊ฐ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค.
class Cat extends Animal{ constructor(color, ownerName){ super(color); // ๋ถ๋ชจ๊บผ ๊ฐ์ ธ์ด this.ownerName = ownerName; } // ์ค๋ฒ๋ผ์ด๋ฉ // ์์ ํด๋์ค์์ ๋ถ๋ชจํด๋์ค์ ํจ์๋ฅผ ๋ฎ์ด์์ด๋ค. eat() { super.eat(); // ์ด๋ ๊ฒ ํด์ฃผ๋ฉด, ๋ถ๋ชจ์ eat()์ด ์คํ๋๊ณ ๋์ ์๋ ์ค๋ฒ๋ผ์ด๋ฉํ ํจ์๊ฐ ํธ์ถ๋๋ค. console.log('์๊ตฌ๋จน๋๋ค!'); } } const cat = new Cat('ํ๋์ด', 'Ariel');