#57 JAVA 업캐스팅과 다운캐스팅
객체는 자식인데 변수 타입 부모인경우 -> 업캐스팅
변수의 자료형이 부모였는데 다시 본인 자료형으로 바꾸는 경우 -> 다운캐스팅
package Test;
class AA{
public void print() {
System.out.println("안녕하세요 A입니다.");
}
}
class BB extends AA{
public void print() {
System.out.println("안녕하세요 B입니다.");
}
}
class CC extends AA{
public void print() {
System.out.println("안녕하세요 C입니다.");
}
}
class Run{
public void print(AA a) {
a.print();
}
}
public class 연습 {
public static void main(String[] args) {
AA a = new AA();
BB b = new BB();
CC c = new CC();
Run r = new Run();
r.print(a);
r.print(b);
r.print(c);
}
}
클래스 AA를 만들었고 각각 클래스 BB , CC에 상속을 해주었다.
그리고 RUN이라는 클래스를 별도로 만들어서 AA a를 받아서 a.print()를 실행하도록 했다.
근데 저 AA a 가 들어가는 매개변수에 AA의 자식인 BB나 CC를 넣어주면 어떻게 될까?
놀랍게도 오류없이 프로그램이 돌아가며 해당하는 메소드를 불러들인다.
지금까지 내가 설명하고 보여준 이 코드는 업캐스팅의 예시이다.
즉 자료형은 부모지만 객체 자체는 자식인 경우이다.
package Test;
class AA{
public void print() {
System.out.println("안녕하세요 A입니다.");
}
}
class BB extends AA{
int a = 100;
public void print() {
System.out.println("안녕하세요 B입니다.");
}
}
class CC extends AA{
int a = 200;
public void print() {
System.out.println("안녕하세요 C입니다.");
}
}
class Run{
public void print(AA a) {
if(a instanceof BB) {
System.out.println(((BB)a).a);
}
if(a instanceof CC) {
System.out.println(((CC)a).a);
}
}
}
public class 연습 {
public static void main(String[] args) {
AA a = new AA();
BB b = new BB();
CC c = new CC();
Run r = new Run();
r.print(b);
r.print(c);
}
}
이번에도 위 코드와 구성은 비슷한데 RUN 클래스에 print메소드에서 매개변수로 AA a를 받는다.
여기에 만약 업캐스팅으로 자식(BB,CC)를 넣어주게 된다면 그 자식들이 가지고 있는 변수까지 활용을 하고 싶다면 어떻게 해야할까?
print함수에서는 instanceof 라는 함수를 통해 너가 누구니?를 묻고 있다.
만약 너가 BB라면 a를 BB로 다운캐스팅 (즉, 부모 자료형에서 자식 자료형으로 바꿔줌)을 하여 BB에 있는 변수 a를 출력해줘라
아니면 너가 CC라면 a를 CC로 다운캐스팅 (즉, 부모 자료형에서 자식 자료형으로 바꿔줌)을 하여 CC에 있는 변수 a를 출력해줘라로 해석할 수 있다.
이처럼 업캐스팅과 다운캐스팅의 개념을 알아보았다.
난 문제를 풀면서 특히나 업캐스팅을 많이 사용해보았는데 업캐스팅이란 개념이 존재함으로써 코드 길이를 굉장히 단축할수 있고 편리하게 사용할수있는 장점이 있는 것 같다.
감사합니다.