HOWTO · Java

Java 클래스 디컴파일

Eclipse, IntelliJ IDEA, 명령줄 디컴파일러, JD-GUI를 사용해 Java .class 파일과 JAR을 검사하는 방법을 알아보세요.

이 페이지의 내용

컴파일된 Java 코드를 검사하려면 독립 실행형 .class 파일을 IDE나 디컴파일러에서 열거나, 아카이브를 지원하는 도구로 .jar 아카이브를 탐색하세요. Enhanced Class Decompiler(ECD)를 갖춘 Eclipse IDE와 IntelliJ IDEA는 재구성된 소스를 표시할 수 있고, JD-CLI와 FernFlower는 명령줄 워크플로를 제공하며, JD-GUI는 탐색 가능한 인터페이스를 제공합니다. 디컴파일은 소스를 사용할 수 없을 때 동작을 설명하는 데 도움이 되지만, 원본 소스를 정확히 복원할 수는 없습니다. 주석과 서식은 바이트코드에 없으며, 이름이나 구조가 다를 수 있습니다.
디컴파일은 Java 튜토리얼의 클래스 및 메서드 그룹에 있는 클래스 수준 주제 중 하나입니다.

Java 클래스를 디컴파일하는 이유

컴파일된 .class 파일에는 클래스의 Java 바이트코드가 들어 있습니다. .jar 파일은 클래스 파일, 이미지, 구성 및 기타 리소스를 포함할 수 있는 아카이브입니다. ZIP 도구로 아카이브의 내용을 나열하거나 압축을 풀 수 있습니다. 디컴파일은 그 안에 포함된 컴파일된 클래스 중 하나의 읽을 수 있는 코드가 필요할 때 유용합니다.

개발자는 일반적으로 라이브러리를 이해하거나, 동작을 조사하거나, 무엇이 패키징되었는지 확인하기 위해 컴파일된 클래스를 검사합니다. 이미 IDE에서 작업 중이라면 IDE를, 반복적인 파일 처리가 필요하다면 명령줄 디컴파일러를, 클래스를 대화형으로 탐색하고 싶다면 JD-GUI를 선택하세요. 일반적으로 파일에 대한 액세스 권한과 해당 형식을 읽을 수 있는 도구가 필요합니다. 파일이 JAR라는 사실 자체가 권한이 제한되어 있다는 뜻은 아닙니다.

Java 디컴파일러

Java 디컴파일러는 바이트코드를 분석하고 소스와 유사한 Java 코드를 재구성합니다. 그 결과는 근사치이며 소스 프로젝트를 복원한 것이 아닙니다. 컴파일러는 일반적으로 주석과 소스 서식을 제거합니다. 컴파일러 옵션과 사용 가능한 디버그 메타데이터에 따라 지역 변수 이름과 줄 정보도 없을 수 있습니다. JAR은 파일들의 아카이브이고, .class 파일은 개별 컴파일된 클래스입니다. 디컴파일러는 도구에 따라 둘 중 어느 것이든 허용할 수 있습니다.

빠른 검사가 필요하면 IntelliJ IDEA나 Eclipse IDE를 사용하세요. 터미널 워크플로에는 JD-CLI나 FernFlower를 사용하세요. JAR을 탐색하고 창에서 클래스를 선택하려면 JD-GUI를 사용하세요. Java 디컴파일러 개요에서 관련 도구 정보를 확인할 수 있습니다.

Eclipse IDE를 사용하여 Java 클래스 디컴파일하기

Eclipse Marketplace에서 Enhanced Class Decompiler(ECD) 플러그인을 설치한 다음, 클래스 파일을 해당 편집기와 연결하세요.

  • Help를 열고 Eclipse Marketplace를 선택합니다. Enhanced Class Decompiler를 검색하고 설치 안내를 따릅니다.
  • Window > Preferences를 연 다음 General > Editors > File Associations를 선택합니다.
  • *.class 파일 형식을 선택합니다. 연결된 편집기 목록에서 ECD 디컴파일러 편집기를 선택하고, 클래스 파일이 거기서 열리도록 하려면 기본값으로 설정합니다.
  • 환경 설정을 적용한 다음 Project 또는 Package 탐색기에서 .class 파일을 엽니다.

메뉴 레이블은 Eclipse 릴리스마다 약간 다를 수 있습니다. 파일이 다른 편집기에서 열리면 File Associations로 돌아가 *.class 파일에 대해 디컴파일러 편집기가 선택되어 있는지 확인하세요.

