업캐스팅이란?
정의
업캐스팅이란 서브 클래스의 객체에 대한 레퍼런스를 슈퍼 클래스 타입으로 변환하는 것
따라서 슈퍼 클래스의 레퍼런스로 서브 클래스의 객체를 가리키게 한다.
즉 서브클래스가 슈퍼클래스가 되는 것(묵시적 형 변환)
선언
Parent a;
Son b = new Son();
a = (Parent)b; //여기서 (Parent)는 생략가능하다.
또는
Parent a = new Son();
로 표현할 수 있다.
예제
class Parent{
String name;
public void intro()
{
System.out.println("난 부모");
}
}
class Son extends Parent{
int son_age;
int son_height;
int son_weight;
public void intro()
{
System.out.println("나는 아들");
}
public void sonSay()
{
System.out.println("나는 son 클래스");
}
}
class Daughter extends Parent{
int daughter_age;
int daughter_height;
int daughter_weight;
public void intro()
{
System.out.println("나는 딸");
}
public void daughterSay()
{
System.out.println("나는 daughter 클래스");
}
}
public class dong_hun{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Parent a;
Son b = new Son();
a = b;
}
}
위 코드에서
Parent a;
Son b = new Son();
a = b; //업캐스팅
이 부분은 다음 그림과 같이 표현할 수 있다.
여기서 Son 객체인 b는 name, son_age, son_height, son_weight, intro(), sonSay()에 접근할 수 있고
Parent 객체인 a는 name, intro()만 접근할 수 있다.
그런데 Parent 클래스의 intro() 메소드와 Son 클래스의 intro() 메소드는 각각 다른 출력을 보여주는 데(오버라이딩)
업캐스팅된 a 변수의 intro() 함수를 호출하게 되면 Son 객체의 intro()가 호출되게 된다.
그러면 업캐스팅을 사용하는 이유는 무엇일까?
만약 예를 들어 동물이라는 부모 클래스가 있고 동물을 상속받은 클래스가 1000개 이상이라고 할 때
1000개 이상의 클래스의 달리기( ) 메소드를 실행해야할 때 하나의 객체로 관리할 수 있기 때문이다.→즉 서브클래스가 몇 개이든 하나의 객체로 묶어서 관리하기 위해서이다.
class 동물{
...
public void 달리기(){
System.out.println("동물 달리기");
}
class 사자 extends 동물{
...
public void 달리기(){
System.out.println("사자 달리기");
}
class 고양이 extends 동물{
...
public void 달리기(){
System.out.println("고양이 달리기");
}
class 강아지 extends 동물{
...
public void 달리기(){
System.out.println("강아지 달리기");
}
....
public class dong_hun{
public static void main(String[] args) {
동물 a = new 동물[1000];
a[0] = new 사자();
a[1] = new 고양이();
a[2] = new 강아지();
.
.
.
for(int i=0;i<1000;i++){
a[i].달리기();
}
}
}