OOP의 특성 중 제일 중요하다고 생각되는 다형성.
그 다형성이 포함된 상속에 대해 공부해 보아요.
상속이란..
현실 세계에서 누구나 알고 있는 부모가 자식에게 물려주는 행위.
객체 지향 프로그램에선
1) 자식(하위, 파생) 클래스가 부모(상위) 클래스의 멤버를 물려 받는것.
2) 자식이 부모를 선택해서 물려받는다.
상속 개념의 활용
메소드의 *재정의 (@Override)
2. 메소드의 재정의 조건
1) 부모 클래스의 메소드와 동일한 시그니처를 가져야 한다.
2) 접근 제한을 더 강하게 override 할 수 없다.
ex) 부모(public) -> 자식(private) 불가(X)
부모(private) -> 자식(public) 가능(O)
3) 새로운 예외(Exception) throws는 불가능하다.
but... >> throws RuntimeException은 가능하다.
3. @Override 어노테이션
컴파일러에게 부모 클래스의 메소드 선언부와 동일한지 검사를 지시한다.
정확한 메소드 재정의를 위하여 @Override를 붙여주면 오히려 조아
4. 메소드 재정의 효과 -- (다형성 -2 밑에서 정리)
재정의 된 자식 메소드가 실행된다.
5. 부모 메소드의 사용(super)
1) 메소드 재정의는 부모 메소드를 숨기는 효과를 가진다.
2) 자식 클래스에서 부모객체를 호출할 땐
super.부모메소드명();
6. 부모 클래스의 메소드에 final이 붙는다면..
재정의(Override)가 불가능하다.
부모클래스 자체에 final이 붙는다면
더이상 상속이 불가능하다 ex) public final class Car(){}
다형성 (多形性, Polymorphism)
같은 타입이지만, 실행 결과가 다양하게 나오는 객체 대입(이용)이 가능한 성질
부모 타입에는 모든 자식 객체가 대입 가능하다.
- 자식 타입은 부모 타입으로 자동 타입변환 (promotion(묵시적 형변환))
┌────────────────────────────┐
↓ 자동 타입 변환 ↓
부모클래스 변수 = 자식클래스 타입;
ex) Animal animal = new Cat(); < 가능하다 -- 다형성 -1 밑에서 정리.
상속관계 없이는 다형성이 성립될 수 없다.
다형성 -1
부모타입의 클래스에 자식클래스가 들어갈 수 있다.
ex) Animal animal = new Dog();
다형성 -2 ==> Overriding
자식클래스에 메소드가 Override(재정의)되면
메소드가 호출 될 때 다른 형태로 나타난다.
다형성이 적용되는 지점
1) 필드
2) 메소드가 갖는 매개변수
객체 타입 확인(instanceof)
부모 타입이면 모두 자식타입으로 강제형변환을 할수 있는것은 아니다.
ClasCastException 예외가 발생할 수 있기에,,,
ex) Parent parent = new Parent();
Chile child = (Child)parent; // 강제 타입변환을 할 수 없다.
즉, 먼저 자식타입인지 확인한 후에 강제 타입변환을 실행해야 한다.
자식타입인지 확인하는 방법에는 instanceof가 있다.
Form) boolean result = 좌항(객체) instance of 우항(타입)
ex) public void method(Parent parent){
if(parent instanceof Child)
{
Child child = (Child) parent;
}
다음시간에는 이어서 추상클래스에 대해
알아보겠습니다.