IntelliJ IDEA를 사용하여 Java 클래스 디컴파일하기

IntelliJ IDEA는 라이브러리의 클래스를 포함하여 확인할 수 있는 클래스 파일의 디컴파일된 소스를 표시할 수 있습니다. Project 보기에서 클래스를 열거나 이름으로 클래스로 이동하면 IDE가 재구성된 소스 보기를 제공합니다. 별도의 디컴파일러 설정 없이 검사할 수 있어 유용합니다. 표시되는 코드는 여전히 바이트코드에서 파생된 것으로, 원본 소스 파일이 아닙니다.

명령줄을 사용하여 Java 클래스 디컴파일하기

명령줄 디컴파일러는 알려진 입력 파일이나 아카이브를 처리하려는 경우에 유용합니다. 호환되는 Java 런타임을 설치하고 해당 프로젝트에서 도구를 가져오세요. 해당 릴리스에 포함된 사용 지침을 확인하세요. 명령 구문, 옵션 및 허용되는 입력 형식은 빌드마다 다를 수 있습니다. 선택한 릴리스에 대해 검증된 호출 방법이 없으므로 여기에는 도구별 명령이 포함되어 있지 않습니다.

JD-CLI 사용하기

JD-CLI는 명령줄 Java 디컴파일러입니다. 실행 파일과 입력 경로를 제공한 다음, 다운로드한 릴리스에 문서화된 출력 옵션을 사용하세요. 해당 릴리스의 도움말이나 문서에서 독립 실행형 클래스, JAR 또는 둘 다 허용하는지, 재구성된 소스를 어디에 쓰는지 확인하세요. JD-CLI는 intoolswetrust/jd-cli에서 다운로드하고 해당 빌드의 사용 문서를 따르세요.

FernFlower 사용하기

FernFlower는 또 다른 Java 디컴파일러입니다. 사용 중인 빌드에 문서화된 구문으로 디컴파일러, 소스 클래스 또는 아카이브, 대상 디렉터리를 지정하세요. 해당 버전이 JAR뿐만 아니라 독립 실행형 클래스도 허용하는지, 추가 설정이 필요한지 확인하세요. 마찬가지로 검증된 FernFlower 호출 방법은 여기에 포함되어 있지 않습니다.

FernFlower 미러에는 프로젝트 및 빌드 정보가 들어 있습니다. 소스 체크아웃은 빌드를 위해 호환되는 Gradle 설정이 필요할 수 있습니다. 일반적인 검사에는 프로젝트에서 패키지 릴리스를 제공하는 경우 그것을 사용하세요. 빌드 및 디컴파일러 명령은 선택한 릴리스와 로컬 Java/Gradle 설치에 따라 달라지므로 여기서는 검증된 실행 단계로 제시하지 않습니다.

JD-GUI를 사용하여 Java 클래스 디컴파일하기

JD-GUI는 클래스 파일을 열고 JAR 아카이브의 클래스를 탐색하기 위한 그래픽 Java 디컴파일러입니다. JD-GUI 프로젝트 사이트에서 호환되는 릴리스를 다운로드하세요. 애플리케이션의 파일 선택기를 통해 .class 파일이나 JAR을 연 다음, 탐색 창에서 클래스를 선택하여 재구성된 소스를 검사하세요. 정확한 메뉴는 릴리스마다 다릅니다.

이 완전한 Java 프로그램은 인사말을 출력하며, JD-GUI에서 해당 클래스 파일을 열기 전에 컴파일하기에 적합합니다.

public class Example1 {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

표준 출력은 다음과 같습니다.

Hello World

컴파일된 클래스를 검사할 때 JD-GUI는 args 매개변수를 paramArrayOfString 같은 다른 이름으로 표시하고 소스 주석을 생략할 수 있습니다. 주석과 서식은 일반 클래스 바이트코드에 저장되지 않습니다. 디버그 메타데이터가 있으면 일부 이름이나 줄 정보가 유지될 수 있습니다. 컴파일 중에 디버거를 사용하는 것 자체가 클래스를 더 읽기 쉽게 만들지는 않습니다. 재구성된 코드는 동작을 파악하기 위한 안내로 취급하고, 정확한 주석, 이름 또는 프로젝트 구조가 중요하면 원본 소스를 참조하세요.