2013년 8월 8일 목요일

[2주차 5일] 상속(Inheritance) 2 - 클래스 로딩과 생성자 호출 순서

상속을 받은 클래스가 어떤 순서로 로딩이 되는지 살펴 보도록 하자.

1. super 클래스 로딩
      1) 클래스 검사   2) 클래스변수(static변수) 준비   3) static블럭 수행
2. 인스턴스 생성
3. 생성자 호출

ex>
class A {
int i;
public A() {
super(); // 생략하면 컴파일러가 자동으로 붙인다.
}
}
class B extends A{
int j;
public B() {
super();
}

}
class C extends B{
int k;
public C() {
super();
}
}
public class InheritTest {
public static void main(String[] args) {
C p = new C(); // [i][j][k]
p.i = 10;
p.j = 20;
p.k = 30;
}
}

아래의 그림과 같이 클래스 생성이 된다.


위의 과정에서 생성자 호출에 대해서 좀 더 자세히 알아보자.




상속 시 생성자(Constructor) 호출 순서

: 상속 시에 생성자는 자식클래스에서 super()를 이용해서 부모클래스의 생성자를 호출해 주고 실행은 부모클래스부터 순차적으로 실행 된다.
아래의 예제로 좀 더 정확하게 살펴보자.

ex>
class A {
int i;
// 안만들면 다음과 같이 기본 생성자가 만들어 진다.
public A() {
super(); // 생략하면 컴파일러가 자동으로 붙인다.
System.out.println("A() 실행:");
i = 100;
}
}
class B extends A{
int j;
public B(int v) {
super();
System.out.println("B() 실행:");
j = v;
}
}
class C extends B{
int k;
public C() {
super(500);
System.out.println("C() 실행:");
k = 300;
}
}
public class InheritTest {
public static void main(String[] args) {
C p = new C(); // [i][j][k]
System.out.println(p.i);
System.out.println(p.j);
System.out.println(p.k);
}

생성자의 호출자식클래스에서 부모클래스로 하지만 실행부모클래스에서 자식클래스 순으로 한다는 것을 알수 있다.


* default생성자는 생성자를 만들지 않았으면 자동으로 만들어 지지만, 생성자가 한개 라도만들어져 있다면 default생성자는 만들어 지지 않는다.

* super()를 생략하는 경우에는 자동으로 추가 시킨다.

* super()는 생성자의 먼저 부모클래스의 생성자를 호출해야 하기 때문에 제일 첫줄에 위치해야 한다.

* super()로 부모의 생성자를 호출 할 때 인자값을 같이 넘길수 있다.

댓글 없음:

댓글 쓰기