Closed kha212 closed 1 year ago
java 바이너리 코드를 확인해본 결과 순차적으로 코드 실행을 하는 것으로 판단됨.
public class InitializationBlock {
int tmp = 1;
{
tmp = 3;
System.out.println("초기화 블록");
System.out.println(this.tmp);
}
public static void main(String[] args) {
InitializationBlock t = new InitializationBlock();
System.out.println("[Main] t.tmp : " + t.tmp);
}
}
[결과]
초기화 블록
3
[Main] t.tmp : 3
iconst_1 -> iconst_3 : 1로 값을 셋팅하고 다시 3으로 값을 셋팅
public InitializationBlock();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_1
6: putfield #2 // Field tmp:I
9: aload_0
10: iconst_3
11: putfield #2 // Field tmp:I
14: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
17: ldc #4 // String 초기화 블록
19: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
22: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
25: aload_0
26: getfield #2 // Field tmp:I
29: invokevirtual #6 // Method java/io/PrintStream.println:(I)V
32: return
public static void main(java.lang.String[]);
Code:
0: new #7 // class InitializationBlock
3: dup
4: invokespecial #8 // Method "<init>":()V
7: astore_1
8: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
11: new #9 // class java/lang/StringBuilder
14: dup
15: invokespecial #10 // Method java/lang/StringBuilder."<init>":()V
18: ldc #11 // String [Main] t.tmp :
20: invokevirtual #12 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
23: aload_1
24: getfield #2 // Field tmp:I
27: invokevirtual #13 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
30: invokevirtual #14 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
33: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
36: return
public class InitializationBlock {
{
tmp = 3;
System.out.println("초기화 블록");
System.out.println(this.tmp);
}
int tmp = 1;
public static void main(String[] args) {
InitializationBlock t = new InitializationBlock();
System.out.println("[Main] t.tmp : " + t.tmp);
}
}
[결과]
초기화 블록
3
[Main] t.tmp : 1
iconst_3 -> iconst_1 : 3으로 값을 셋팅하고 다시 1로 값을 셋팅
public InitializationBlock();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_3
6: putfield #2 // Field tmp:I
9: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
12: ldc #4 // String 초기화 블록
14: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
17: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
20: aload_0
21: getfield #2 // Field tmp:I
24: invokevirtual #6 // Method java/io/PrintStream.println:(I)V
27: aload_0
28: iconst_1
29: putfield #2 // Field tmp:I
32: return
public static void main(java.lang.String[]);
Code:
0: new #7 // class InitializationBlock
3: dup
4: invokespecial #8 // Method "<init>":()V
7: astore_1
8: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
11: new #9 // class java/lang/StringBuilder
14: dup
15: invokespecial #10 // Method java/lang/StringBuilder."<init>":()V
18: ldc #11 // String [Main] t.tmp :
20: invokevirtual #12 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
23: aload_1
24: getfield #2 // Field tmp:I
27: invokevirtual #13 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
30: invokevirtual #14 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
33: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
36: return
인스턴스 초기화 블록 후 인스턴스 변수 명시적 초기화시 값 변경됨 해당 소스가 오류없이 되는 이유 확인 필요