이것이 자바다 정리 #3 상속
이것이 자바다 책을 참고하였습니다.
부모 클래스의 멤버(필드, 메소드)를 자식 클래스에게 물려주는 것
private
접근 제한자를 갖는 필드, 메소드는 상속 대상에서 제외된다.default
접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외된다.super()
메소드를 이용해 호출해주어야 함public
-> private
)super
키워드를 이용해서 가능하다.super.method1(); // 부모 클래스에 method1()이 있다고 가정
final
클래스는 상속이 불가능하다. 부모 클래스가 될 수 없다.final
메소드는 오버라이딩할 수 없다.final
필드나 메소드의 원형으로는 사용하는데 문제 없다.protected
는 필드, 생성자, 메소드에 적용할 수 있다. 지금 다루는 객체가 자동 타입 변환이 되어 부모 클래스가 된 것인지 아니면 처음부터 부모 클래스로 생성되었는지 궁금할 수 있다. 이럴 때, instanceof
를 사용하여 이 객체의 타입을 확인할 수 있다.
객체명
instanceof타입명
public void isAutoTypeCastedClass(Parent parent) {
if(parent instanceof Child) {
System.out.println("Child 클래스로부터 자동 타입 변환된 클래스입니다. Child 클래스로 강제 타입 변환 가능합니다.");
} else {
System.out.println("Child 클래스로부터 자동 타입 변환된 클래스가 아닙니다.");
}
}
추상 클래스는 객체로 실체화할 수는 없지만, 특정한 객체들의 공통적인 부분을 모아놓은 클래스이다. 여기서 특성은 필드와 메소드를 말한다. 추상 클래스는 인스턴스를 생성할 수 없지만, 특정 클래스의 부모 클래스로서 활용된다.
public abstract class 클래스명 {
// fields
// constructors
// methods
}
인스턴스화 될 수 없기 때문에 생성자가 필요 없다고 생각할 수 있으나, 자식 클래스에서는 반드시 부모 클래스의 생성자를 호출해야 하므로 추상 클래스 역시 생성자가 반드시 필요하다.
모든 자식에게 같은 메소드가 적용되어도 상관없다면 오버라이딩을 할 필요가 없겠지만, 자식에 따라 다른 메소드가 필요하면 오버라이딩을 하면 된다.
더 나아가 모든 자식에게 시그니처는 같지만 실제 구현은 각각 다른 메소드가 필요할 수도 있다. 이럴 때 추상 메소드를 활용하면 된다.
책에서는 동물의 울음소리를 예로 들었다. 강아지, 고양이, 코끼리 모두
울기
라는 공통적인 행위가 존재하지만, 그에 따른 소리는 각각 달라야한다. 세 객체에게울기
라는 행위는 공통적이지만 그 소리는 공통적인 부분이 없는데 억지로 추상 클래스에 빈 메소드를 작성하거나 하면 나중에 실수로 오버라이드를 깜빡하여 울음소리를 입력하지 않을 수도 있다. 이런 경우는 반드시 오버라이드를 하도록 추상 메소드로 선언해주자.
[public | protected] abstract 리턴타입 메소드명(매개변수, ...);