[JAVA] 업캐스팅(Upcasting)과 다운캐스팅 (DownCasting)

Yumi Kim·2025년 1월 25일

Java 알고리즘

목록 보기
4/17
post-thumbnail

캐스팅 이란?

  • 캐스팅 (=형변환)
    하나의 데이터 타입을 다른 타입으로 바꾸는 것
  • 참조형 캐스팅
    상속 관계에 있는 부모와 자식 클래스 (참조형 타입) 간의 형변환
  • 예제:
    (Child → Parent) : 업캐스팅 (자동 변환)
    Parent parent = new Child();
    List<int> l = new ArrayList()<>;
    (Parent → Child) : 다운캐스팅 (명시적 변환 필요)
    Child child = (Child) parent;

📌 주의할 점:

  • 같은 부모 클래스를 상속받고 있더라도 형제 클래스끼리는 아예 타입이 다르기 때문에 참조형 캐스팅 불가
    Animal animal = new Cat(); // O
    Animal animal = new Dog(); // O
    Dog dog = new Cat(); // X
    Cat cat = new Dog(); // X

1. 업캐스팅(Upcasting)

  • upcasting: Child → Parent
  • 자식 클래스의 객체는 부모 클래스를 상속하고 있어 부모의 멤버를 모두 가지고 있기 때문에 업캐스팅이 가능하다.
  • 업캐스팅은 형변환 괄호를 생략할 수 있다.
// 1. 나누어 대입
Parent parent;
Child child = new Child();
parent = (Parent) child; // O
parent = child; // O

// 2. 한번에 대입
Parent parent = new Child(); // O
  • 업캐스팅 사용 목적: 상속관계에서 자식 클래스 객체들을 하나의 부모 클래스 타입으로 묶어 다룰 수 있어 코드 관리가 효율적이다.

📌 주의할 점:

  • 업캐스팅 시 맴버 갯수 감소로 인해 자식 클래스에서만 있는 속성과 메서드는 실행하지 못한다.
    -> 자식 클래스의 속성과 메서드 실행 시 ❌Compile error 발생
  • 업캐스팅 시 만약 자식 클래스에서 오버라이딩한 메서드가 있다면, 부모 클래스의 메서드가 아닌 오버라이딩 된 메서드가 실행되게 된다.
class Animal {
    void makeSound() {
        System.out.println("Animal sound");
    }
}

class Dog extends Animal {
    void makeSound() {
        System.out.println("Bark");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();  // 업캐스팅
        myDog.makeSound();  // "Bark" 출력
    }
}

-> myDog는 Animal 타입으로 업캐스팅 되었지만, 실제로는 Dog 객체이기 떄문에 메서드 호출 시 실제 객체의 타입에 맞는 makeSound()가 실행된다.

2. 다운캐스팅 (DownCasting)

  • downcasting: Parent → Child
  • 타입을 명시적으로 지정해야한다.
  • 다운캐스팅 사용 목적: 업캐스팅한 객체를 다시 자식 클래스 타입으로 되돌려 자식 클래스가 가진 필드와 기능을 회복한다.
Parent parent;
CHild child = new Child();

parent = child; // upcasting

Child new_child = (Child) parent; //downcasting 1
new_child.method이름; 

((Child) parent).method이름; //downcasting 2

📌 주의할 점:

  • ClassCastException 에러: 업캐스팅하지 않은 부모의 객체일 경우 에러 발생
    -> ❌RunTime Error
Parent parent = new Parent();
Child new_child = (Child) parent; // X, error

Child new_child = new Parent(); // X, error

➡️ Upcasting / Downcasting 유무 확인 방법

객체 instanceof 클래스

instanceof 연산자는 객체 타입을 확인하는 연산자로, true/false로 결과를 반환한다.

if (child instanceof Parent) 
	Parent new_parent = child; // upcasting
else 
	System.out.println("업캐스팅 불가능");
    
if (parent instanceof Child) 
	Child new_child = (Child) parent; // downcasting
else 
	System.out.println("다운캐스팅 불가능");

📌 주의할 점:

  • instanceof 연산자는 객체에 대한 클래스 타입에만 사용할 수 있어 상위클래스도 하위클래스도 아닐 경우 ❌error 발생
  • instanceof 의 사용을 지양하기
    • 주요 이유: instanceof 를 사용하면 각 객체가 무엇인지 등의 정보를 외부 객체가 알게 되기 때문에 캡슐화가 깨진다.
profile
✿.。.:* ☆:**:. 🎀 Daily Study 🎀 .:**:.☆*.:。.✿

0개의 댓글