<aside> 📌 현실에서 상속은 부모가 자식에게 무언가를 물려주는 행위를 말한다. java에서 상속도 다른 것이 거의 없다. 부모 클래스가 자식클래스에게 물려줄 수 있다.
</aside>
private 키워드가 붙은 메서드 상속 불가final 클래스, 메서드 상속 불가<aside>
😅 궁금증 final, private 키워드가 붙은 메서드는 둘다 상속 못하는데 똑같은 거야?
처음 final과 private의 상속 관점에서는 거의 동일하다고 생각했다. 하지만 조금 생각해보니 final의 의미는 최종적 그러니 더 이상 수정을 할 필요가 없다. 하지만 private는 개인적 즉, 다른 외부 패키지에서 조차도 메서드를 사용할 수 없다는 것이다. 즉, final은 완성된 메서드 또는 클래스를 수정하지 못하게 하는 목적을 가지고 있고, private의 경우 외부에서 메서드를 사용하지 못하게 하는 목적을 가지고 있다.
”private 은 접근 수정자이고, final 은 추가 제약 조건을 부여하는 수정자입니다.”
</aside>
Difference between private and final class, method, and variables in Java?
<aside>
📌 위의 상속을 이용한 코드에서도 볼 수 있듯이 Person이라는 class는 말하는 방법을 알고 가지고 있다. 그것을 한국인.class와 일본인.class에 상속하여 재정의 하였다. 덕분에 같은 Person Type에 한국인 또는 일본인 인스턴스를 할당해도 재 정의된 기능을 온전히 사용할 수 있다.
</aside>
<aside> 😅 이미 잘 만들어진 클래스를 재 사용해서 새로운 클래스를 만들기 쉽기 때문이다. 이렇게 말하면 좀 어렵게 느껴진다. 그래서 필자가 느끼기에는 상속을 사용하는 것은 우리가 현실에서도 부모의 재산을 물려받으면 사회생활에 출발점이 다르듯 물려주는 행위 덕분에 할 수 있는 것은 많아지기 때문이다.
</aside>
<aside> 📌 모든 객체는 클래스의 생성자를 호출해야만 생성된다. 부모 객체도 예외는 아니다. 그렇다면 부모 객체를 생성하기 위해 부모 생성자를 어디서 호출 할 것인가? 비밀이 숨겨져 있다. 자식 객체 즉, 상속관계가 이루진 상태에서는 자동적으로 부모 생성자를 만들어 낸다.
</aside>
public class Main {
public static void main(String[] args) {
Person 한국인 = new 한국인();
한국인.talk();
}
}
CONSOLE RESULT
부모 생성자???
한국말~
class Person {
public Person() {
System.out.println("부모 생성자???");
}
public void talk(){
System.out.println("사람은 각자의 언어로 대화할 수 있습니다.");
};
}
class 한국인 extends Person{
@Override
public void talk() {
System.out.println("한국말~");
}
}
<aside>
📌 이렇게 되는 비밀은 컴파일러가 개발자가 직접 작성하지 않더라도 부모클래스의 디폴트 생성자를 호출해주기 때문이다. 좀 찾아보니 별다른 이유에 대해서 기재한 정보를 찾을 수 없었다. 그래서 내가 생각할 때 추측으로는 명시적 호출 super(…)를 사용할 때 제일 첫줄에 적어야하는 것과 관련성이 있는 것 같다. 이유는 필드 등도 상속 받을 수 있는데 부모 필드가 초기화 되지 않은 상태에서 자식에서 사용하려는 경우를 방지하려는 목적도 존재하는 것 같다.
</aside>