카테고리 없음

[객체지향] 다형성

Daybreak0_0 2016. 6. 14. 17:58

- 자바의 모든 클래스들은 기본적으로 Object 클래스로부터 상속받고 있으므로, Object 클래스와 IS-A- 관계가 설정되어있음

- 따라서, 자바의 모든 객체는 자신의 클래스 타입이면서 Object 타입이다.


객체에 접근하는 방법은 참조 변수를 통하는 것!! 


- 참조변수는 클래스나 인터페이스를 자신의 타입으로 선언할 수 있다. 참조 변수가 인터페이스 타입으로 선언되면, 그 인터페이스를 구현하는 어떤 클래스의 객체도 참조할 수 있다. 

- 자바는 다중 상속이 불가능하다. 


class PlayerPiece extends GameShape, Animatable {  }  // 불가능 !!


그렇다면?

클래스 대신 Animatable 인터페이스를 정의하고, 그것이 필요한 GameShape 서브 클래스에서만 그 인터페이스를 구현하도록 하면 된다.


public interface Animatable {

public void animate();

}


그리고 이 인터페이스를 구현하도록 수정한


class PlayerPiece extends GameShape implements Animatable {

public void movePiece() {

System.out.println("moving game piece");

}

pubic void animate() {

System.out.println("animation. ..");

}

     // ... 

}


PlayerPiece 객체는 언제든지 다음 4가지 형태로 다형적인 처리(상속받은 메서드의 실행을 다르게 하는)가 가능해진다.


  • Object 
  • GameShape
  • PlayerPiece
  • Animatable
따라서, PlayerPiece 객체 참조 변수는 다음과 같이 선언해도 문제가 없다.

PlayerPiece player = new PlayerPiece();
Object o = player;
GameShape shape = player;
Animatable mover = player;

객체는 PlayerPiece 하나만 있지만, 참조변수는 4 가지의 서로 다른 타입으로 되어있다. 
그리고 모든 참조 변수는 똑같은 객체를 참조한다. 그렇다면, 어떤 참조변수를 사용했을 때 displayShape() 메서드를 호출할까?
컴파일러가 허용하는 메서드 호출은 객체 자신의 타입과는 무관하게 참조 변수의 타입을 기준으로 한다.. 
GameShape이나 PlayerPiece 타입의 참조 변수를 이용해서 displayShape() 메서드를 호출할 수 있다.