다형성이란 부모클래스의 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 하는 것이다.
class Parent{
int parent_int;
void par();
}
class Child extends parent{
int child_int;
void chi();
}
다음과 같이 부모 클래스 타입의 참조변수로 자식 클래스의 인스턴스를 참조하는 것이 가능하다.
Parent p = new Child();
그렇다면 아래와 같이 인스턴스를 같은 타입의 참조변수로 참조하는 것과 위의 코드는 어떤 차이가 있을까?
Child c = new Child();
Parent타입의 참조변수 p는 Parent클래스의 맴버들만 사용할 수 있다. (parent_int, par())
하지만 Child타입의 참조변수 c는 Parent클래스의 맴버와 Child클래스의 맴버 모두 사용할 수 있다. (parent_int, par(), child_int, chi())
즉, 참조변수가 사용할 수 있는멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다.
Parent p ⊂ new Child();
조상 타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.
반대로 자손타입의 참조변수는 조상타입의 인스턴스를 참조할 수 없다.
메서드의 경우 부모 클래스의 메서드를 자식 클래스에서 오버라이딩한 경우 참조변수의 타입에 관계없이 항상 실제 인스턴스의 메서드(오버라이딩된 메서드)가 호출되지만, 멤버변수의 경우 참조변수의 타입에 따라 달라진다.
classBindingTest {
public static void main(){String[] args){
Parent p = new Child();
Child c = new Child();
System.out.println("p.x = " + p.x);
p.method();
System.out.println("c.x = " + c.x);
c.method();
}
}
class Parent {
int x = 100;
void method() {
System.out.println("Parent Method");
}
}
class Child extends Parent {
int x = 200;
void method() {
System.out.println("Child Method");
}
}
실행결과
p.x = 100
Child Method
c.x = 200
Child Method
변수는 참조변수의 타입에 따라 달라진다.
메서드는 오버라이딩한 경우 자식클래스의 메서드를 사용한다.