다형성
📋 문서 버전
이 문서는 2개의 버전이 있습니다. 현재 버전 1을 보고 있습니다.
다형성
개요
다형성(Polorphism)은 객체지향프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념 중 하나로, "여러 형태를 가질 수 있는 능력" 을 의미합니다. 이는 동일한 인터페이스나 메서드를 통해 서로 다른 클래스의 객체가 각각 자신만의 방식으로 동작하도록 구현할 수 있게 해주는 특성입니다. 다형성을 통해 코드의 재사용성, 확장성, 유지보수성이 크게 향상되며, 유연한 소프트웨어 설계가 가능해집니다.
다형성은 주로 상속(Inheritance)과 메서드 오버라이딩(Method Overriding)을 기반으로 구현되며, 프로그래밍 언어가 동적 바인딩(dynamic binding) 또는 런타임 다형성(runtime polymorphism)을 지원해야 제대로 활용할 수 있습니다.
다형성의 유형
다형성은 일반적으로 두 가지 주요 유형으로 나뉩니다.
1. 정적 다형성 (Static Polymorphism)
정적 다형성은 컴파일 타임(compile-time)에 결정되는 다형성으로, 메서드 오버로딩(Method Overloading)이 대표적인 예입니다.
- 특징:
- 같은 이름의 메서드를 매개변수의 개수, 타입, 순서에 따라 여러 번 정의할 수 있음.
- 호출 시 컴파일러가 어떤 메서드를 사용할지 결정.
-
성능이 우수함 (런타임 오버헤드 없음).
-
예시 (Java):
public class Calculator { public int add(int a, int b) { return a + b; } public double add(double a, double b) { return a + b; } public int add(int a, int b, int c) { return a + b + c; }
위 코드에서 add
메서드는 인수의 타입과 개수에 따라 다른 동작을 하지만, 모두 같은 이름을 사용합니다.
2. 동적 다형성 (Dynamic Polymorphism)
동적 다형성은 런타임(runtime)에 결정되는 다형성으로, 메서드 오버라이딩(Method Overriding)과 상속, 인터페이스를 활용합니다.
- 특징:
- 부모 클래스의 참조 변수로 자식 클래스의 객체를 참조할 수 있음.
- 실제 호출되는 메서드는 객체의 실제 타입에 따라 결정됨 (가상 메서드 호출).
-
유연한 설계와 확장성 제공.
-
예시 (Java):
class Animal { public void makeSound() { System.out.println("동물이 소리를 냅니다."); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("멍멍!"); } } class Cat extends Animal { @Override public void makeSound() { System.out.println("야옹!"); } } public class Main { public static void main(String[] args) { Animal myDog = new Dog(); Animal myCat = new Cat(); myDog.makeSound(); // "멍멍!" 출력 (Dog의 메서드 호출) myCat.makeSound(); // "야옹!" 출력 (Cat의 메서드 호출) } }
이 예제에서 Animal
타입의 변수가 Dog
나 Cat
객체를 가리키지만, makeSound()
호출 시 실제 객체의 메서드가 실행됩니다. 이는 동적 바인딩의 전형적인 사례입니다.
다형성의 장점
다형성을 활용하면 다음과 같은 여러 장점을 얻을 수 있습니다.
장점 | 설명 |
---|---|
유연성 | 동일한 인터페이스로 다양한 객체를 처리할 수 있어 코드의 유연성이 높아짐. |
확장성 | 새로운 클래스를 추가하더라도 기존 코드를 수정하지 않고도 동작 가능 (OCP 준수). |
재사용성 | 공통 인터페이스를 기반으로 코드를 재사용할 수 있음. |
가독성 향상 | 추상화된 인터페이스를 사용함으로써 코드의 의미가 명확해짐. |
예를 들어, Animal
배열에 다양한 동물 객체를 저장하고 makeSound()
를 반복 호출하면, 각 객체가 자신만의 방식으로 소리를 내도록 처리할 수 있습니다.
Animal[] animals = {new Dog(), new Cat(), new Animal()};
for (Animal a : animals) {
a.makeSound(); // 각 객체의 오버라이드된 메서드가 호출됨
}
인터페이스 기반 다형성
인터페이스는 구현 클래스가 특정 행동을 따라야 함을 강제하며, 다형성을 더욱 강력하게 구현할 수 있게 해줍니다.
- 예시 (Java 인터페이스):
interface Drawable { void draw(); } class Circle implements Drawable { public void draw() { System.out.println("원을 그립니다."); } } class Rectangle implements Drawable { public void draw() { System.out.println("사각형을 그립니다."); } } // 다형성 활용 Drawable shape1 = new Circle(); Drawable shape2 = new Rectangle(); shape1.draw(); // "원을 그립니다." shape2.draw(); // "사각형을 그립니다."
인터페이스를 사용하면 서로 관련이 없는 클래스들 사이에서도 동일한 인터페이스로 통합된 방식으로 다룰 수 있습니다.
관련 개념
- 추상화(Abstraction): 다형성과 함께 사용되어 구체적인 구현을 숨기고 인터페이스에 집중하게 함.
- 캡슐화(Encapsulation): 객체의 내부 상태를 보호하고, 외부에서는 메서드를 통해만 접근하게 함.
- 상속(Inheritance): 다형성의 기반이 되는 메커니즘.
참고 자료 및 관련 문서
- Oracle Java Tutorials - Polymorphism
- Gamma, E., et al. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley.
- 객체지향 설계 원칙 (SOLID)
- 메서드 오버라이딩 vs 오버로딩
- 인터페이스와 추상 클래스의 차이점
다형성은 객체지향 프로그래밍의 진수를 보여주는 개념으로, 잘 설계된 시스템에서는 거의 모든 곳에서 그 흔적을 찾을 수 있습니다. 이를 이해하고 적절히 활용하는 것은 고급 소프트웨어 개발의 필수 조건입니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.