μλ°μ€ν¬λ¦½νΈλ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(OOP)μ κ°λ ₯ν κΈ°λ₯μ μ§μνλ μΈμ΄μ λλ€. νΉν νλ‘ν νμ κΈ°λ° μμ λ©μ»€λμ¦μ ν΅ν΄ μ½λ μ¬μ¬μ©μ±κ³Ό μ μ°μ±μ λμΌ μ μμ΅λλ€. μ΄λ² ν¬μ€ν μμλ μλ°μ€ν¬λ¦½νΈμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° κ°λ κ³Ό νλ‘ν νμ μ νμ©ν μμ λ°©λ²μ λν΄ μμλ³΄κ² μ΅λλ€.
β£ λͺ©μ°¨
01. μμμ κΈ°λ³Έ κ°λ π
μμ(Inheritance)μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμ μ€μν κ°λ μ€ νλλ‘, κΈ°μ‘΄μ ν΄λμ€λ₯Ό μ¬μ¬μ©νμ¬ μλ‘μ΄ ν΄λμ€λ₯Ό λ§λλ λ°©λ²μ λλ€. μμμ ν΅ν΄ μ½λμ μ¬μ¬μ©μ±μ λμ΄κ³ , μ μ§λ³΄μμ±μ ν₯μν μ μμ΅λλ€. μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ κΈ°λ°μ μΈμ΄λ‘, λ€λ₯Έ κ°μ²΄ μ§ν₯ μΈμ΄μλ λ€λ₯΄κ² μμμ ꡬνν©λλ€.
02. νλ‘ν νμ κΈ°λ° μμ μ΄ν΄νκΈ°π
μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ κΈ°λ° μΈμ΄λ‘, κ°μ²΄κ° λ€λ₯Έ κ°μ²΄μ μμ±κ³Ό λ©μλλ₯Ό μμλ°μ μ μλ λ©μ»€λμ¦μ μ 곡ν©λλ€. λͺ¨λ μλ°μ€ν¬λ¦½νΈ κ°μ²΄λ μ¨κ²¨μ§ νλ‘ν νμ μμ±μ κ°μ§λ©°, μ΄λ₯Ό ν΅ν΄ μμμ ꡬνν μ μμ΅λλ€. νλ‘ν νμ κΈ°λ° μμμ μ£Όμ κ°λ κ³Ό μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
1. νλ‘ν νμ 체μΈ
μλ°μ€ν¬λ¦½νΈμ κ° κ°μ²΄λ λ€λ₯Έ κ°μ²΄λ₯Ό μ°Έμ‘°νλ νλ‘ν νμ (νλ‘ν )μ κ°μ§κ³ μμ΅λλ€. κ°μ²΄κ° νΉμ μμ±μ΄λ λ©μλλ₯Ό μ°Ύμ λ, λ¨Όμ μμ μ΄ κ°μ§ μμ±κ³Ό λ©μλλ₯Ό κ²μνκ³ , μ‘΄μ¬νμ§ μμ κ²½μ° νλ‘ν νμ 체μΈμ λ°λΌκ°λ©° μμ κ°μ²΄λ₯Ό κ²μν©λλ€. μ΄ κ³Όμ μ ν΅ν΄ κ°μ²΄λ λ€λ₯Έ κ°μ²΄μ μμ±κ³Ό λ©μλλ₯Ό μμλ°μ΅λλ€.
2. ν¨μ μμ±μμ νλ‘ν νμ
ν¨μ μμ±μλ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μμ±νκ³ , νλ‘ν νμ μ ν΅ν΄ μμμ ꡬνν μ μμ΅λλ€. ν¨μ μμ±μλ μλ‘μ΄ κ°μ²΄λ₯Ό λ§λ€κΈ° μν ν νλ¦Ώ μν μ νλ©°, μμ±λ κ°μ²΄λ ν΄λΉ ν¨μ μμ±μμ νλ‘ν νμ μ μμλ°μ΅λλ€.
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(`${this.name}μ΄(κ°) μ리λ₯Ό λ
λλ€.`);
};
const dog = new Animal('κ°μμ§');
dog.speak(); // κ°μμ§μ΄(κ°) μ리λ₯Ό λ
λλ€.
μ μμ μμ Animal ν¨μ μμ±μλ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νλ ν νλ¦Ώ μν μ ν©λλ€. Animal.prototypeμ μ μλ speak λ©μλλ dog κ°μ²΄μμ μ¬μ©ν μ μμ΅λλ€.
3. νλ‘ν νμ μμ ꡬν
νλ‘ν νμ μ μ¬μ©νμ¬ ν κ°μ²΄κ° λ€λ₯Έ κ°μ²΄λ₯Ό μμλ°λλ‘ κ΅¬νν μ μμ΅λλ€. μ΄λ₯Ό μν΄ Object.create λ©μλλ₯Ό μ¬μ©νμ¬ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νκ³ , ν΄λΉ κ°μ²΄μ νλ‘ν νμ μ μ€μ ν μ μμ΅λλ€.
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(`${this.name}μ΄(κ°) μ리λ₯Ό λ
λλ€.`);
};
function Dog(name) {
Animal.call(this, name); // λΆλͺ¨ μμ±μλ₯Ό νΈμΆνμ¬ μμ
}
Dog.prototype = Object.create(Animal.prototype); // νλ‘ν νμ
체μΈμ μ€μ
Dog.prototype.constructor = Dog; // μμ±μλ₯Ό λ€μ μ€μ
Dog.prototype.speak = function() {
console.log(`${this.name}μ΄(κ°) λ©λ© μ§μ΅λλ€.`);
};
const dog = new Dog('κ°μμ§');
dog.speak(); // κ°μμ§μ΄(κ°) λ©λ© μ§μ΅λλ€.
μ μμ μμ Dog μμ±μλ Animal μμ±μλ₯Ό νΈμΆνμ¬ name μμ±μ μμλ°μ΅λλ€. Dog.prototypeμ Object.createλ₯Ό μ¬μ©νμ¬ Animal.prototypeμ μμλ°λλ‘ μ€μ λμκ³ , μμ±μλ₯Ό λ€μ Dogλ‘ μ€μ νμ¬ μ¬λ°λ₯Έ μ°Έμ‘°λ₯Ό μ μ§ν©λλ€. μ΄ν Dog.prototypeμ μλ‘μ΄ speak λ©μλλ₯Ό μ μνμ¬ Animalμ speak λ©μλλ₯Ό μ€λ²λΌμ΄λν©λλ€.
4. νλ‘ν νμ 체μΈμ λμ λ°©μ
νλ‘ν νμ 체μΈμ ν΅ν΄ κ°μ²΄λ μμ κ°μ²΄μ μμ±κ³Ό λ©μλλ₯Ό μ¬μ©ν μ μμ΅λλ€. κ°μ²΄κ° νΉμ μμ±μ΄λ λ©μλλ₯Ό μ°Ύμ§ λͺ»νλ©΄, νλ‘ν νμ 체μΈμ λ°λΌ μμ κ°μ²΄λ‘ κ²μμ κ³μν©λλ€.
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(dog instanceof Object); // true
μ μμ μμ dog κ°μ²΄λ Dog, Animal, Objectμ μΈμ€ν΄μ€μ λλ€. μ΄λ νλ‘ν νμ 체μΈμ λ°λΌκ°λ©° μμ ꡬ쑰λ₯Ό νμΈν μ μμμ 보μ¬μ€λλ€.
03. ES6 ν΄λμ€ μμπ
ECMAScript 6(ES6)μμλ ν΄λμ€λ₯Ό μ¬μ©νμ¬ λ μ§κ΄μ μ΄κ³ κ°νΈνκ² μμμ ꡬνν μ μλ λ¬Έλ²μ λμ
νμ΅λλ€. classμ extends ν€μλλ₯Ό μ¬μ©νμ¬ ν΄λμ€λ₯Ό μ μνκ³ μμνλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€.
μλ°μ€ν¬λ¦½νΈ ν΄λμ€μ κ΄ν λ΄μ©μ μλ ν¬μ€ν
μ μ°Έκ³ ν΄ μ£ΌμΈμπ
1. ν΄λμ€ μ μνκΈ°
ES6μμλ class ν€μλλ₯Ό μ¬μ©νμ¬ ν΄λμ€λ₯Ό μ μν μ μμ΅λλ€. ν΄λμ€λ μμ±μ(constructor)μ λ©μλλ₯Ό ν¬ν¨ν μ μμ΅λλ€.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name}μ΄(κ°) μ리λ₯Ό λ
λλ€.`);
}
}
const animal = new Animal('λλ¬Ό');
animal.speak(); // λλ¬Όμ΄(κ°) μ리λ₯Ό λ
λλ€.
2. ν΄λμ€ μμνκΈ°
ν΄λμ€λ₯Ό μμνλ €λ©΄ extends ν€μλλ₯Ό μ¬μ©ν©λλ€. μμ ν΄λμ€λ λΆλͺ¨ ν΄λμ€μ λͺ¨λ μμ±κ³Ό λ©μλλ₯Ό μμλ°μΌλ©°, νμμ λ°λΌ λ©μλλ₯Ό μ¬μ μ(μ€λ²λΌμ΄λ)ν μ μμ΅λλ€.
class Dog extends Animal {
speak() {
console.log(`${this.name}μ΄(κ°) λ©λ© μ§μ΅λλ€.`);
}
}
const dog = new Dog('κ°μμ§');
dog.speak(); // κ°μμ§μ΄(κ°) λ©λ© μ§μ΅λλ€.
3. super ν€μλ μ¬μ©νκΈ°
μμ ν΄λμ€μμ λΆλͺ¨ ν΄λμ€μ μμ±μμ λ©μλλ₯Ό νΈμΆν λ super ν€μλλ₯Ό μ¬μ©ν©λλ€. superλ λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό νΈμΆνκ±°λ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μ°Έμ‘°ν λ μ¬μ©λ©λλ€.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name}μ΄(κ°) μ리λ₯Ό λ
λλ€.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // λΆλͺ¨ ν΄λμ€μ μμ±μ νΈμΆ
this.breed = breed;
}
speak() {
super.speak(); // λΆλͺ¨ ν΄λμ€μ λ©μλ νΈμΆ
console.log(`${this.name}μ΄(κ°) λ©λ© μ§μ΅λλ€.`);
}
}
const dog = new Dog('κ°μμ§', 'μ§λκ°');
dog.speak();
// κ°μμ§μ΄(κ°) μ리λ₯Ό λ
λλ€.
// κ°μμ§μ΄(κ°) λ©λ© μ§μ΅λλ€.
console.log(dog.breed); // μ§λκ°
4. ν΄λμ€ μμμ μ€μ μμ
λ€μμ κ³ΌμΌ ν΄λμ€μ μμμ μ¬μ©νμ¬ λΉ¨κ°μ κ³ΌμΌκ³Ό μ΄λ‘μ κ³ΌμΌμ ꡬλΆνλ μμ μ λλ€.
class Fruit {
constructor(korean, english) {
this.korean = korean;
this.english = english;
}
describe() {
return `${this.korean} (${this.english})`;
}
}
class RedFruit extends Fruit {
color() {
return 'λΉ¨κ°μ κ³ΌμΌμ
λλ€.';
}
}
class GreenFruit extends Fruit {
color() {
return 'μ΄λ‘μ κ³ΌμΌμ
λλ€.';
}
}
const strawberry = new RedFruit('λΈκΈ°', 'strawberry');
console.log(strawberry.describe()); // λΈκΈ° (strawberry)
console.log(strawberry.color()); // λΉ¨κ°μ κ³ΌμΌμ
λλ€.
const watermelon = new GreenFruit('μλ°', 'watermelon');
console.log(watermelon.describe()); // μλ° (watermelon)
console.log(watermelon.color()); // μ΄λ‘μ κ³ΌμΌμ
λλ€.
04. μμ μμ : μ€μ μ½λπ»
μλ°μ€ν¬λ¦½νΈ μμμ νμ©ν μ€μ μμ λ₯Ό μ΄ν΄λ΄ λλ€. λ¨Όμ νλ‘ν νμ κΈ°λ° μμμ ν΅ν΄ κ°μ²΄λ₯Ό νμ₯νλ λ°©λ²μ λ³΄κ² μ΅λλ€.
// νλ‘ν νμ
κΈ°λ° μμ μ€μ μμ
function Vehicle(make, model) {
this.make = make;
this.model = model;
}
Vehicle.prototype.getDetails = function() {
return `${this.make} ${this.model}`;
};
function Car(make, model, doors) {
Vehicle.call(this, make, model);
this.doors = doors;
}
Car.prototype = Object.create(Vehicle.prototype);
Car.prototype.constructor = Car;
Car.prototype.getDetails = function() {
return `${this.make} ${this.model}, ${this.doors} doors`;
};
const car = new Car('Toyota', 'Corolla', 4);
console.log(car.getDetails()); // Toyota Corolla, 4 doors
05. μμμ μ₯λ¨μ λΆμβοΈ
μλ°μ€ν¬λ¦½νΈ μμμ μ½λμ μ¬μ¬μ©μ±μ λμ΄κ³ , ꡬ쑰μ μΈ νλ‘κ·Έλλ°μ κ°λ₯νκ² νλ μ€μν κΈ°λ₯μ λλ€. κ·Έλ¬λ μμμ μ¬μ©ν λλ μ£Όμν΄μΌ ν μ λ μμ΅λλ€. μ¬κΈ°μλ μλ°μ€ν¬λ¦½νΈ μμμ μ₯λ¨μ μ μ΄ν΄λ³΄κ² μ΅λλ€.
μ₯μ
1. μ½λ μ¬μ¬μ©μ± μ¦κ°
- μμμ ν΅ν΄ 곡ν΅λ κΈ°λ₯μ λΆλͺ¨ ν΄λμ€μ μ μνκ³ , μ΄λ₯Ό μμ ν΄λμ€μμ μ¬μ¬μ©ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ½λ μ€λ³΅μ μ€μ΄κ³ , μ μ§λ³΄μκ° μ©μ΄ν΄μ§λλ€.
2. ꡬ쑰μ μ΄κ³ μ½κΈ° μ¬μ΄ μ½λ μμ± κ°λ₯
- μμμ μ¬μ©νλ©΄ ν΄λμ€ κ°μ κ΄κ³κ° λͺ νν΄μ§κ³ , μ½λμ κ΅¬μ‘°κ° μ²΄κ³μ μ΄λ©° μ½κΈ° μ½κ² λ©λλ€. μ΄λ νμ μ μ½λμ μ΄ν΄λμ μ μ§λ³΄μμ±μ λμ΄λ λ° λμμ΄ λ©λλ€.
3. μ μ§λ³΄μμ± ν₯μ
- 곡ν΅λ κΈ°λ₯μ λΆλͺ¨ ν΄λμ€μ μ μνλ©΄, ν΄λΉ κΈ°λ₯μ μμ ν λ λͺ¨λ μμ ν΄λμ€μμ μλμΌλ‘ μ μ©λ©λλ€. μ΄λ₯Ό ν΅ν΄ μ μ§λ³΄μκ° μ©μ΄ν΄μ§κ³ , μΌκ΄μ±μ μ μ§ν μ μμ΅λλ€.
λ¨μ
1. κ³Όλν μμ ꡬ쑰λ 볡μ‘λλ₯Ό μ¦κ°μν΄
- μμ κ΅¬μ‘°κ° λ무 κΉκ±°λ 볡μ‘νλ©΄ μ½λμ μ΄ν΄λκ° λ¨μ΄μ§κ³ , λλ²κΉ μ΄ μ΄λ €μμ§ μ μμ΅λλ€. λ°λΌμ μμμ νμν λ μ μ ν μ¬μ©νλ κ²μ΄ μ€μν©λλ€.
2. λ€μ€ μμμ΄ λΆκ°λ₯
- μλ°μ€ν¬λ¦½νΈλ λ€μ€ μμμ μ§μνμ§ μμ΅λλ€. λ°λΌμ μ¬λ¬ ν΄λμ€μ κΈ°λ₯μ λμμ μμλ°μμΌ ν λλ λ―Ήμ€μΈ ν¨ν΄μ μ¬μ©ν΄μΌ ν©λλ€.
const canFly = {
fly() {
console.log('λ κ³ μμ΅λλ€.');
}
};
const canSwim = {
swim() {
console.log('μμνκ³ μμ΅λλ€.');
}
};
class Animal {
constructor(name) {
this.name = name;
}
}
class Duck extends Animal {
constructor(name) {
super(name);
}
}
Object.assign(Duck.prototype, canFly, canSwim);
const duck = new Duck('μ€λ¦¬');
duck.fly(); // λ κ³ μμ΅λλ€.
duck.swim(); // μμνκ³ μμ΅λλ€.
3. μμμ μ€μ© κ°λ₯μ±
- λͺ¨λ κ²½μ°μ μμμ μ¬μ©νλ κ²μ λ°λμ§νμ§ μμ΅λλ€. μμμ "is-a" κ΄κ³(ν κ°μ²΄κ° λ€λ₯Έ κ°μ²΄μ μΌμ’ μΌ λ)λ₯Ό λνλΌ λ μ¬μ©ν΄μΌ νλ©°, "has-a" κ΄κ³(ν κ°μ²΄κ° λ€λ₯Έ κ°μ²΄λ₯Ό ν¬ν¨νκ³ μμ λ)λ μ‘°ν©(Composition)μ ν΅ν΄ ꡬννλ κ²μ΄ μ’μ΅λλ€.
class Engine {
start() {
console.log('μμ§μ μμν©λλ€.');
}
}
class Car {
constructor(engine) {
this.engine = engine;
}
start() {
this.engine.start();
}
}
const engine = new Engine();
const car = new Car(engine);
car.start(); // μμ§μ μμν©λλ€.