2021-06-22 강의록_상속, 다형성
상속 Inheritance
-
상속없이는 다형성도 존재할 수 없다!
-
상속 대상 : 부모의 필드와 메소드
(생성자, 정적멤버 등 X.
부모 클래스의 private 필드, 메소드는 제외.
부모 클래스가 다른 패키지에 있을 경우, default 필드, 메소드 제외.) -
정적멤버는 클래스에 소속되어있으므로 => 이미 공유된다는 개념. 상속의 개념이 아니다.
상속되는것은 인스턴스 멤버(객체 없이는 존재할 수 X => 부모객체 먼저 생성되어야 자식 객체에 물려줄 수 있다)
extends
- 자바는 단일 상속 >> 부모 클래스 나열 불가
class 자식클래스 extends 부모클래스 1,부모클래스2{ ;; } <<= 불가
인터페이스는 다중상속 가능
super
- 자식객체 생성자의 가장 첫 줄에 위치. (부모객체가 생성되어야 자식객체가 있을 수 있으니까!)
명시적으로 개발자가 작성하지 않으면 컴파일러가 자동으로 생성함.
부모 클래스에 기본(매개변수 없는) 생성자가 없다면 필수 작성해야 함. - 이미 생성된 부모객체(힙영역) 의 주소를 가짐
public Student(String name, String ssn, int StudentNo) {
super(name, ssn); //부모객체의 생성자 호출 (>> 부모필드의 초기화 수행)
this.studentNo = studentNo; //자식객체의 필드 초기화 수행
- 자식 클래스에서 원래의 부모
다형성 1 규칙. 자동 타입 변환 = Promotion
부모 타입(상위 객체. LValue)에는 모든 자식 객체(하위 객체. RValue)가 대입될 수 있다. (다형성 1 규칙)
(cat == animal //true)
->> 자식객체가 부모객체로 완전히 흡수되는것이 아니다. 레퍼런스 주소는 그대로임.
->> 부모가 자식을 품으면 자식이 보이지 않는다.
(부모타입에 선언되어있는 필드, 메소드밖에 쓸 수 없음)
- 바로 위의 부모 아니더라도 상속 계층의 상위면 자동 타입 변환 가능
(변환 후에는 부모 클래스 멤버만 접근 가능)
다형성 2 규칙. Override = 메소드 재정의
부모클래스의 상속 메소드를 수정해 자식 클래스에서 재정의 하는 것.
다형성 1 규칙의 예외 상황.
- 부모 클래스의 메소드와 동일한 시그니처 가져야 함.
- 접근 제한자를 더 강하게 오버라이딩 불가
(public 을 default나 private로 수정 불가.
반대로 default는 public으로 수정 가능) - 새로운 예외(Exception) throws 불가 >> RuntimeException 은 가능. CheckedException 불가능!
(이 때 @Override 어노테이션을 기술해줘야 컴파일러가 문법을 더 강하게 체크해 줌!) - 부모 메소드는 숨겨지는 효과 발생 >> 재정의된 자식 메소드 실행
(다형성 2 규칙)
@Override
public void fly() throws RuntimeException{ // 상속받은 메소드 재정의(다형성 2)
log.debug("fly() invoked.");
if(flyMode == SUPERSONIC) {
log.info("초음속 비행합니다.");
} else {
//Airplane 객체의 fly() 메소드 호출
super.fly(); // 부모객체의 메소드 호출(다형성 2를 우회)
} //if-else
} //fly
다형성 Polymorphism
같은 타입이지만 실행결과가 다양한 개체 대입(이용)가능한 성질.
부모 타입에는 모든 자식 객체가 대입 가능 ( 자식은 부모 타입으로 자동 타입 변환)
->> OOP의 핵심인 객체조립이 가능해진다
- 부품객체들이 있을 때, 실행클래스의 메소드 매개변수 타입은 부모타입(즉 다형성 구현)으로 선언해야 함.
- 다형성을 메소드에 적용하든, 지역변수로 적용하든, 필드로 적용하든.
Author And Source
이 문제에 관하여(2021-06-22 강의록_상속, 다형성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mindddi/2021-06-22-강의록상속-다형성저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)