일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- WebLogic
- Java5
- Spring
- 이승철
- Eclipse
- php
- Vista
- 육아
- 효민이
- ThinkFree
- 행복이
- OS
- Ant
- 부동산
- 미국드라마
- Mac
- Java
- 요리
- Swing
- Programming
- Linux
- Programing
- db
- 중고
- 판매
- 독서
- PSP
- 책
- WebService
- spring3.0
- Today
- Total
Bitaholic
class loading 순서 본문
자바에서 객체를 생성할려면 class가 필요하다.
자바에서 new 키워드로 instance를생성할 때의 순서를 보면
클래스 바이너리 파일을 JVM이 메모리에 올리고 이 클래스 바이너리를 이용해서 해당 instance를 만든다.
다음 예제를 보면
public class A extends B
{
public A()
{
System.out.println("Contruct A");
}
public static void main(String[] args)
{
new A();
}
}
public class B
{
public B()
{
System.out.println("Contruct B");
}
}
A 를 실행 해보면 Console에서는
Construct B
Construct A
처럼 부모 클래스의 생성자가 먼저 실행되는 것을 알수 있다.
JVM에서 class loading을 할때도 B클래스를 먼저 로딩하고 A클래스를 로딩한다.
인터페이스가 있는 경우는 어떠할까?
public class A extends B implements I
{
public A()
{
System.out.println("Contruct A");
}
public static void main(String[] args)
{
new A();
}
}
public class B
{
public B()
{
System.out.println("Contruct B");
}
}
Interface I
{
}
위의 것을 실행하면 상속한 클래스 보다 인터페이스를 먼저 로딩한다. 클래스 로딩 순서는
I (인터페이스) --> B (부모클래스) --> A이런 과정으로 클래스 로딩을 한다.
만약 인터페이스 'I'를 B인 부모클래스에 구현을 하고 A에서 안해도 I가 가장 먼저 로딩된다.
만약 부모, 자식 클래스가 각각 다른 인터페이스를 구현하고 있으면 가장 먼저 로딩되는 것은
자식의 인터페이스 -> 부모 인터페이스 -> 부모 클래스 -> 자식 클래스이런순서대로 로딩이 된다.
마지막으로 멤버변수에 객체가 있으면 어떻게 될까..
public class A extends B implements I
{
public C c;
public A()
{
System.out.println("Contruct A");
}
public static void main(String[] args)
{
new A();
}
}
public class B
{
public B()
{
System.out.println("Contruct B");
}
}
public class C
{
}
이와 같이 클래스 A의 멤버변수 인 C가 new 로 생성이 되지 않으면 클래스 로딩은 일어나지않는다.
즉 아래와 같이 new 로 생성을 해야 C클래스의 로딩이 일어난다.
로딩순서는 I -> B > A -> C로 멤버 변수의 클래스 가 가장 마직막에 로딩이 된다.
public class A extends B implements I
{
public C c = new C();
public A()
{
System.out.println("Contruct A");
}
public static void main(String[] args)
{
new A();
}
}