JAVA

[ JAVA / 자바 ] 업캐스팅(Upcasting), 다운캐스팅(Downcasting)이란?

zzuvely 2022. 7. 5. 17:41

 

 캐스팅(Casting)이란 ?

 : 타입을 변환하는 것을 말하며 형변환이라고도 한다. 자바의 상속 관계에 있는 부모와 자식 클래스 간에는 서로 간의 형 변환이 가능하다.

 

• 업캐스팅(Upcasting)

- 상속 관계에서 데이터타입을 부모클래스로 선언하는것

 

업캐스팅 예제

 

// 부모클래스
// UpCastingParent.java

public class UpCastingParent {

	int x;
	int y;
	
	public UpCastingParent() {
		x = 10; 
		y = 20;
	}
	
	public void print() {
		System.out.println(x + ", " + y);
	}
	
	public int add() {
		System.out.println("Parent의 add 함수 호출");
		return x + y;
	}
	
}

 

// 자식클래스
// UpCastingChild.java


public class UpCastingChild extends UpCastingParent {

	// int x;
	// int y;
	// UpCastingParent의 함수들도 상속 받았다.

	int z;

	public UpCastingChild() {
		x = 100;
		y = 200;
		z = 300;
	}

	@Override
	public void print() {
		System.out.println(x + ", " + y + ", " + z);
	}

	@Override
	public int add() {
		System.out.println("Child의 add() 함수 호출");
		return x + y + z;
	}

	public int sub() {
		System.out.println("Child의 sub() 함수 호출");
		return x - y - z;
	}

	public int getZ() {
		return z;
	}

	public void setZ(int z) {
		this.z = z;
	}

}

 

// 실행 파일
// UpCastingMain.java

public class UpCastingMain {

	public static void main(String[] args) {
		
		UpCastingParent ucp = new UpCastingChild();
		
		// 변수는 부모클래스이며, 부모클래스에 add 함수 이름이 있다.
		// 함수가 실행되는 객체가 자식 클래스 이고
		// 자식 클래스가 add를 오버라이딩 했으므로
		// 자식 클래스의 함수가 호출된다.
		result = ucp.add();
		System.out.println(result);
		
		// 변수는 부모 클래스 이므로, 부모 클래스에 있는 함수 이름만 사용이 가능하다
		// sub() 는 부모에는 없고 자식에게만 있으니깐 실행 못한다
		// result = ucp.sub();
	}

}

 

• 다운캐스팅(Downcasting)

- 자식 클래스의 정보를 담을  수 있는 객체의 자료형이 부모클래스로 전환되있던 것(업캐스팅된 객체)을 다시 되돌리는 것

 

• 다운캐스팅 예제

 

// 부모클래스
// Animal.java

public class Animal {

	private String name;

	public void cry() {
		System.out.println(name + "가 소리를 낸다.");
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

 

// 자식클래스
// Dog.java


public class Dog extends Animal {

	//	String name;
	//  Animal 클래스의 함수도 모두 상속받는다.
	
	@Override
	public void cry() {
		super.cry();
		System.out.println("멍멍");
	}
	
	void run() {
		System.out.println(getName() + "가 뛴다.");
	}
	
}

 

// 실행 파일
// Animalmain.java


public class AnimalMain {

	public static void main(String[] args) {

		AnimalAction action = new AnimalAction();
		
		Dog d = new Dog();
		d.setName("흰둥이");
		
		action.action(d);
		
	}

}

 

// action 함수

public class AnimalAction {

	void action(Animal animal) {
		
		animal.cry();
		
		// instance : 힙 메모리에 저장된 메모리 영역
		// animal 이 Dog 객체 일때
		if (animal instanceof Dog) {
			// Animal 클래스에는 run() 함수가 없으므로
			// animal을 Dog로 바꾼다.
			((Dog)animal).run();
		}
	}
}