Java/OOP
[Java] 다형성
codeStudy123
2022. 3. 4. 22:52
다형성(polymorphism)
여러 가지 형태를 가질 수 있는 능력
조상 타입 참조 변수로 자손 타입 객체를 다루는 것
Parent p = new Parent(); //타입일치
Child c = new Child(); //타입일치
Parent p2 = new Child(); //타입불일치
위 3행 코드처럼 조상 타입 참조 변수로 자손 타입 객체를 다루는 것이 가능하다. (참고로 Child는 Parent에게 상속받았다.)
class MainClass{
public static void main(String[] args) {
Parent p = new Parent(); //타입일치
Child c = new Child(); //타입일치
Parent p2 = new Child(); //타입불일치
}
}
class Parent{
private int num;
void setNumber (int num) {
this.num=num;
return;
}
}
class Child extends Parent{
private int num;
void setNumber (int num) {
this.num=num;
return;
}
void numberOutput() {
System.out.println(this.num);
}
}
참조 변수 p는 총 멤버의 개수가 2개이고 참조 변수 c는 3개이다.
참조 변수 p2는 조상 타입의 참조 변수로서 자손 타입 객체를 생성했지만 p2의 멤버는 num과 setNumber() 두 개다.
자손 타입의 참조 변수로는 조상 타입의 객체를 가리킬 수는 없다.
Parent p = new Parent(); //타입일치
Child c = new Child(); //타입일치
Parent p2 = new Child(); //타입불일치
가능
Parent p = new Parent(); //타입일치
Child c = new Child(); //타입일치
Child c2 = new Parent(); //Error 타입불일치
불가능
불가능한 이유는 Child의 멤버가 Parent의 멤버보다 많다. 하지만 Parent에게 상속받은 멤버만 사용할 수 있게 되어 불가능한 코드가 되는 것이다.
결론적으로
부모 참조 변수로 자식 객체 인스턴스화 할 때는 부모 클래스가 자식보다 멤버가 항상 적거나 같으므로 자식에게 있는 멤버는 사용 안 하면 그만이지만,
자식 참조 변수로 부모 객체 인스턴스화 할 때는 자식 클래스가 부모 클래스보다 멤버가 항상 많거나 같기 때문에 부모의 멤버에는 자식의 멤버가 없으므로 에러가 난다.
다형성으로 참조 변수의 타입은 인스턴스의 타입과 반드시 일치하지 않아도 된다는 것을 알 수 있다.
Parent p = new Child();