Java/Language
helloworld를 살펴보자.
허니몬
2013. 6. 29. 10:37
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, 변경이력관리, 아키텍처 등에 대해서 조금씩 시선이 돌아가고 있다. 그만큼, 내 역량이 성장했다는 증거가 되길 바란다.