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