com.eomcs.oop.ex03 자바 스태틱 인스턴스 변수 및 블록 초기화 문법
매우 중요하다.. ctrl + c ctrl + v 만 잘한다고 중요한 것이 아니라 이러한 문법을 잘 아는 지가 중요하다.
프로그램을 실행하고 class 파일을 살펴보면서 각 코드가 언제 실행되고 어떻게 변하는 지를 잘 파악하려고
노력해야겠다.
스태틱 변수
1. A클래스의 스태틱 변수를 불러올 때 클래스가 로딩된다.
2. A클래스의 메소드 실행. 클래스 로딩
3. new명령어를 통해 인스턴스를 만드려는 시점. 클래스가 로딩된다.
[상세한 설명]
A.v1 = 100;와 같이 A 클래스의 스태틱 변수를 참조하려 할 때, 해당 클래스가 로딩됩니다.
스태틱 변수에 접근하기 위해서는 해당 클래스가 메모리에 로드되어 있어야 합니다.
A.m1();과 같이 A 클래스의 메소드를 실행하려 할 때도, 해당 클래스가 로딩됩니다.
메소드를 호출하기 위해서는 메소드가 정의된 클래스가 로드되어 있어야 합니다.
obj = new A();와 같이 A 클래스의 인스턴스를 생성하려 할 때에도 클래스가 로딩됩니다.
인스턴스를 생성하기 위해서는 해당 클래스의 정보가 메모리에 존재해야 합니다.
예제)
그러나 클래스는 한번만 로딩되기 때문에 위에 이미 로딩되었다면
System.out.println 은 더 이상 출력되지 않는다.
예제)
클래스가 로딩되지 않았을 때 ,
Class.forName("bitcamp.test.A") 을 통해 클래스를 로딩할 수 있다.
예제)
스태틱 블록
예제처럼. 하나의 클래스 안에 여러개의 스태틱 블록을 만드는 것은 옳지 않다.
컴파일러는 하나의 스태틱 블록으로 인식하기 때문이다.
예제)
만약 컴파일러가 실행하게 된다면 아래와 같이 실행된다.
예제)
초기화 필드 선언이 먼저 실행되고
하나의 static 블록 안으로 나머지 코드가 이동된다.
예제)
package bitcamp.test;
class A {
static int v1; // 변수선언만 실행
static int v2;
static {
v1 = 111; // 초기화가 아래로 옮겨짐
v1 = 100;
System.out.println("A 클래스의 스태틱 블록 실행1 !");
v1 = 200;
System.out.println("A 클래스의 스태틱 블록 실행2 !");
v1 = 300;
System.out.println("A 클래스의 스태틱 블록 실행3 !");
System.out.println(v1);
v2 = 222;
}
static void m1() {}
}
public class Exam01 {
public static void main(String[] args) {
A obj; // 레퍼런스를 생성할 때는 클래스 로딩이 되지 않는다.
// A.v1 = 100; // 1. A클래스의 스태틱 변수를 불러올 때 클래스가 로딩된다.
// A.m1(); // 2. A클래스의 메소드 실행. 클래스 로딩
// obj = new A(); // 3. new명령어를 통해 인스턴스를 만드려는 시점. 클래스가 로딩된다.
try {
Class.forName("bitcamp.test.A"); // 4. 클래스가 로딩되지 않았을 때 로딩하는 역할
} catch (ClassNotFoundException e) {
System.out.println("클래스를 못찾네!");
}
}
}