반응형

다형성


OOP에서의 다형성은 여러 가지 형태를 가질 수 있는 능력을 말하며, 자바에서는

한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현했다.


즉 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 했다는 것이다.


class Home{

  String address;

  boolean isVisit;

  

  void rest();

  void eat(); 

}

class Room extends Home{

  String roomName;

  

  void sleep();

}


Home 과 Room은 서로 상속관계에 있으며 다음과 같이 사용할 수 있다.

Home home = new Room();

Room room = new Room();


이 코드에서 Room인스턴스 2개를 생성하고 참조변수 home,room이 생성된 인스턴스를 하나씩 참조하도록 했다.

이 경우 인스턴스가 Room타입이여도 참조변수 home은 room의 모든 멤버를 사용할 수 없다. 즉, 둘 다 같은 타입의 인스턴스지만 참조변수의

타입에 따라 사용할 수 있는 멤버의 갯수가 달라지는 것이다. 


반대로 Room r = new Home()은 불가능하다. 왜냐하면 실제 인스턴스 r이 사용할수 있는 멤버 갯수가 실제 인스턴스인 Home의 갯수보다 더 많기 때문이다.

참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 하는 것이다. 왜냐하면 클래스는 상속을 통해 확장되는 것이지

축소될 수는 없기 때문이다. 조상 인스턴스의 멤버 개수는 자손 인스턴스의 멤버 개수보다 항상 적거나 같기 때문에 반대의 경우는 불가하다.


그렇다면 어차피 조상타입으로 선언하면 조상타입의 멤버만 참조가능할텐데 왜 일부 멤버만을 사용하도록 하는 것일까??


그 이유는 참조변수도 상속관계에 있는 클래스 사이에서는 형변환이 가능하기 때문이다. 자손타입의 변수를 조상타입으로 조상타입의 변수를 자손타입으로 변환할 수 있다.

따라서 모든 객체는 Object클래스 타입으로 형 변환이 가능하다.


형 변환에서 자손 -> 조상을 Up-casting

           조상 -> 자손을 Down-casting 이라고 하며 up은 생략이 가능하지만 down-casting은 형변환 생략이 불가하다.


그 이유는 조상타입 참조변수가 참조하는 것은 조상타입이거나 자손타입일 것이다. 즉 참조변수가 다룰 수 있는 멤버의 개수가 실제 인스턴스가 가지고 있는 멤버 개수보다 적을 것이 분명하므로 문제가 되지 않기 때문이다.

반응형

+ Recent posts