4.1 ์์ โ ์ด๊ฑด ์ ๋ง ์ฌ์
์์์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ (OOP)์ ๊ธฐ๋ณธ ๊ฐ๋ ์ค ํ๋์ผ. ์ด๊ฑธ๋ก ํ๋์ ํด๋์ค(์์ ํด๋์ค ๋๋ ์๋ธํด๋์ค๋ผ๊ณ ํด) ๋ค๋ฅธ ํด๋์ค(๋ถ๋ชจ ํด๋์ค ๋๋ ์ํผํด๋์ค๋ผ๊ณ ๋ถ๋ฌ)์ ํ๋์ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ ์์ด.

์ด ๋ฐฉ๋ฒ์ผ๋ก ์ผ๋ฐ์ ์ธ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ด. ๊ทธ๋์ ์ฝ๋ ์กฐ์ง๊ณผ ์ ์ง ๋ณด์๊ฐ ๋ ์ข์์ ธ.
์ ์์์ด ํ์ํ ๊น?
์๋ฅผ ๋ค์ด ์ด๋ค ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด๋ด. ๊ทธ๋ฆฌ๊ณ ์ด๊ฑธ ํด๋์ค ํํ๋ก ์์ฑํ๊ธฐ๋ก ํ๋ค๊ณ ์น์. ๊ทธ๋ฐ๋ฐ ํ๋ก์ ํธ์ ์ด๋ฏธ ๋น์ ์ด ์ํ๋ ๊ฑฐ์ ๋ชจ๋ ์์ ์ ํ๋ ํด๋์ค๊ฐ ์๋ค๊ณ ํ์. ๊ทธ๋ผ ๊ทธ๋ฅ ๊ทธ ํด๋์ค์ ์ฝ๋๋ฅผ ๋ณต์ฌํด์ ์ฌ์ฉํด๋ ๋ผ.
์๋๋ฉด "๋ณต์ฌํ ๊ฒ์ฒ๋ผ" ํ ์๋ ์์ง. ๊ทธ ํด๋์ค๋ฅผ ์์ ์ ํด๋์ค์ ๋ถ๋ชจ๋ก ์ ์ธํ๋ฉด JavaScript๊ฐ ๋น์ ์ ํด๋์ค์ ๋ถ๋ชจ ํด๋์ค์ ํ๋์ ์ถ๊ฐํ ๊ฑฐ์ผ.
๋ง์น ์์ฐ์ด ๋๊ณ ์ถ๊ณ ๊ฐ๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๊ณ ์์ํด๋ด. ๋ฐํ ๋ฆฌ์๋ก ๊ฐ๋ฅผ ๋ง๋๋ ๋ฐ 10์ต๋ ๊ฑธ๋ฆด๊น, ์๋๋ฉด 20๋ง๋ ๋ง์ ๋๋๋ฅผ ๊ธธ๋ค์ด๋ ๊ฒ ๋ ๋น ๋ฅผ๊น?
4.2 ํ๋กํ ํ์ ์ ํตํ ์์์ ๊ฐ๋
JavaScript์์์ ํ๋กํ ํ์ ์์์ ๊ฐ์ฒด๋ค์ด ๋ค๋ฅธ ๊ฐ์ฒด์ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ ์๊ฒ ํ๋ ์ฃผ์ ๋ฉ์ปค๋์ฆ ์ค ํ๋์ผ. ์ด๋ ๊ฒ ํ๋ฉด ๋ณต์กํ ๊ฐ์ฒด ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ณ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ด.
JavaScript์ ๋ชจ๋ ๊ฐ์ฒด๋ ์์ ์ ํ๋กํ ํ์ ์ ๊ฐ๋ฆฌํค๋ ์จ๊ฒจ์ง ์์ฑ [[Prototype]]์ ๊ฐ์ง๊ณ ์์ด. ํ๋กํ ํ์ ์ ์์์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉ๋๊ณ , ์ด๋ฅผ ํตํด ๊ฐ์ฒด๋ค์ด ๋ค๋ฅธ ๊ฐ์ฒด๋ก๋ถํฐ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ ์์ด.
๊ฐ๋จํ ์์ ์์
๋จ๊ณ 1: ๊ธฐ๋ณธ ๊ฐ์ฒด ์์ฑํ๊ธฐ
const animal = {
eat() {
console.log('Eating...');
},
sleep() {
console.log('Sleeping...');
}
};
๋จ๊ณ 2: ์์ ๊ฐ์ฒด ์์ฑํ๊ธฐ
const dog = Object.create(animal);
dog.bark = function() {
console.log('Barking...');
};
๋จ๊ณ 3: ์์๋ ์์ฑ๊ณผ ๋ฉ์๋ ์ฌ์ฉํ๊ธฐ
dog.eat(); // ๊ฒฐ๊ณผ: Eating...
dog.sleep(); // ๊ฒฐ๊ณผ: Sleeping...
dog.bark(); // ๊ฒฐ๊ณผ: Barking...
์ด ์์ ์์ dog
๊ฐ์ฒด๋ animal
๊ฐ์ฒด๋ก๋ถํฐ eat()
๊ณผ sleep()
๋ฉ์๋๋ฅผ ์์๋ฐ๊ณ ์์ ๋ง์ bark()
๋ฉ์๋๋ฅผ ์ถ๊ฐํด.
4.3 ๊น์ ํ๋กํ ํ์ ์ ํตํ ์์
ํ๋กํ ํ์ ์ฒด์ธ
JavaScript์์ ๊ฐ์ฒด๋ค์ด ์๋ก ์์๋์ด ํ๋กํ ํ์ ์ฒด์ธ์ ํ์ฑํ ๋ ์์์ ๋ ๋ณต์กํด์ง ์ ์์ด.
ํ๋กํ ํ์ ์ฒด์ธ ์์
์ด ์์ ์์ dog
๊ฐ์ฒด๋ mammal
๊ฐ์ฒด๋ก๋ถํฐ ์์๋ฐ๊ณ , mammal
์ animal
๋ก๋ถํฐ ์์๋ฐ์. ์ด๋ ๊ฒ ํ๋ฉด dog
๋ mammal
๊ณผ animal
์ ๋ชจ๋ ๋ฉ์๋์ ์ ๊ทผํ ์ ์๋ ํ๋กํ ํ์
์ฒด์ธ์ ์์ฑํด.
const animal = {
eat() {
console.log('Eating...');
}
};
const mammal = Object.create(animal);
mammal.walk = function() {
console.log('Walking...');
};
const dog = Object.create(mammal);
dog.bark = function() {
console.log('Barking...');
};
dog.eat(); // ๊ฒฐ๊ณผ: Eating...
dog.walk(); // ๊ฒฐ๊ณผ: Walking...
dog.bark(); // ๊ฒฐ๊ณผ: Barking...
ํ๋กํ ํ์ ์ฒด์ธ ํ์ธ
isPrototypeOf()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋กํ ํ์
์ธ์ง๋ฅผ ํ์ธํ ์ ์์ด.
์์ :
console.log(animal.isPrototypeOf(mammal)); // ๊ฒฐ๊ณผ: true
console.log(mammal.isPrototypeOf(dog)); // ๊ฒฐ๊ณผ: true
console.log(animal.isPrototypeOf(dog)); // ๊ฒฐ๊ณผ: true
4.4 ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ
ํ๋กํ ํ์ ์์์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ๊ธฐ์กด ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํด.
๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ ์์
์ด ์์ ์์ dog
๊ฐ์ฒด์ speak()
๋ฉ์๋๋ animal
๊ฐ์ฒด์ speak()
๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด.
const animal = {
speak() {
console.log('Animal speaks');
}
};
const dog = Object.create(animal);
dog.speak = function() {
console.log('Dog barks');
};
animal.speak(); // ๊ฒฐ๊ณผ: Animal speaks
dog.speak(); // ๊ฒฐ๊ณผ: Dog barks
๋ถ๋ชจ ๊ฐ์ฒด ๋ฉ์๋ ํธ์ถ
JavaScript์์ ๋ถ๋ชจ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ค๋ฉด call()
๋๋ apply()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ด.
์์ :
const animal = {
speak() {
console.log('Animal speaks');
}
};
const dog = Object.create(animal);
dog.speak = function() {
animal.speak.call(this);
console.log('Dog barks');
};
dog.speak();
// ๊ฒฐ๊ณผ:
// Animal speaks
// Dog barks
4.5 ํ๋กํ ํ์ ์์์ ์ฌํ๋ ์ฌ์ฉ๋ฒ
๋ด์ฅ ๊ฐ์ฒด ํ์ฅ
JavaScript์ ๋ด์ฅ ๊ฐ์ฒด๋ฅผ ํ์ฅํ์ฌ ๊ทธ๋ค์ ํ๋กํ ํ์ ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ด.
์์ :
Array.prototype.sum = function() {
return this.reduce((acc, value) => acc + value, 0);
};
const numbers = [1, 2, 3, 4, 5];
console.log(numbers.sum()); // ๊ฒฐ๊ณผ: 15
๋ค๋จ๊ณ ๊ณ์ธต ๊ตฌ์กฐ ์์ฑ
ํ๋กํ ํ์ ์์์ ์ฌ์ฉํ์ฌ ๋ณด๋ค ๋ณต์กํ ๋ค๋จ๊ณ ๊ฐ์ฒด ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์์ฑํ ์ ์์ด.
์์ :
const livingBeing = {
breathe() {
console.log('Breathing...');
}
};
const animal = Object.create(livingBeing);
animal.eat = function() {
console.log('Eating...');
};
const mammal = Object.create(animal);
mammal.walk = function() {
console.log('Walking...');
};
const dog = Object.create(mammal);
dog.bark = function() {
console.log('Barking...');
};
dog.breathe(); // ๊ฒฐ๊ณผ: Breathing...
dog.eat(); // ๊ฒฐ๊ณผ: Eating...
dog.walk(); // ๊ฒฐ๊ณผ: Walking...
dog.bark(); // ๊ฒฐ๊ณผ: Barking...
GO TO FULL VERSION