Helloworld를 살펴보자!
public class Helloworld {
public static void main(String[] args) {
System.out.println("Hello world.");
}
}
javac Helloworld.java
생성된 Helloworld.class를 살펴보자.
javap -c -l -v Helloworld.class
javap [번역] 는 클래스(.class) 파일 역어셈블러(역컴파일러는 이상한가? ㅡ_-)?)이다. 컴파일되어서 바이트코드가 된 클래스파일을 살펴본 적이 없었다. ㅡ0-);;
Classfile /ihoneymon/Documents/Helloworld.class
Last modified 2013. 6. 26; size 426 bytes
MD5 checksum 1c34705a72fff1557ef69c977ce53552
Compiled from "Helloworld.java"
public class Helloworld
SourceFile: "Helloworld.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #6.#15 // java/lang/Object."<init>":()V
#2 = Fieldref #16.#17 // java/lang/System.out:Ljava/io/PrintStream;
#3 = String #18 // Hello world.
#4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/String;)V
#5 = Class #21 // Helloworld
#6 = Class #22 // java/lang/Object
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Utf8 LineNumberTable
#11 = Utf8 main
#12 = Utf8 ([Ljava/lang/String;)V
#13 = Utf8 SourceFile
#14 = Utf8 Helloworld.java
#15 = NameAndType #7:#8 // "<init>":()V
#16 = Class #23 // java/lang/System
#17 = NameAndType #24:#25 // out:Ljava/io/PrintStream;
#18 = Utf8 Hello world.
#19 = Class #26 // java/io/PrintStream
#20 = NameAndType #27:#28 // println:(Ljava/lang/String;)V
#21 = Utf8 Helloworld
#22 = Utf8 java/lang/Object
#23 = Utf8 java/lang/System
#24 = Utf8 out
#25 = Utf8 Ljava/io/PrintStream;
#26 = Utf8 java/io/PrintStream
#27 = Utf8 println
#28 = Utf8 (Ljava/lang/String;)V
{
public Helloworld();
Signature: ()V
flags: ACC_PUBLIC
LineNumberTable:
line 1: 0
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
public static void main(java.lang.String[]);
Signature: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
LineNumberTable:
line 3: 0
line 4: 8
Code:
stack=2, locals=1, args_size=1
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Hello world.
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
LineNumberTable:
line 3: 0
line 4: 8
}
이 Helloworld 클래스의 경우에는 main() 메소드에 의해서 실행되다 보니 더욱 절차적인 형태를 띄게 되지 않았을까?
역컴파일된 클래스파일을 보면, 실행순서와 참조하는 라이브러리들을 확인할 수가 있다. 이런거였군~!
이제 조금은 자바를 대하는 태도가 변하고 있는 듯 하다. 얼마 전까지만 해도 구현하는 것에만 집착했었는데,
최근에는 개발환경 구축, CI, 변경이력관리, 아키텍처 등에 대해서 조금씩 시선이 돌아가고 있다.
그만큼, 내 역량이 성장했다는 증거가 되길 바란다.