공부 기록/Java with ChatGPT

[Java/ChatGPT] Day 10: 다형성(Polymorphism)과 업캐스팅/다운캐스팅

dev.jelee 2025. 6. 19. 03:15

[ 학습목표 ]

  1. 다형성의 개념을 이해한다.
  2. 업캐스팅과 다운캐스팅의 차이를 이해하고 사용할 수 있다.
  3. 부모 타입 참조 변수로 자식 객체를 다루는 패턴에 익숙해진다.

[ 이론 ]

1. 다형성이란?

  • 하나의 객체가 여러 형태로 동작할 수 있는 성질

 

2. 다형성 특징

  • 자식 객체를 부모 타입으로 참조할 수 있음
  • 오버라이딩 메서드가 핵심
  • 실행 시점에 어떤 메서드가 호출될지는 객체의 실제 타입에 따라 결정됨

 

3. 업캐스팅 Upcasting

부모클래스 변수 = new 자식클래스(); // 자동 형변환
  • 자식이 부모처럼 행동
  • 오버라이딩된 메서드는 자식 것이 호출됨

 

4. 업캐스팅 사용 이유/목적/예시

  • 다형성을 활용하기 위해: 여러 하위 클래스를 같은 상위 클래스 타입으로 다룰 수 있음.
  • 코드를 유연하게 설계할 수 있음: 예를 들어 매개변수나 반환 타입이 상위 타입이면 여러 하위 타입을 수용할 수 있음.
  • 안전한 변환이며 명시적 형변환이 필요 없음.

🔹 사용 예시:

  • 컬렉션에 다양한 하위 타입 객체를 상위 타입으로 저장할 때.
  • 메서드 인자로 상위 클래스를 받을 때 다양한 하위 클래스 전달 가능.

 

5. 다운캐스팅 Downcasting

자식클래스 변수 = (자식클래스) 부모클래스변수; // 강제 형변환

 

  • 업캐스팅한 객체를 다시 자식 타입으로 되돌림
  • instanceof 연산자와 함께 자주 사용

 

 

6. 다운캐스팅 사용 이유/목적/예시

  1. 하위 클래스의 고유 기능(메서드/필드)에 접근하기 위해.
  2. 다형성을 통해 업캐스팅된 객체를 원래 타입으로 되돌릴 때.

🔹 주의사항:

  • 명시적 형변환이 필요함.
  • 실제 객체가 해당 타입이어야 함. 그렇지 않으면 ClassCastException이 발생함.

 

7. 언제 사용되는가

상황 Upcasting  Downcasting
다형성을 활용할 때 ✅ 자주 사용 ❌ 일반적으로 사용 안 함 (단, 필요 시 사용)
하위 클래스 기능 접근 필요 시 ❌ 기능 접근 불가 ✅ 기능 접근 가능
안전성 ✅ 안전 ❗ 위험 (런타임 오류 가능성 있음)

 


[ 실습 ]

✅ 예시 1: 업캐스팅과 오버라이딩

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

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

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

 

✅ 예시 2: 다운캐스팅

Animal animal = new Dog();

if (animal instanceof Dog) {
  Dog dog = (Dog) animal;
  dog.sound();  // 멍멍!
}

[ 메모 ]

  • 다형성이란 하나의 타입이 여러 형태로 동작하는 성질을 말한다.
  • 업캐스팅은 자식 클래스를 부모 타입으로 자동 형변환이 된다.
  • 다운캐스팅은 부모 클래스를 자식 타입으로 강제 형변환 해야 한다.
  • 다형성을 활용할 때 업캐스팅은 자주 사용되나 다운캐스팅은 런타임 시 ClassCastException이 발생할 가능성이 있기 때문에 위험하다.
  • 그리고 업캐스팅은 자식 클래스가 부모 타입으로 된 것이라서, 부모 클래스의 기능만 사용할 수 있다. 단, 부모 클래스의 hello라는 메서드를 자식 클래스의 오버라이딩 했다면, 부모 클래스의 hello 메서드를 호출하더라도 자기 자신이 오버라이딩한 hello메서드의 내용이 동작한다.
  • 다운캐스팅은 부모 클래스가 자식 타입으로 된 건데, 이때 자식 클래스의 기능을 사용할 수 있다.