티스토리 뷰

▶Casting - 업캐스팅(Up Casting)과 다운캐스팅(Down Casting)

🔎 캐스팅(Casting) ? - 모든 자식은 부모 타입이다


캐스팅이란 타입을 변환하는 것을 말하며 형변환이라고도 합니다.

자바에서는 클래스 하나를 타입으로 볼 줄 알아야 한다고 한 적이 있습니다.

마찬가지로 자바사에서 상속 관계에 있는 부모와 자식 클래스 간에는 서로 간의 형변환이 가능합니다.

 

이때 형변환의 종류에는 업캐스팅(Up Csing)과 다운캐스팅(Down Casting)이 있습니다.

 

📌 업캐스팅(Up Casting) : 자식을 → 부모타입으로

업캐스팅은 자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것을 말합니다.

우리가 부모 클래스를 상속받은 자식 클래스를 생성할 때 부모 클래스에는 공통으로 필요한 변수나 메소드들만 있기 때문에 자식 클래스에서 오버라이딩을 해주거나 더 메소드을 선언하거나 합니다.

 

그래서 더 큰 개념이 뭐냐는 관점만 보게 된다면 자식 클래스가 더 큰 개념이라고 말할 수 있습니다.

그런데 업캐스팅을 할 때에는 자식을 부모타입으로 형변환을 한다고 했죠?

 

이때는 자식 클래스의 넘치는 부분들을 숨기면서 업캐스팅을 하게 되는데요.

하지만 자식 클래스는 부모 클래스를 상속받으면서 자식 클래스는 부모 타입이기도 합니다.

따라서 형변환을 할 때 강제 형변환 없이 A a = new B(); (A: 부모 클래스, B: 자식 클래스) 로도 가능한 것입니다.

 

아래 코드에서 Car는 부모 클래스이며, SuperCar는 자식 클래스입니다.

package castingTest;

class Car {
    void engineStart() {
        System.out.println("열쇠로 시동 켬");
    }
}

class SuperCar extends Car {
    @Override
    void engineStart() {
        System.out.println("음성으로 시동 켬");
    }
    
    void openRoof() {
        System.out.println("지붕 열기");
    }
}

이제 메인 메소드에서 업캐스팅을 해봅시다.

업캐스팅을 하게 되면 더 넓은 개념이었던 자식 클래스 필드가 부모 타입이 되면서 숨겨진다는 점을 기억하면서 코드를 봅시다.

그러면 더 정의한 부분은 사용할 수 없을 것이며, 그렇지만 오버라이딩된 부분은 사용할 수 있을 것입니다.

오버라이딩은 원래 그 메소드의 주소값에 재정의하는 것이기 때문입니다.

public class CastingTest {
    public static void main(String[] args) {
        Car matiz = new Car();
        SuperCar ferrari = new SuperCar();
        
        Car noOoptionFerrari = new SuperCar();
        nooptionFerrari.engineStart(); // 음성으로 시동 켬(오버라이딩한 대로)
    }
}

 

📌 다운캐스팅(Down Casting) : 업캐스팅된 객체를 → 자식 타입으로

위에서 업캐스팅 할 때 부모 클래스를 상속받은 자식 클래스에서 넘치는 부분을 숨기면서 업캐스팅한다고 했었습니다.

다운캐스팅에서는 그 숨겨진 부분을 이용해서 다시 복구를 하는 개념인데요.

 

또 위에서 모든 자식은 부모 타입이라고 했습니다.

그렇기 때문에 업캐스팅은 강제 형변환 없이 바로 변환이 가능했는데요.

 

반대로 부모는 자식 타입이 아니기 때문에 업캐스팅 객체를 자식 타입으로 변환할 때는 강제 형변환이 필요합니다.

강제 형변환을 해주는 이유는 타입을 같게 해주기 위해서였죠?

public class CastingTest {
    public static void main(String[] args) {
        // 업캐스팅
        Car matiz = new Car();
        SuperCar ferrari = new SuperCar();
        
        Car noOoptionFerrari = new SuperCar();
        nooptionFerrari.engineStart(); // 음성으로 시동 켬(오버라이딩한 대로)
        
        // 다운캐스팅
        Suepr Car fullOptionFerrari = (SuperCar)noOptionFerrari;
        fullOptionFerrari.openRoof(); // 지붕열기
    }
}

 

728x90
LIST
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함