본문 바로가기
  • 시 쓰는 개발자
프로그래밍 문법/Java

인텔리제이에서 컴파일 결과(ByteCode) 확인하기

by poetDeveloper 2024. 1. 6.

김영한님의 java-start 강의를 듣고 작성하였습니다.

 

인텔리제이에서 컴파일 결과 확인해보기

 

예를 들어 이러한 코드가 있다고 하자.

package variable;

public class Var6 {
    public static void main(String[] args) {
        int a;
//        System.out.println(a);
    }
}

 

이 코드를 실행하면 어떻게 될까? 물론, 주석처리한 부분을 풀어주면 a를 초기화해주지 않아서 컴파일 에러가 나게 된다.

컴파일 된 결과는 주황색 out 폴더에서 확인해볼 수 있고, 다음과 같다.

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