[JAVA]

[JAVA]9월 21일 다형성, 동적 바인딩, 추상클래스, 다중상속

jsm9301 2015. 9. 21. 12:06

* 다형성  :  하나의 코드로 여러가지 데이터를 처리하는 기술.

객체 지향에서 상속 관계일 경우 

부모 클래스의 참조변수로 자식클래스 객체를 참조 할수있다.

부모클래스에 정의된 멤버에만 접근이 가능함.

ex)Shape s = new Rectangle();//  OK!

*동적 바인딩 -  호출하는 메소드가 자식클래스 에서 재정의 되었다면 동적바인딩 되서 실제 호출 되는 메소드는 자식클래스의 메소드.

Shape s = new Rectangle();

         s.draw();  << Shapedraw()가 호출되는 것이 아니라 Rectangledraw()가 호출된다. s의 타입은 Shape이지만 s가 실제로 가리키고 있는 객체의 타입이 Rectangle이기 때문이다.


Shape s = new Rectangle(); 예를 들어 이렇게 해놨을때  부모클래스에 정의된 멤버에만 접근이 가능하다.

setWidth() << Rectangle 클래스 멤버.  호출하려면 s.setWidth()  (X) , 호출하려면 타입캐스팅 해야됨. ((Rectangle) s).setWidth();

그런데 실제 객체가 뭐든간에 컴파일러는 검사하지 않는다. 실제 객체와 다른 타입으로 캐스팅 하면 당연히 런타임 익셉션.

그러므로 형변환을 할때는 검사를 해보고 하는게 안전하다. 검사하는 방법은.

//    Shape s = new Rectangle();  //부모 클래스 참조 변수로 자식 클래스 객체를 참조 했을때

//    if(s instanceof Rectangle){

//     ((Rectangle) s).setWidth(10); // 형변환. 형변화를 할때는 검사를 해보고 하는게 안전.

//            System.out.println(((Rectangle) s).getWidth);    

   }   요렇게.

*추상클래스 

*추상클래스는 미완성 클래스 이므로 객체화 불가.*

추상메소드를 하나라도 가지고 있는 클래스는 추상 클래스.

추상메소드 :  몸체가 구현되지 않은 메소드.

public ☆abstract class Animal {

protected String name;

  public abstract void bark(); // 몸통이 없는 메소드 >> 추상메소드

                                              //추상 메소드는 abstract 키워드가 붙어야함

                                      //추상메소드를 가진 클래스는 추상클래스.

                                      // 추상클래스는 abstract키워드가 붙어야함.

//추상클래스를 상속받은 클래스는 미완성메소드를 완성하든가 자기 자신도 추상클래스가 되든가.

애초에 부모 클래스를 먼저 추상클래스로 만들고 자식클래스를 만들면서 부모클래스에게 상속을 받으면 메소드를 완성하라고 메소드칸이 만들어져 있음.(부모가 추상클래스이니까 의무를 받는것임.)


-- 다중상속

·다중 상속이란 여러 개의 수퍼 클래스로부터 상속하는 것
·자바에서는 다중 상속을 지원하지 않는다.

·다중 상속에는 어려운 문제가 발생한다