CS/java
다형성과 참조변수 형변환
hanjongho
2021. 5. 1. 17:47
다형성 : 부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있는 것
class Car {
String Color;
void move() {};
}
class Ferrari extends Car {
void boostMode() {};
}
이와 같은 상속관계가 있다고 했을 때,
// 선언 가능
Ferrari f = new Ferrari();
Car c = new Ferrari();
이런 선언은 가능하다. 물론 참조변수 c로는 Ferrari 인스턴스에 boostMode는 사용할 수 없다. 둘 다 같은 Ferrari타입의 인스턴스지만 참조변수에 따라 사용할 수 있는 멤버변수의 개수가 다르다.
// 선언 불가능. 컴파일 에러 발생
Ferrari f = new Car();
하지만 이런 경우에는, 참조변수 f가 사용할 수 있는 멤버변수의 개수가 Car의 인스턴스의 멤버변수보다 많기 때문에 선언도 불가능하다.
형변환 : 참조변수의 타입을 변환하는 것
- Up-Casting : 자식타입 -> 부모타입 (생략가능)
- Down-Casting : 부모타입 -> 자식타입 (생략불가)
위의 상속관계를 예로 들어보자면,
Car c = null;
Ferrari f1 = new Ferrari();
Ferrari f2 = new null;
c = f1; // Up-Casting 생략가능
f2 = (Ferrari)c; // Down-Casting 생략불가능
두 참조변수 타입이 다르기 때문에 대입연산이 되기전에 형변환이 일어나야한다.
Down-Casting의 경우 생략할 수 없는 이유는 Up-Casting과 반대로 참조변수가 다룰 수 있는 멤버변수의 개수가 실제 인스턴스가 가지고 있는 멤버의 개수보다 많아지는 것이므로, 인스턴스에서 사용할 수 있는 멤버의 범위를 조절해야 한다. 인스턴스와는 무관하게 참조변수 타입만 변환하는 것이라고 생각하면 된다.
위의 코드를 해석하면, f1, c, f2 모두 같은 2번째 줄의 Ferrari 인스턴스를 가르키고 있지만, c와 다르게 f2는 Ferrari인스턴스의 모든 멤버들을 사용할 수 있다.