상속을 통해서 다형성 구현 가능
프로그램의 유연성, 간결성, 유지보수의 유용성 등에 대한 그런 내용!
상속: 클래스를 정의할 때 이미 구현된 클래스를 상속(inheritance)받아서 속성이나 기능이 확장되는 클래스를 구현함
상속하는 클래스: 상위 클래스, parent class, base class, super class
일반적인 의미(포유류)
상속받는 클래스: 하위 클래스, child class, derived class, subclass
구체적인 의미(인간)
class B extends A {
}
상속 ≠ 재사용
상속(is-a) ≠ 합성(has-a)
13:29 고객관리 프로그램 코드 참고
protected: 상속관계에서만 public, 외부관계에서는 private으로 보이도록 함
패키지가 달라도 상속관계라면 public
참고!
하위 클래스 생성시 상위 클래스가 먼저 생성됨
: 상위 클래스로의 묵시적 형 변환
상위 클래스 형으로 변수 선언 후 하위 클래스 인스턴스 생성 가능
하위 클래스는 상위 클래스의 타입 내포하기에 가능함
Customer vc = new VIPCustomer();
//상위클래스형 = 하위클래스형 인스턴스
이 경우 메모리는 하위클래스까지 다 할당되지만 타입이 상위클래스이기에 하위클래스에서 추가된 메소드는 사용 못하고 상위클래스의 메소드까지만 사용가능(VIP 전용 메소드 이용 불가)
상위클래스에 존재하는 메소드를 수정하거나 추가하기 위해서 하위클래스에서 메소드를 재정의하는 행위이다
앞에서 소개한 업캐스팅을 사용하는 경우 하위클래스형의 인스턴스를 상위클래스의 타입으로 생성할 수 있었다. 이 때 만약 메소드 중에서 하위클래스에서 재정의한(오버라이딩한) 메소드가 있다면 해당하는 메소드는 상위클래스이 아닌 하위클래스의 재정의된 메소드가 실행된다
하나의 코드가 여러가지 자료형으로 구현되어 실행되는 것
public class AnimalTest {
public static void main(String[] args) {
AnimalTest test = new AnimalTest();
test.moveAnimal(new Human());
test.moveAnimal(new Tiger());
test.moveAnimal(new Eagle());
//이렇게 표현도 되고
//Animal animal = new Human();
//이런식으로도 되고
//이처럼 다양하게 표현할 수 있다는 점이 다형성이다
}
public void moveAnimal(Animal animal) {
animal.move();
}
}
마우스 오른쪽 클릭 → source → override
@override로 주석과 함께 재정의할 메소드 생성됨
단순한 주석이 아니라 컴파일시 오버라이드 됨을 알려줌
casting == 형변환
다운캐스팅: 자신의 고유한 특성을 잃은 서브 클래스의 객체를 다시 복구 시켜주는 것
: instance of
하위클래스 → 상위클래스 형변환은 묵시적
but
상위클래스 → 하위클래스는 명시적으로 다운캐스팅이 필요!
ex) 독수리라는 클래스에서 상위인 동물 클래스로 업캐스팅을 했는데, fly라는 독수리의 메소드를 쓰고 싶을 경우 다시 독수리 클래스로 다운캐스팅해주어야 함