
캐스팅(Casting)
상속 관계에 있는 부모클래스와 자식클래스간에 형변환이 이루어지는 것을 말한다.
업캐스팅과 다운캐스팅이 있다.
업캐스팅(Up casting)
자식클래스의 객체가 부모클래스로 형변환 되는 것을 말한다.
아래에서 코드로 살펴보겠다.
class pruit {
int price;
pruit() {
}
pruit(int price) {
this.price = price;
}
}
class apple extends pruit {
String color;
apple(int price, String color) {
super(price);
this.color = color;
}
}
class pricaty {
public static void main(String[] args) {
apple A = new apple(1000, "red");
pruit P = A; // 업캐스팅
System.out.println(P.price);
System.out.println(P.color); // 컴파일에러 발생
pruit p = new apple(1000, "red"); // 업캐스팅
System.out.println(p.price);
System.out.println(p.color); // 컴파일에러 발생
}
}
위 코드에서 부모클래스로 생성한 레퍼런스 변수 P는 자식클래스로 객체화된 인스턴스 A를 가리키고 있다.
하지만 P의 본질은 pruit 클래스이기 pruit의 멤버변수에가 접근 가능하다. 따라서 P.color에서 컴파일 에러가 발생한다.
반면, P.price는 정상적으로 작동한다. price 자체가 부모클래스 P로부터 상속받은 멤버변수이기 때문이다.
그렇기 때문에 super(price)가 아니라 this.price라면 P.price는 0으로 출력될 것이다.
다운캐스팅(Down casting)
업캐스팅이 선행된 상태에서 다시 원상태로 돌리는 것을 말하며, 작성방법에서 업캐스팅과 차이가 있다.
업캐스팅의 경우에는 pruit클래스를 상속받은게 apple클래스이기 때문에 pruit클래스가 갖고있는 변수 데이터는 apple클래스에도 있다.
따라서 pruit P = A 이후 P. + "P의변수"로 작성한(ex. P.price) 코드의 변수는 상속받은 A가 갖고있기 때문에 에러가 나지 않는다.
apple A = new apple(1000, "red");
pruit P = A; // 업캐스팅
P.price = 3000; // 부모클래스의 price는 상속받은 자식클래스도 갖고있으므로 문제가 되지 않는다.
반면, apple A = P로 작성할 경우 A. + "A의변수"에서 A의 변수를 부모클래스가 가지고있지 않을 수도 있다.
그렇기 때문에 업캐스팅의 경우처럼 apple A = P; 혹은 apple A = new pruit(1000); 으로 선언하면 오류가 날 것이다.
apple A = new apple(1000, "red");
pruit P = A; // 업캐스팅
apple A = P; -> X // 자식클래스 apple의 멤버변수는 부모클래스에 없을수도 있으므로 이런 형식은 안된다.
apple A = new pruit(1000); // 이 경우도 안된다.
그래서 다운캐스팅은 apple A = (apple) P 형태로 작성해주어야한다. 업캐스팅된 것을 원래대로 돌리는 것이기 때문에 apple A = (apple) pruit 혹은 apple A = (apple) new pruit이 아닌 점에 주의하자
apple A = new apple(1000, "red");
pruit P = A; // 업캐스팅
apple a = (apple) P; // 다운캐스팅
System.out.println(a.price); // 1000
System.out.println(a.color); // red
아래 경우는 문법상 틀리지 않았기 때문에 컴파일러 입장에서는 맞다고 표시되어 빨간줄이 보이지 않는다.
하지만 실행했을 때 ClassCastException 에러가 발생하니 주의하자.
apple a = (apple) new pruit(1000); // ClassCastException
'자바' 카테고리의 다른 글
[자바] 우선순위 큐(Priority Queue) (0) | 2022.06.24 |
---|---|
[자바] 힙(Heap) - 최대힙 / 최소힙 개념과 구현. java (0) | 2022.06.22 |
[자바] 균형 이진 탐색 트리 - AVL트리의 개념과 삽입 구현까지 (0) | 2022.06.18 |
[자바] 이진 탐색 트리 (Binary Search Tree) (0) | 2022.06.18 |
[자바] Tree의 개념, 종류, 재귀함수를 이용한 구현까지 (0) | 2022.06.17 |