다형성

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2025.09.01
조회수
12
버전
v2

📋 문서 버전

이 문서는 2개의 버전이 있습니다. 현재 최신 버전을 보고 있습니다.

다형성

다형성(Polymorphism)은 객체지향프로그래밍(OOP, Object-Oriented Programming)의 핵심 개념 중 하나로, "여러 형태를 가질 수 있는 능력"을 의미합니다.는 동일한 인터페이스나 메서드를 통해 서로 다른 클래스의 객체가 각자의 방식으로 동작할 수 있도록 하는 프로그래밍 기법입니다. 다형성은 코드의 재사용성, 유연성, 유지보수성을 크게 향상시키며, 소프트웨어 설계에서 중요한 역할을 합니다.


개요

다형성은 그리스어로 "여러 형태"(poly = 여러, morph = 형태)를 뜻합니다. 프로그래밍 맥락에서 다형성이란, 하나의 메서드나 연산자가 다양한 타입의 객체에 대해 서로 다른 방식으로 동작할 수 있도록 하는 특성을 말합니다. 이는 상속과 인터페이스와 밀접하게 연결되어 있으며, 특히 부모 클래스 타입의 참조 변수가 자식 클래스의 인스턴스를 가리킬 수 있는 구조에서 주로 활용됩니다.

예를 들어, Animal이라는 부모 클래스를 상속받는 DogCat 클래스가 있을 때, makeSound() 메서드를 각각 다른 방식으로 구현할 수 있으며, Animal 타입으로 선언된 변수가 DogCat 인스턴스를 가리키더라도 적절한 makeSound()가 호출됩니다.


다형성의 종류

다형성은 일반적으로 두 가지 주요 형태로 나뉩니다.

1. 정적 다형성 (Static Polymorphism)

정적 다형성은 컴파일 타임(compile-time)에 결정되는 다형성으로, 메서드 오버로딩(Method Overloading)을 통해 구현됩니다.

메서드 오버로딩

  • 동일한 메서드 이름을 사용하지만, 매개변수의 수, 타입, 순서가 다릅니다.
  • 반환 타입만 다를 경우 오버로딩이 되지 않습니다.

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)과 상속, 인터페이스를 기반으로 합니다.

메서드 오버라이딩

  • 자식 클래스가 부모 클래스의 메서드를 재정의하여 자신만의 구현을 제공합니다.
  • 런타임에 객체의 실제 타입에 따라 호출될 메서드가 결정됩니다. 이를 동적 바인딩(Dynamic Binding)이라고 합니다.

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("야옹!");
    }
}

// 사용 예시
Animal myPet1 = new Dog();
Animal myPet2 = new Cat();

myPet1.makeSound(); // 출력: 멍멍!
myPet2.makeSound(); // 출력: 야옹!

이 예제에서 Animal 타입의 변수가 Dog 또는 Cat 객체를 참조하지만, 실제 호출되는 makeSound() 메서드는 객체의 런타임 타입에 따라 달라집니다.


다형성의 장점

다형성은 소프트웨어 개발에서 다음과 같은 장점을 제공합니다:

  • 코드 재사용성 향상: 공통 인터페이스를 통해 다양한 클래스를 동일한 방식으로 다룰 수 있습니다.
  • 유연성과 확장성: 새로운 클래스를 추가하더라도 기존 코드를 수정하지 않고도 동작 가능합니다.
  • 유지보수성: 코드의 중복을 줄이고, 변경 사항을 최소화할 수 있습니다.
  • 추상화 촉진: 구체적인 구현보다는 추상적인 인터페이스에 의존하게 되어 설계가 깔끔해집니다.

인터페이스를 통한 다형성

인터페이스는 다형성을 구현하는 또 다른 강력한 수단입니다. 여러 클래스가 동일한 인터페이스를 구현하면, 인터페이스 타입으로 그 객체들을 다룰 수 있습니다.

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[] shapes = {new Circle(), new Rectangle()};
for (Drawable shape : shapes) {
    shape.draw(); // 각 객체의 draw() 메서드가 호출됨
}

이 방식은 설계를 더욱 유연하게 만들며, 다양한 객체를 통합적으로 처리할 수 있게 해줍니다.


참고 자료 및 관련 문서

다형성은 객체지향 설계의 네 가지 주요 원칙(SOLID) 중 의존 역전 원칙(DIP)과 밀접한 관련이 있으며, 추상화에 의존하는 설계를 가능하게 합니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?