이번 포스트에는 Java 언어의 특징인 Compile과 그의 반댓말인 Decompile, 그리고 관련된 파일형식 및 도구에 대해 정리해보겠습니다.
1. Compile이란?
1) 정의
사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꾸어 주는 과정
컴퓨터는 0과 1로만 모든 명령을 이해하고 실행하기 때문에, 인간의 언어를 기계가 알아 들을 수 있게 바꿔주는 작업이 필요함.
- Compiler(compile + link)
- compile: 원시코드에서 목적코드(목적파일)로 바꾸어 주는 것
- link : 목적 파일을 실행 파일로 바꾸는 것
- 원시코드: 인간이 알아볼 수 있는, 우리가 작성한 코드(.java)
- 목적코드: 컴퓨터가 이해할 수 있도록 번역한 코드(기계어)(.class)
2) compile을 과정이 필요한 이유
- JVM은 byte code(.class 파일)을 실행할 때 compile 과정에서 진행 한 일을 다시 진행하지 않고, 실행만 함
- 매번 소스코드 문법검사를 하지 않고 불필요한 작업을 줄였기 때문에, 빠름
- 기업 내의 코드를 사람이 읽을 수 없는 코드로 변환하여 외부로 부터 코드자산을 지키는 의미도 있음
바이트 코드(Byte Code) : JVM 이 이해할 수있는 0과 1로 구성된 이진 코드(Binary Code)
Native Machine Code : 기계어, 컴퓨터가 이해할 수 있는 0과 1로 구성된 이진 코드(Binary Code)
2. .class vs .java
1) .java
사람이 알아볼 수 있는 JAVA언어로 적은 source code 파일, 기계는 .java코드를 읽을 수 없으며, 컴파일을해서 기계가 읽을 수 있는 기계어로 변환해야 한다.
2) .class
source code인 .JAVA 파일을 JAVA Compiler를 통해 기계가 알아 들을 수 있는 byte code(target code)로 변환한 파일
3) .JAVA → .class
$ javac 디렉토리/파일명.java
4) .class 파일 실행
$ java 클래스파일명.class
3. .JAR vs .WAR
기본적으로 JAR, WAR 모두 Java의 jar 옵션 (java -jar)을 이용해 생성된 압축(아카이브) 파일로, 애플리케이션을 쉽게 배포하고 동작시킬 수 있도록 관련 파일(리소스, 속성 파일 등)을 패키징 한 것
1) JAR (Java Archive)
- JAVA 어플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 파일
- Class (JAVA리소스, 속성 파일), 라이브러리 파일을 포함함
- JRE(JAVA Runtime Environment)만 있어도 실행 가능함 (java -jar 프로젝트네임.jar)
- Spring boot에서는 JSP, 외장 톰캣을 사용하지 않으므로 JAR가 표준
2) WAR (Web Application Archive)
- Servlet / Jsp 컨테이너에 배치할 수 있는 웹 애플리케이션(Web Application) 압축파일 포맷
- 웹 관련 자원을 포함함 (JSP, Servlet, JAR, Class, XML, HTML, Javascript)
- 사전 정의된 구조를 사용함 (WEB-INF, META-INF)
- 별도의 웹서버(WEB) or 웹 컨테이너(WAS) 필요
- 즉, JAR파일의 일종으로 웹 애플리케이션 전체를 패키징 하기 위한 JAR 파일
4. .java vs .JAR
.jar 파일은 하나 이상의 Java 클래스 파일을 포함하는 Zip 아카이브
- 라이브러리(여러 클래스로 구성됨)를 보다 편리하게 사용할 수 있음
- 디렉토리 및 .jar 파일이 클래스 경로에 추가되고, 런타임 시 ClassLoader에서 사용 가능하여 내부의 특정 클래스를 찾을 수 있음
5. Decompile이란?
6. JAD(Java Decompiler)란?
.JAR 안의 .class파일의 코드를 decompile하여 .java 소스코드로 변환시켜주는 도구
즉, 기계어를 인간이 볼 수 있는 코드로 변환시키는 방법을 지원하는 도구
1) JAD 다운로드
아래의 링크에서 jad 다운
2) JAD 실행
CMD(명령프롬프트) 실행
# jad.exe가 있는 디렉토리로 이동
cd 'jad.exe가 있는 디렉토리 위치'
jad 명령어
jad -sjava 파일이름.class
실습
jad -sjava ReqValidator.class
자주 쓰이는 옵션 정리
- -o: overwrite
- -sjava: .class → .java 파일로 변환 (-s java로 적어도 가능)
- -d외부디렉토리: 변환된 파일이 생성될 디렉토리 지정 (-d 외부디렉토리로 적어도 가능)
이외의 옵션 정리
Jad accepts the following options:
-a - annotate the output with JVM bytecodes (default: off)
-af - same as -a, but output fully qualified names when annotating
-clear - clear all prefixes, including the default ones (can be abbreviated as -cl)
-b - output redundant braces (e.g., if(a) { b(); }, default: off)
-d <dir> - directory for output files (will be created when necessary)
-dead - try to decompile dead parts of code (if any) (default: off)
-disass - disassemble method bytecodes (no JAVA source generated)
-f - output fully qualified names for classes/fields/methods (default: off)
-ff - output class fields before methods (default: after methods)
-i - output default initializers for all non-final fields
-l<num> - split strings into pieces of maximum <num> chars (default: off)
-lnc - annotate the output with line numbers (default: off)
-lradix<num> - display long integers using the specified radix (8, 10 or 16)
-nl - split strings on newline character (default: off)
-nocast - don't generate auxiliary casts
-nocode - don't generate the source code for methods
-noconv - don't convert Java identifiers (default: convert)
-noctor - suppress the empty constructors
-nodos - do not check for class files written in DOS mode (CR before NL, default: check)
-nofd - don't disambiguate fields with the same names by adding signatures to their names (default: do)
-noinner - turn off the support of inner classes (default: on)
-nolvt - ignore Local Variable Table information
-nonlb - don't output a newline before opening brace (default: do)
-o - overwrite output files without confirmation (default: off)
-p - send decompiled code to STDOUT (e.g., for piping)
-pi<num> - pack imports into one line after <num> imports (default: 3)
-pv<num> - pack fields with identical types into one line (default: off)
-pa <pfx>- prefix for all packages in generated source files
-pc <pfx>- prefix for classes with numerical names (default: _cls)
-pf <pfx>- prefix for fields with numerical names (default: _fld)
-pe <pfx>- prefix for unused exception names (default: _ex)
-pl <pfx>- prefix for locals with numerical names (default: _lcl)
-pm <pfx>- prefix for methods with numerical names (default: _mth)
-pp <pfx>- prefix for method parms with numerical names (default: _prm)
-r - restore package directory structrure
-radix<num> - display integers using the specified radix (8, 10 or 16)
-s <ext> - output file extension (by default '.jad')
-safe - generate additional casts to disambiguate methods/fields (default: off)
-space - output space between keyword (if/for/while/etc) and expression (default: off)
-stat - display the total number of processed classes/methods/fields
-t - use tabs instead of spaces for indentation
-t<num> - use <num> spaces for indentation (default: 4)
-v - display method names being decompiled
-8 - convert UNICODE strings into 8-bit strings
using the current ANSI code page (Win32 only)
-& - redirect STDERR to STDOUT (Win32 only)
All single-word options have three formats:
-o - 'reverses' value of an option
-o+ - set value to 'true' or 'on'
-o- - set value to 'false' or 'off'
참조:
https://velog.io/@mooh2jj/JAR-vs-WAR-%EB%B0%B0%ED%8F%AC%EC%9D%98-%EC%B0%A8%EC%9D%B4
'language > Java' 카테고리의 다른 글
[Java] public static void main(String args[]){}란? 이유 (0) | 2022.09.05 |
---|---|
[Java] Guava란? Guava를 써야되는 이유 (0) | 2021.05.09 |
캡슐화와 정보은닉 (0) | 2020.06.09 |
자바의 기본구성2 (0) | 2020.03.02 |
자바언어의 기본 구성 (1) | 2020.02.28 |
댓글