[JAVA]9월 21일 다형성, 동적 바인딩, 추상클래스, 다중상속
* 다형성 : 하나의 코드로 여러가지 데이터를 처리하는 기술.
객체 지향에서 상속 관계일 경우
부모 클래스의 참조변수로 자식클래스 객체를 참조 할수있다.
부모클래스에 정의된 멤버에만 접근이 가능함.
ex)Shape s = new Rectangle();// OK!
*동적 바인딩 - 호출하는 메소드가 자식클래스 에서 재정의 되었다면 동적바인딩 되서 실제 호출 되는 메소드는 자식클래스의 메소드.
Shape s = new Rectangle();
s.draw(); << Shape의 draw()가 호출되는 것이 아니라 Rectangle의 draw()가 호출된다. 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키워드가 붙어야함.
//추상클래스를 상속받은 클래스는 미완성메소드를 완성하든가 자기 자신도 추상클래스가 되든가.
애초에 부모 클래스를 먼저 추상클래스로 만들고 자식클래스를 만들면서 부모클래스에게 상속을 받으면 메소드를 완성하라고 메소드칸이 만들어져 있음.(부모가 추상클래스이니까 의무를 받는것임.)
-- 다중상속