다형성
다형성은
- 여러 가지 형태를 가질 수 있는 능력으로,
- 자바에서는 조상 타입 참조변수로 자손 타입 객체를 다루는 것을 말한다.
class Parent {
int pi1; // 멤버 변수 2개
int pi2;
void pm1() { } // 메서드 3개
void pm2() { }
void pm3() { }
}
class Child extends Parent {
int ci; // 멤버 변수 1개
void cm() { } // 메서드 1개
}
// 메인 내부에서..
Parent p = new Parent(); // OK
Child c = new Child(); // OK
Parent pp = new Child(); // OK. WHY????
Parent 클래스가 있고, 이를 상속받은 Child 클래스가 있다. 두 클래스를 이용해 객체를 생성할 때 참조변수의 타입(왼쪽)과 객체의 타입(오른쪽)을 일치시켜서 객체 생성을 하는 게 일반적이었는데, 다형성은 불일치해도 객체 생성을 가능하게 해 준다.
객체와 참조변수의 타입이 일치할 때와 일치하지 않을 때 어떤 차이가 있는지 확인해보자.
1. 참조변수와 객체의 타입이 일치
Parent p = new Parent(); // OK
Child c = new Child(); // OK
참조변수의 타입과 객체의 타입이 일치하기 때문에, 참조변수로 접근할 수 있는 변수/메서드는 모두 객체에 있다. 따라서 에러 날 일이 없다.
2. 참조변수와 객체의 타입이 불일치
Parent pp = new Child(); // OK
1) 참조변수: 조상, 객체타입: 자손
- Parent 클래스의 멤버는 5개이고, Child 클래스의 멤버는 7개이다. 객체 생성 시 Child 클래스로 생성했기 때문에 객체에는 7개의 멤버가 있지만 참조변수는 Parent 클래스로 되어있기 때문에 접근 가능한 멤버는 5개뿐이다. 객체에 있는 나머지 2개(ci, cm)는 접근 불가능하지만 사용하지도 않으므로 에러가 발생하지는 않는다.
-> 다형성
Child cc = new Parent(); // error
2) 참조변수: 자손, 객체타입: 조상
- 참조변수의 멤버는 7개인데, 객체에는 5개의 멤버만 존재하기 때문에 실제로 사용할 수 없는 멤버가 2개(ci, cm)나 있다. 그렇기 때문에 에러가 발생한다
-> 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없다.