어제 오늘 내일

[Java] 다형성(Polymorphism) 이해하기 본문

IT/Java

[Java] 다형성(Polymorphism) 이해하기

hi.anna 2025. 12. 26. 08:55

 

Java에서 다형성(Polymorphism)은 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나로,
같은 타입(부모 타입)으로 다양한 형태(자식 객체)를 다룰 수 있는 능력을 말합니다.
즉, 하나의 타입이 여러 동작을 수행할 수 있도록 만드는 강력한 기능입니다.

1. 다형성이란?

다형성은 여러 형태를 갖는다라는 의미로, Java에서는 다음과 같은 상황에서 나타납니다:

  • 부모 타입 변수로 자식 객체를 참조할 수 있다
  • 오버라이딩된 메서드는 실제 객체 타입 기준으로 실행된다

형식:

부모클래스 변수 = new 자식클래스();

예:

Animal a = new Dog();
Animal b = new Cat();

설명

  • 같은 Animal 타입이지만, 실제 객체는 Dog 또는 Cat
  • 실제 객체 타입에 따라 동작이 달라짐

 

2. 다형성의 핵심: 오버라이딩된 메서드 실행

부모 타입으로 호출해도, 실제 객체의 메서드가 실행됩니다.

class Animal {
    void sound() {
        System.out.println("동물 소리");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("멍멍");
    }
}

class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("야옹");
    }
}

사용:

Animal a1 = new Dog();
Animal a2 = new Cat();

a1.sound(); // 멍멍
a2.sound(); // 야옹

설명

  • 변수 타입은 Animal
  • 실제 객체는 Dog 또는 Cat
  • 실행되는 메서드는 객체의 실제 타입 기준

 

3. 다형성을 사용하는 이유

✔ 코드 재사용성 증가

부모 타입으로 여러 자식 객체를 하나의 구조로 처리 가능

✔ 유지보수 쉬움

공통 기능은 부모에서 제공, 각기 다른 동작은 자식에서 구현

✔ 확장성 강화

새로운 자식 클래스 추가해도 기존 코드를 수정할 필요가 적음

예:

void makeSound(Animal a) {
    a.sound(); // 어떤 동물인지 상관없이 sound() 실행
}

 

4. 다형성과 형변환 (업캐스팅)

다형성은 업캐스팅을 전제로 합니다.

Animal a = new Dog(); // 업캐스팅

특징

  • 부모 타입으로 자식 객체를 담음
  • 부모가 가진 메서드만 호출할 수 있음 (자식의 고유 메서드는 호출 불가)
a.bark(); // ❌ 오류

 

5. 다형성과 다운캐스팅

부모 타입으로 참조했지만, 실제 자식 기능이 필요할 때는 다운캐스팅을 사용합니다.

Animal a = new Dog(); 

if (a instanceof Dog) {
    Dog d = (Dog) a; 
    d.bark(); // 자식 메서드 호출 가능
}

 

6. 다형성이 잘 활용되는 예 (전략 패턴 느낌)

class Animal {
    void sound() { }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("멍멍");
    }
}

class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("야옹");
    }
}

public class Main {
    static void printSound(Animal animal) {
        animal.sound();
    }

    public static void main(String[] args) {
        printSound(new Dog());
        printSound(new Cat());
    }
}

출력:

멍멍
야옹

설명

  • 메서드 하나로 여러 타입의 객체 동작을 처리
  • 다형성이 없었다면 동물 종류별로 조건문이 필요했을 것

 

7. 오버로딩과의 차이

개념  다형성(오버라이딩 기반)  오버로딩
목적 실제 객체 타입에 따라 다른 동작 같은 이름, 다른 파라미터
실행 기준 객체의 실제 타입 컴파일 시 결정
대표 사용 상속 + 오버라이딩 메서드 이름 재사용

다형성은 런타임 동작이 결정되는 반면, 오버로딩은 컴파일타임에 결정됩니다.

 

8. 정리

  • 다형성은 “하나의 부모 타입으로 여러 자식 객체를 다루는 능력”
  • 부모 타입 변수로 자식 객체를 담아 사용
  • 오버라이딩된 메서드가 실제 객체 기준으로 실행
  • 코드 유연성·확장성·재사용성 모두 향상

 

반응형
Comments