프로그래밍 언어/Java

[Java] 업캐스팅(Upcasting)과 다운캐스팅(Downcasting)

백엔드 개발자 - 젤리곰 2023. 12. 18. 14:08
728x90

1. 개념

   1) 업캐스팅 : 서브클래스(하위클래스)의 인스턴스를 슈퍼클래스(상위클래스)의 참조로 형변환하는 것.

Parent pobj = new Child();

   ✔ 서브클래스에서 정의된 메서드를 사용한다.
단, 슈퍼클래스와 동일한 메서드만 사용가능하다.
 
   2) 다운캐스팅 : 슈퍼클래스(상위클래스)의 참조를 서브클래스(하위클래스)의 참조로 형변환하는 것.

Child cobj = (Child) Parent;

   
 

2. 사용이유

- 상속관계에 있을 때, 업캐스팅은 코드의 유연성과 다형성을 향상시킨다.
- 다운캐스팅은 업캐스팅 했다가 다시 원래의 서브클래스 타입으로 되돌릴 때 사용한다.
 
 
 

3. 예시 코드

// Shape 클래스를 정의합니다.
abstract class Shape {
    public abstract void draw(); //추상메서드
}

// Circle 클래스와 Square 클래스가 Shape를 상속합니다.
class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }

    public void calculateArea() {
        System.out.println("Calculating circle area");
    }
}

class Square extends Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a square");
    }

    public void calculateArea() {
        System.out.println("Calculating square area");
    }
}

public class DrawingApplication {
    public static void main(String[] args) {
        Shape[] shapes = new Shape[3];
        shapes[0] = new Circle(); //업캐스팅
        shapes[1] = new Square(); //업캐스팅
        shapes[2] = new Circle(); //업캐스팅

        // 업캐스팅을 통해 다양한 Shape 객체를 배열에 저장합니다.
        for (Shape shape : shapes) {
            shape.draw(); // 다양한 Shape 객체의 draw 메서드를 호출합니다.
            
            // 다운캐스팅을 사용하여 Circle 클래스의 메서드를 호출합니다.
            if (shape instanceof Circle) {
                Circle circle = (Circle) shape;
                circle.calculateArea();
            }
        }
    }
}
728x90