코드일기장

[Java] 다형성 본문

Java/OOP

[Java] 다형성

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

 

'Java > OOP' 카테고리의 다른 글

[Java] instanceof 연산자  (0) 2022.03.20
[Java] 참조변수의 형변환  (0) 2022.03.15
[Java] 접근 제어자 (access modifier)  (0) 2022.02.20
[Java] static, final, abstract의 정의  (0) 2022.02.18
[Java] 패키지, import, static import  (0) 2022.02.05
Comments