다형성(Polymorphsim)

Kuno17·2022년 12월 28일
0

Java 기초

목록 보기
3/6
post-thumbnail

한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현하였다.
조상클래스의 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.

즉 조상의 리모콘으로 자손의 인스턴스에 관여할 수 있다는 말이다.
단 상속받은 인스턴스에만 접근이 가능하다.
반대로 자손의 타입의 참조변수로 조상타입의 인스턴스를 참조할 수 없다.

다음과 같은 관계의 클래스가 있다면

class Car {}
class FireEngine extends Car {}
class Ambulance extends Car {}

조상클래스 Car를
자손클래스 FireEngine 과 Ambulance가 상속받는다.

FireEngine fe = new FireEngine();
Car c = new Car();
FireEngine fe2 = null;

Car c = (Car)fe;  //가능하다 조상타입으로 형변환 ( 리모컨만 조상타입으로 사용 (기능 > 버튼))
FireEngine fe2 = (FireEngine)c; // 빈 주소에 자손타입으로 형변환 위에서 참참조변수c에 fe의 주소를 가져왔기 떄문 즉( 기능 = 버튼개수 ) 
Ambulance a = (Ambulance)f; // 에러발생.. 서로 상속관계가 아니다.

위 관계를 도식화 한다면 다음과 같다.

형변환을 통해서 조상타입의 리모컨으로 자손타입의 인스턴스에 접근이 가능하나 조상타입의 맴버만 접근이 가능하다. 즉 이경우 c.water()는 사용이 불가능하다.

자바의 정석 연습문제 7-15

class Unit {} 
class AirUnit extends Unit {} 
class GroundUnit extends Unit {} 
class Tank extends GroundUnit {} 
class AirCraft extends AirUnit {} 

Unit u = new GroundUnit(); 
Tank t = new Tank(); 
AirCraft ac = new AirCraft();

위 관계를 도식화 한다면 다음과 같다.

Unit u = new GriondUnit(); 즉 참조변수 u가 가지는 주소는 GroundUnit() 객체이다.

다음중 형변환이 틀린것을 고르시오. 🔑 정답 e

a. u = (Unit)ac;
b. u=ac;
c. GroundUnit gu = (GroundUnit)u;
d. AirUnit au = ac;
e. t = (Tank)u;
f. GroundUnit gu = t;

  • 의 경우 조상의 리모컨(타입)으로 자손의 객체를 참조하는것.
  • b. 위와 같으나 조상 타입으로 형변환 하는경우 타입 생략가능.
  • c. 본래 자손타입으로 조상타입의 객체를 참조하는것은 안되나 Unit u = GroundUnit(); 즉 u가 GroundUnit();을 가지고 있으므로 동일한 인스턴스를 가진다.
  • d. 조상 타입으로 자손타입 인스턴스를 형변환 하는 경우.
  • e. 자손 타입으로 조상타입의 인스턴스를 형변환 할 수 없다.
  • f. 조상타입으로 자손타입 인스턴스를 형변환 하는 경우
profile
자바 스터디 정리 - 하단 홈 버튼 참조.

0개의 댓글