우주코딩
상속 클래스 로딩과 인스턴스 생성 과정, 생성자 호출 순서 본문
상속 사용
상속 받는다는 것은 수퍼 클래스의 코드를 그대로 복제해 온다는 것이 아니다.
그냥 수퍼 클래스의 코드를 사용할 수 있는 권한을 획득한다는 것이다.
메서드를 호출할 때 상속 클래스 관계에 따라 주소값의 클래스에서 상위 클래스로 찾아간다.
그래서 서브 클래스를 사용하려면 반드시 서브 클래스가 상속 받는 모든 조상 클래스가 있어야 한다. 하나의 수퍼 클래스라도 없다면 classnotfound 에러가 발생한다.
클래스 로딩과 인스턴스 생성 과정
new 명령을 실행하면 해당 클래스의 수퍼클래스의 인스턴스 변수부터 만든다.
수퍼클래스의 인스턴스 변수가 먼저 만들어지고 그 다음 서브 클래스의 변수가 만들어진다.
클래스 로딩 또한 수퍼클래스가 로딩되어있지 않은 상태라면 수퍼클래스가 먼저 로딩된다. 한번 클래스를 로딩하면 다시 로딩되지 않는다.
수퍼클래스의 생성자를 먼저 '수행'한다.
서브클래스의 생성자부터 '호출'되는거고 '수행'하는 것은 수퍼클래스의 생성자부터 '수행'한다.
서브클래스의 생성자 젤 처음에 수퍼 클래스를 호출하는 명령이 들어간다.
수퍼클래스의 생성자엔 수퍼 클래스를 호출하는 명령이 없는가? 아니다. 있다.
수퍼클래스는 extends를 적지 않으면 jvm이 java.lang.Object 클래스를 컴파일러가 자동으로 추가한다.
즉, 모든 클래스엔 수퍼 클래스가 존재하며 최꼭대기엔 lang패키지의 Object 클래스가 존재한다.
자바의 모든 클래스의 root 클래스는 Object다.
수퍼클래스에 선언된 인스턴스 변수 만들고 해당 클래스인 서브 클래스의 인스턴스 변수를 만든다.
그리고 그 주소를 레퍼런스에 저장한다.
인스턴스 생성할 땐 모든 수퍼클래스가 존재해야한다.
수퍼클래스 = 상속해주는 클래스
서브클래스 = 상속받는 클래스
수퍼클래스나 서브클래스는 상대적인 개념이다.
생성자 호출 순서
A 클래스{ v1 , A 생성자}
B 클래스 extends A { v2 , B 생성자}
C 클래스 extends B { v3 , C 생성자}
new C(); // C 클래스의 기본생성자 호출
- 수퍼클래스의 인스턴스 변수부터 만들어 내려온다. 만들어지면 기본값으로 초기화된다.
- 해당 클래스(C 클래스)의 생성자가 호출된다.
- 모든 생성자에 첫 라인에 수퍼클래스를 호출하는 명령이 있다.
- A 클래스 생성자 실행 -> B 클래스 생성자 실행 -> C 클래스 생성자 실행
- A 클래스의 수퍼클래스는 Object 클래스이다.
수퍼클래스의 어떤 생성자를 호출할지 지정하지 않으면 컴파일러는 다음과 같이 수퍼클래스의 기본 생성자를 호출하라는 명령을 생성자의 첫줄에 추가한다.
super();
즉 개발자가 붙이지 않으면 자동으로 붙인다.
무조건 첫줄에 실행해야한다 첫줄이 아닌 밑에 놓으면 오류가 난다.
'자바 본 강의' 카테고리의 다른 글
다형성과 다형적 변수, 오버로딩과 상속, 오버라이딩과 필드 오버라이딩 (0) | 2021.07.30 |
---|---|
상속과 생성자, 다중 상속, Specialization / Generalization , 추상 클래스, 추상화 문법, 추상 메서드 (0) | 2021.07.30 |
상속 문법의 존재 이유, 상속 사용 (0) | 2021.07.28 |
생성자 활용 (0) | 2021.07.28 |
클래스와 생성자, 인스턴스 필드와 블록 (0) | 2021.07.27 |