다형성: poly(많은) + morphism(형태) -> 즉, 하나의 요소가 여러 형태를 가지는 것
다형성은 상속과 밀접한 관계를 가지는 개념으로, 같은 이름의 메소드가 다른 동작을 수행할 수 있도록 하는 기능이다. 다형성을 통해 여러 객체를 일관된 방식으로 다룰 수 있으며, 코드의 가독성과 유지 보수성을 향상시킬 수 있다.
상속과 다형성 (AI가 알려주는 JavaScript - 현대 웹 개발을 위한 기초와 활용 中)
https://wikidocs.net/224805
// 부모 클래스
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name}이/가 소리를 냅니다.`);
}
}
// 자식 클래스
class Dog extends Animal {
// 메소드 오버라이딩
speak() {
console.log(`${this.name}이/가 멍멍 소리를 냅니다.`);
}
}
// 자식 클래스
class Cat extends Animal {
// 메소드 오버라이딩
speak() {
console.log(`${this.name}이/가 야옹 소리를 냅니다.`);
}
}
// 다형성 활용
const dog = new Dog('멍멍이');
const cat = new Cat('야옹이');
dog.speak(); // 출력: 멍멍이가 멍멍 소리를 냅니다.
cat.speak(); // 출력: 야옹이가 야옹 소리를 냅니다.
Animal 클래스의 speak 메서드는 자식 클래스에서 재정의(Overriding)되어 다형성을 구현한다.
의존성: 어떤 객체나 클래스가 다른 객체나 클래스의 기능에 의존하는 관계
의존성 주입은 객체가 필요로 하는 의존성을 외부에서 전달받아 사용하는 설계 패턴이다.
객체가 다른 객체를 직접 생성하지 않고, 외부에서 주입받아 사용하므로 객체 간의 결합도를 낮추고 코드의 유연성과 재사용성을 높일 수 있다.
// Engine 인터페이스처럼 동작하는 구현체들
class GasEngine {
run() {
console.log("Gas engine is running");
}
}
class ElectricEngine {
run() {
console.log("Electric engine is running");
}
}
// Car 클래스는 특정 엔진에 종속되지 않음
class Car {
constructor(engine) {
this.engine = engine; // 다형성 활용
}
drive() {
this.engine.run();
}
}
// 다양한 엔진 객체를 외부에서 주입
const gasEngine = new GasEngine();
const electricEngine = new ElectricEngine();
const car1 = new Car(gasEngine);
const car2 = new Car(electricEngine);
car1.drive(); // 출력: Gas engine is running
car2.drive(); // 출력: Electric engine is running
Engine은 Car 클래스를 동작하게 하기 위한 의존성이다.
Car 클래스는 Engine 객체(GasEngine 또는 ElectricEngine)를 직접 생성하지 않고 외부에서 주입받아 사용하는 방식을 취하고 있다.
Car 클래스가 Engine 객체의 타입(구현체)에 의존하지 않고, 공통 메서드(run)를 호출할 수 있는 구조로 다형성을 찾아볼 수 있다.
-> Car 클래스는 다양한 Engine 객체를 처리할 수 있으며, 새로운 Engine 객체를 추가해도 Car 코드를 수정할 필요가 없다.
이렇게 의존성 주입 방식을 사용하면 객체 간 결합도를 낮추고, 코드의 유연성과 테스트 용이성을 높일 수 있다.