김영한님의 java-start 강의를 듣고 작성하였습니다.
인텔리제이에서 컴파일 결과 확인해보기
예를 들어 이러한 코드가 있다고 하자.
package variable;
public class Var6 {
public static void main(String[] args) {
int a;
// System.out.println(a);
}
}
이 코드를 실행하면 어떻게 될까? 물론, 주석처리한 부분을 풀어주면 a를 초기화해주지 않아서 컴파일 에러가 나게 된다.
컴파일 된 결과는 주황색 out 폴더에서 확인해볼 수 있고, 다음과 같다.
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
// a를 초기화 하지 않은 상황의 디컴파일 코드
package variable;
public class Var6 {
public Var6() {
}
public static void main(String[] args) {
}
}
이처럼 변수 a가 나오지 않는 것을 볼 수 있다. 선언만 해주고 사용하지 않는다면 메모리 낭비가 되므로 이를 컴파일 최적화 단계에서 지워주는 것이다. (컴파일러의 "코드 최적화"와는 다른 맥락인 것 같다.) 만약 변수 a를 정상적으로 선언하고 초기화해주면 아래와 같다.
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
// a를 초기화 했을 때의 디컴파일 코드
package variable;
public class Var6 {
public Var6() {
}
public static void main(String[] args) {
int a = 10;
System.out.println(a);
}
}
참고용) ByteCode
위에서 a = 10을 정상적으로 초기화 한 경우의 bytecode는 다음과 같다.
// class version 65.0 (65)
// access flags 0x21
public class variable/Var6 {
// compiled from: Var6.java
// access flags 0x1
public <init>()V
L0
LINENUMBER 3 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN
L1
LOCALVARIABLE this Lvariable/Var6; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x9
public static main([Ljava/lang/String;)V
L0
LINENUMBER 6 L0
BIPUSH 10
ISTORE 1
L1
LINENUMBER 7 L1
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (I)V
L2
LINENUMBER 8 L2
RETURN
L3
LOCALVARIABLE args [Ljava/lang/String; L0 L3 0
LOCALVARIABLE a I L1 L3 1
MAXSTACK = 2
MAXLOCALS = 2
}
주의!?
컴파일 결과를 주황색 out 폴더에서 확인 가능한데, 엄밀히 말하면 컴파일 결과가 아니라 컴파일 된 것을 우리가 보기 쉽게 디컴파일된 결과이다. 애당초 컴파일이라는 것 자체가 "고수준의 언어를 컴퓨터가 이해하는 저수준의 언어로 바꾸는 과정"이기 때문에, 이에 근거해서 생각해보면 out에서 확인하는 것이 컴파일 결과라고 말하는 것은 약간의 무리가 있다고 생각한다 ...
'프로그래밍 문법 > Java' 카테고리의 다른 글
자료형 long (Long과 long 차이) (0) | 2024.01.06 |
---|---|
리터럴이란 ? (0) | 2024.01.06 |
5장 배열 (0) | 2022.10.28 |
4장 조건문과 반복문 (0) | 2022.10.28 |
3장 연산자 (0) | 2022.10.28 |