OOP: 다형성

hwisaac·2023년 2월 25일
0

객체 지향 프로그래밍에서 다형성(Polymorphism)은 객체 지향의 주요 개념 중 하나로, 같은 이름의 메서드나 연산자가 다른 클래스에 대해 다른 동작을 하도록 하는 것을 말합니다.

다형성은 객체 지향 프로그래밍의 상속과 인터페이스 개념을 기반으로 합니다.

다형성을 사용하면 코드의 재사용성과 유연성이 향상되며, 코드의 가독성도 높아집니다.

이를 통해 객체 지향 프로그래밍에서는 다양한 객체를 상속하거나 인터페이스를 구현하는 클래스가 같은 이름의 메서드나 연산자를 가질 수 있으며, 이들이 다른 동작을 수행할 수 있습니다.

다형성 분류

객체 지향 프로그래밍에서 다형성은 크게 두 가지로 분류할 수 있습니다.

  1. 메서드 오버라이딩(Method Overriding) : 부모 클래스의 메서드를 자식 클래스에서 재정의하여 사용하는 것을 말합니다. 이를 통해 자식 클래스는 부모 클래스의 메서드를 재활용하면서, 독자적인 기능을 추가할 수 있습니다.

  2. 메서드 오버로딩(Method Overloading) : 같은 이름의 메서드를 다양한 매개변수 타입과 개수로 오버로딩하여 사용하는 것을 말합니다. 오버로딩은 메서드 이름을 동일하게 유지하면서도, 다양한 상황에서 유연하게 대응할 수 있는 방법을 제공합니다.

메서드 오버라이딩(Method Overriding)

예를 들어, 다음과 같은 예시를 살펴보겠습니다.

class Animal {
  makeSound() {
    console.log("Animal is making a sound.");
  }
}

class Dog extends Animal {
  makeSound() {
    console.log("Dog is barking.");
  }
}

class Cat extends Animal {
  makeSound() {
    console.log("Cat is meowing.");
  }
}

const animal = new Animal();
const dog = new Dog();
const cat = new Cat();

animal.makeSound(); // Animal is making a sound.
dog.makeSound(); // Dog is barking.
cat.makeSound(); // Cat is meowing.

위 코드에서 Animal 클래스는 makeSound 메서드를 가지고 있습니다.

Dog와 Cat 클래스는 Animal 클래스를 상속받으며, makeSound 메서드를 오버라이딩합니다.

이를 통해 Dog와 Cat 객체는 makeSound 메서드를 각각 오버라이딩하여 동작을 다르게 수행할 수 있습니다.

위 예시에서는 메서드 오버라이딩을 사용하여 다형성을 구현하였지만, 메서드 오버로딩을 통해서도 다형성을 구현할 수 있습니다

메서드 오버로딩(Method Overloading)

메서드 오버로딩(Method Overloading)은 같은 이름의 메서드를 다양한 매개변수 타입과 개수로 오버로딩하여 사용하는 것을 말합니다.

이를 통해 다양한 상황에서 유연하게 대응할 수 있는 방법을 제공합니다. 메서드 오버로딩을 이용하여 다형성을 구현하는 예시를 살펴보겠습니다.

예를 들어, 다음과 같은 계산기 클래스를 고려해보겠습니다.

class Calculator {
  add(a: number, b: number): number {
    return a + b;
  }
  
  add(a: string, b: string): string {
    return a + b;
  }
}

const calculator = new Calculator();

console.log(calculator.add(1, 2)); // 3
console.log(calculator.add("Hello, ", "world!")); // Hello, world!

위 코드에서 Calculator 클래스는 add 메서드를 가지고 있습니다. add 메서드는 숫자 두 개를 더하거나, 문자열 두 개를 이어 붙이는 역할을 합니다.

이를 위해 add 메서드를 오버로딩하여, 매개변수 타입에 따라 다르게 동작하도록 합니다.

add 메서드는 숫자 두 개를 더하는 메서드와, 문자열 두 개를 이어 붙이는 메서드로 두 가지 버전이 오버로딩되어 있습니다.

이를 통해, 매개변수 타입에 따라서 add 메서드가 다르게 동작할 수 있으며, 이를 다형성을 통해 구현할 수 있습니다.

메서드 오버로딩은 매개변수 타입에 따라 동작이 달라지는 것이기 때문에, 오버로딩된 메서드가 많아지면 코드의 가독성이 떨어질 수 있습니다.

따라서, 메서드 오버라이딩을 사용하여 다형성을 구현할 때는 필요한 메서드만 오버라이딩하도록 주의해야 합니다.

다형성이 주는 장점과 단점

다형성을 사용하는 것은 코드의 재사용성과 유연성을 높여주지만, 코드의 복잡성과 디버깅 어려움, 성능 손실 등의 단점이 발생할 수 있으므로, 다형성을 적절하게 사용하는 것이 중요합니다.

적절한 다형성을 사용하면 코드의 재사용성과 유연성을 높이고, 불필요한 코드 중복과 결합도를 낮춰 유지보수성을 높일 수 있습니다.

장점

  1. 코드 재사용성(Reuse) : 다형성을 사용하면 코드의 재사용성이 높아집니다. 동일한 코드가 다른 클래스에서 재사용될 수 있으므로, 개발자는 코드의 중복을 줄이고 생산성을 향상시킬 수 있습니다.

  2. 유연성(Flexibility) : 다형성을 사용하면 객체의 형식을 추상화하고, 이를 사용하는 다른 객체에서 동일한 인터페이스를 사용할 수 있습니다. 이를 통해 객체 간의 결합도를 낮추고, 코드의 유연성과 확장성을 높일 수 있습니다.

  3. 코드 가독성(Readability) : 다형성을 사용하면 동일한 이름을 가진 메서드나 연산자가 서로 다른 동작을 하기 때문에, 코드의 가독성이 높아집니다. 이를 통해 개발자는 코드를 더 쉽게 이해하고, 유지보수를 수행할 수 있습니다.

단점

  1. 복잡성(Complexity) : 다형성을 사용하면 코드의 복잡성이 증가할 수 있습니다. 다른 클래스에서 동일한 이름의 메서드나 연산자를 사용하기 때문에, 코드의 동작을 이해하는 데 어려움이 있을 수 있습니다.

  2. 오버헤드(Overhead) : 다형성을 사용하면, 런타임 시에 메서드나 연산자의 동작을 결정하기 위해 추가적인 연산이 필요할 수 있습니다. 이를 통해 일부 성능 손실이 발생할 수 있습니다.

  3. 디버깅(Difficulty of debugging) : 다형성을 사용하면, 코드의 실행 경로가 다양해져 디버깅이 어려울 수 있습니다. 이를 위해 디버깅을 위한 툴과 기법을 익혀야 하며, 이는 추가적인 학습 비용이 발생할 수 있습니다.

0개의 댓글