PLOD

[Java] 업캐스팅(upcasting), 다운캐스팅(downcasting) 본문

개발 공부/Java

[Java] 업캐스팅(upcasting), 다운캐스팅(downcasting)

훌룽이 2023. 1. 13. 16:41

자식->부모[업캐스팅]>>>>> 부모->자식[다운캐스팅]


업캐스팅(upcasting)은 자동 타입 변환(묵시적 타입변환)이라고도 하며 자식 클래스(Dog)의 타입을 부모클래스(Animal)로 변환하는 것을 의미한다. 다운캐스팅(downcasting)은 명시적 타입 변환 업캐스팅 괸 것을 다시 원래대로 되돌리는 것을 의미한다.

자손타입 -> 조상타입(Up-casting) : 형변환 생략 가능
자손타입 <- 조상타입(Down-casting) : 형변환 생략 불가

* Upcasting

업캐스팅과 다운캐스팅을 사용하는 이유는 공통적으로 공통적으로 할 수 있는 부분을 만들어 간단하게 다루기 위해서이다. 상속관계에서 상속받은 서브클래스가 몇개이든 하나의 인스턴스로 묶어서 관리할 수 있기 떄문이다. 물론 업캐스팅을 당한 객체는 메서드를 오버라이딩 하지 않는 이상 자식 고유의 메서드는 사용 못한다는 단점이 있기는 하지만 코드관리적인 측면에서 훨신 효율적이기 때문에 업 캐스팅을 사용할 수 있으면 사용한다.

/*upcasting사용해서 객체 생성 예시)
* (부모클래스) (객체명) = new (자식클래스)
*/
Animal dog = new Dog();

 

* Downcasting

다운캐스팅의 목적은 업캐스팅한 객체를 다시 자식클래스로 되돌리는데 목적을 둔다. 업캐스팅으로 인해 사용하지 못한 자식 본인의 필드와 기능을 사용하기 위해 다운캐스팅을 한다. 다운캐스팅은 업캐스팅 된 객체에게 사용하면 오류가 발생하기 때문에 다운캐스팅을 하기전에 업캐스팅 여부를 꼭 확인해보아야 한다.

/* downcasting 사용 예
* (자식클래스) (새로운 자식클래스 명) = (자식클래스(생략불가)) (upcasting된 자식클래스 명)
*/

Dog puppy = (Dog) dog



Ex) Animal 클래스를 통한 Upcasting과 downcasting

- Animal 클래스

public class Animal {
	
	protected String kind;
	
	public void breathe() {
		System.out.println("숨을 쉽니다.");
	}
	
	public void sound() {
		System.out.println("소리를 냅니다");
	}


- Dog 클래스

public class Dog extends Animal{
	
	public Dog() {
		super.kind = "포유류";
	}
	
	public void sound() {
		System.out.println("멍멍");
	}
	
	public void play() {
		System.out.println("공놀이");
	}
}


- Cat 클래스

public class Cat extends Animal{
	public Cat() {
		super.kind = "포유류";
	}
	
	public void sound() {
		System.out.println("야옹");
	}
	
	public void eat() {
		System.out.println("츄르 먹어요");
	}
}


- Test(Main) 클래스

public class Test {
	
	public static void sub(Animal animal) {			//animal = cat / animal = dog			
		
		System.out.println("******upcasting**********");
		animal.breathe();
		animal.sound();
		
		System.out.println("******downcasting********");	//eat(), play()
		if(animal instanceof Cat) {
			Cat cat = (Cat) animal;
			cat.eat();
		}
		else if(animal instanceof Dog) {
			Dog dog = (Dog) animal;
			dog.play();
		}
		
	}
	
	public static void main(String[] args) {
		Cat cat = new Cat();
		cat.breathe();
		cat.sound();
		cat.eat();
		System.out.println();
		
		Dog dog = new Dog();
		dog.breathe();
		dog.sound();
		dog.play();
		
		System.out.println();
		sub(cat);
		System.out.println();
		sub(dog);
	}
}

* instanceof 연산자

참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다. 주로 조건문에 사용되며, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입이 피연산자로 위치한다. 그 결과로 true나 false 중의 하나를 반환한다.

class Car{}
class FireEngine extends Car{}

public class InstanceofTest {
	public static void main(String[] args) {
		FireEngine fe = new FireEngine();
		
		if (fe instanceof FireEngine) {
			System.out.println("This is a FireEngine instance");
		}
		if (fe instanceof Car) {
			System.out.println("This is a Car instance");
		}
		
		if (fe instanceof Object) {
			System.out.println("This is a Object instance");
		}
	}
}

 

Comments