JAVA/JAVA 개념정리

업캐스팅 개념

공부 기록장 2023. 7. 6. 21:02

업캐스팅이란?

 

정의

업캐스팅이란 서브 클래스의 객체에 대한 레퍼런스를 슈퍼 클래스 타입으로 변환하는 것
따라서 슈퍼 클래스의 레퍼런스로 서브 클래스의 객체를 가리키게 한다.
즉 서브클래스가 슈퍼클래스가 되는 것(묵시적 형 변환)

 

 

선언

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].달리기();
   }
  
  } 
}