개발공부

[Java] UpCasting / DownCasting 본문

Java/Basic

[Java] UpCasting / DownCasting

mscha 2022. 7. 5. 17:44

Casting

캐스팅이란 타입을 변환한다는 것을 뜻한다.

 

Upcasting

서브 클래스의 객체가 슈퍼 클래스 타입으로 형변환 되는 것을 말한다.

슈퍼 클래스의 레퍼런스 변수가 서브 클래스로 객체화된 인스턴스를 가리킬 수 있게 되는 것이다.

 

업캐스팅 예시

UpCastingParent.java

public class UpCastingParent {
	int x;
	int y;
	
	public UpCastingParent() {
		System.out.println("Parent 생성자 호출");
		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 z;
	
	public UpCastingChild(){
		System.out.println("Child 생성자 호출");

		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;
	}
	
}

Main.java

public class Main {

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

}

다운 캐스팅

업캐스팅과 반대로 캐스팅 하는 것을 다운 캐스팅이라고한다.

업캐스팅된 것을 다시 원상태로 돌리는 것을 말한다.

 

다운 캐스팅 예시

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() + "이(가) 뛴다.");
	}
}

 

Cat.java


public class Cat extends Animal{

	
//	private String name;
	
	// Animal 클래스의 함수 모두 상속받는다.
	
	@Override
	public void cry() {
		// TODO Auto-generated method stub
		super.cry();
		System.out.println("야옹");
	}
	
	void grooming() {
		System.out.println(getName() + "이(가) 그루밍 한다.");
	}
	

}

 

AnimalAction.java

action(Animal animal) 을 호출하게 되면 업캐스팅된다.

instanceof 를 이용해 객체 타입을 확인하여

Dog면 Dog로 다운 캐스팅 후, run() 메소드를 실행하고,

Cat이면 Cat으로 다운 캐스팅 후, grooming() 메소드를 실행한다.

public class AnimalAction {
	void action(Animal animal) {
		
		animal.cry();		
		if (animal instanceof Dog) {
			((Dog)animal).run();
		} else if (animal instanceof Cat) {
			((Cat)animal).grooming();
		}
		
	}
}

 

Main.java

public class AnimalMain {

	public static void main(String[] args) {
		
		AnimalAction action = new AnimalAction();
		
		Dog d = new Dog();
		d.setName("초코");
		
		action.action(d);
		
		Cat c = new Cat();
		c.setName("키티");
		
		action.action(c);
		
	}

}