Old/JAVA

JAVA 다형성(polymorphism)

깨꾹2 2018. 8. 22. 22:32

다형성이란 하나의 객체가 여러타입을 가질 수 있는 것을 의미함.


자바에서 다형성은 부모타입의 참조변수로 자식 클래스의 인스턴트를 참조 할 수 있는 것으로 구현하고 있다.



Parent 클래스와 Parnet 클래스를 상속받는 Child 클래스가 있다.


참조변수가 Parent인것은 Parent 인스턴트를 참조 할 수 있다.

(멤버의 개수 = 인스턴트 멤버의개수)


참조변수가 Child인것은 Child 인스턴트를 참조 할 수 있다.

(멤버의 개수 = 인스턴트 멤버의개수)


참조변수가 Parent인것은 Child 인스턴트를 참조 할 수 있다.

(멤버의 개수 < 인스턴트 멤버의개수)


참조변수가 Child인것은  Parent 인스턴트를 참조 할 수 없다.

(멤버의 개수 > 인스턴트 멤버의개수)


=> 부모타입의 참조변수로 자식타입의 인스턴트를 참조할 수 있지만, 자식타입의 참조변수로 부모타입의 인스턴트를 참조 할 수 없다.


+ 참조변수가 사용할 수 있는 멤버의 개수는 인스턴트의 멤버의 개수보다 같거자 적어야한다.




Parent 클래스의 멤버는 int a, b이다


Child 클래스는 Parent 클래스를 상속 받고 int c를 멤버로 갖는다


Parent의 인스턴트 맴버 = a, b


Child의 인스턴트 멤버 =  a, b, c


parent2 참조변수는 Child를 참조하고 있으나 Parent에 인스턴트 멤버 c가 없기 때문에 참조할 수 없다.


같은 타입의 인스턴트를 참조하지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 수가 달라진다.




Parent형 참조변수 parent는 Child 인스턴트를 참조하고 있다 parent->Child


= c에 접근 불가능!


Child형 참조변수는 parent가 참조하는 것을 참조한다 child->Child


= c에 접근가능!


참조변수의 형변환


위에서 말했듯이 참조변수의 형태에 따라서 접근할 수 있는 멤버의 개수가 달라진다고 했다. 따라서 Child형 참조변수는 Child 인스턴스를 참조할 때 모든 멤버를 사용할 수 있지만 Parent형은 참조변수를 모두를 사용할 수는 없다


child = parent에서 parent의 참조변수형을 child로 바꿔주어야 모든 멤버를 사용 할 수 있을것이다.


부모타입->자식타입


이것을 다운캐스팅 = 명시적 형변환 이라고 한다.(생략불가)


자식타입->부모타입


이것을 업캐스팅 = 묵시적 형변환 이라고 한다(생략가능)


참조변수 instanceof 클래스이름


참조변수가 실제로 참조하고 있는 타입이 클래스이름이면 true를 반환하고 그렇지않으면 false를 반환한다






'Old > JAVA ' 카테고리의 다른 글

JAVA 추상클래스(abstract)  (0) 2018.09.04
JAVA this와 super 키워드  (1) 2018.08.22
JAVA 상속  (0) 2018.08.21
JAVA Static(정적변수와 정적메서드)  (0) 2018.08.21
JAVA 초기화와 생성자  (0) 2018.08.21