John's Code Journey

[JAVA] 다형성(Polymorphism) 본문

IT공부/JAVA

[JAVA] 다형성(Polymorphism)

Johnnnn 2025. 4. 23. 17:04
728x90

🧠 다형성이란?

"같은 이름(메서드, 변수 등)인데 여러 가지 형태로 동작하는 것"
→ "하나의 타입(부모)으로 여러 타입(자식)을 다룰 수 있는 것"

자바에서 다형성은 주로 상속 + 메서드 오버라이딩 + 업캐스팅을 통해 실현됨

 

🎯 다형성의 힘

  1. 코드 재사용 증가
  2. 유지보수 쉬움
  3. 확장성 좋아짐
  4. 다양한 객체를 하나의 타입으로 처리 가능!

✅ 다형성 기본 예제

1. 부모 클래스

class Animal {
    public void sound() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

 

2. 자식 클래스들 (오버라이딩)

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

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

 

3. 다형성 사용 (업캐스팅 + 오버라이딩)

public class Main {
    public static void main(String[] args) {
        Animal a1 = new Dog(); // 업캐스팅
        Animal a2 = new Cat();

        a1.sound(); // 멍멍!
        a2.sound(); // 야옹~
    }
}

🔥부모 타입(Animal)으로 객체를 선언했지만, 실제 동작은 자식 클래스의 sound() 메서드가 실행됨 → 다형성

 

👇 다형성 = 업캐스팅 + 오버라이딩

개념 설명
업캐스팅 자식 객체를 부모 타입으로 참조
오버라이딩 자식 클래스가 부모의 메서드를 재정의
다형성 부모 타입으로 여러 자식 객체를 다룰 수 있음

📦 배열, 매개변수에 쓰는 다형성

Animal[] animals = {
    new Dog(),
    new Cat(),
    new Dog()
};

for (Animal a : animals) {
    a.sound(); // 각각의 자식 클래스에 맞게 동작!
}
public class SoundTest {
    public static void makeSound(Animal animal) {
        animal.sound();
    }

    public static void main(String[] args) {
        makeSound(new Dog()); // 멍멍!
        makeSound(new Cat()); // 야옹~
    }
}

🔁 오버로딩 vs 오버라이딩 차이

구분 오버로딩 (Overloading) 오버라이딩 (Overriding)
위치 같은 클래스 부모-자식 관계
조건 메서드 이름 같고, 매개변수 다름 이름, 매개변수, 리턴타입 모두 같아야
키워드 없음 @Override

🔐 다형성 + 인터페이스

interface RemoteControl {
    void turnOn();
}

class TV implements RemoteControl {
    public void turnOn() {
        System.out.println("TV 켬");
    }
}

class Radio implements RemoteControl {
    public void turnOn() {
        System.out.println("라디오 켬");
    }
}

public class Main {
    public static void main(String[] args) {
        RemoteControl rc1 = new TV();
        RemoteControl rc2 = new Radio();

        rc1.turnOn(); // TV 켬
        rc2.turnOn(); // 라디오 켬
    }
}

🧠 핵심 정리

  • 다형성 = 하나의 부모 타입으로 여러 자식 객체를 다룰 수 있음
  • 업캐스팅 + 오버라이딩 조합으로 구현
  • 유지보수, 확장성, 유연성 ↑
  • 인터페이스나 추상 클래스에서도 다형성 자주 사용