javap으로 바이트코드 검사
javap -c로 클래스 파일을 디컴파일하여 Java 구문이 바이트코드로 어떻게 변환되는지 이해합니다.
javap으로 바이트코드 검사은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
바이트코드를 조사하는 이유
바이트코드를 이해하면 JVM이 Java 코드를 실제로 어떻게 실행하는지 알 수 있습니다. 성능 문제를 디버깅하고, 컴파일러 최적화를 이해하며, 합성 코드(람다, 내부 클래스)가 예상대로 작동하는지 확인하는 데 도움이 됩니다.
기본 javap 사용법
javap ClassName은 클래스의 공개 API(메서드 시그니처, 필드 선언)를 표시합니다. 현재 디렉터리나 클래스 경로에서 .class 파일을 읽습니다.
# Compile first:
javac User.java
# Display public API:
javap User
# Output:
# public class User {
# public java.lang.String getName();
# public int getAge();
# }-c로 바이트코드 역어셈블하기
javap -c User는 각 메서드의 JVM 명령어 집합(연산 코드)을 보여 줍니다. 실행 흐름을 이해할 때 핵심적으로 확인하는 화면입니다.
# javap -c User
# public java.lang.String getName();
# Code:
# 0: aload_0
# 1: getfield #2 // Field name:Ljava/lang/String;
# 4: areturn-v로 자세한 출력 확인하기
javap -v User는 상수 풀, 접근 플래그, 스택 크기, 예외 테이블을 추가로 보여 줍니다. 심층 분석과 ClassCastException 디버깅에 필수적입니다.
# javap -v User
# Constant pool:
# #1 = Methodref #5.#22 // java/lang/Object."<init>":()V
# #2 = Fieldref #4.#23 // User.name:Ljava/lang/String;
# ...일반적인 바이트코드 명령어
다음과 같이 자주 사용되는 연산 코드를 알아 두십시오: aload_0(this 로드), getfield, putfield, invokevirtual, invokespecial(생성자/비공개 메서드), invokestatic, invokedynamic(람다), return, areturn입니다.
람다와 invokedynamic
람다 표현식은 invokedynamic 명령어로 컴파일됩니다. 첫 번째 호출에서는 LambdaMetafactory를 사용해 클래스를 생성하고, 이후 호출에서는 이를 재사용합니다. javap -v는 부트스트랩 메서드 테이블을 보여 줍니다.
// Java:
list.forEach(s -> System.out.println(s));
// Compiles to invokedynamic — javap shows:
// invokedynamic #4,0 // InvokeDynamic #0:accept:()Ljava/util/function/Consumer;문자열 연결 최적화
최신 javac는 StringBuilder 대신 "Hello " + name에 invokedynamic을 사용합니다. javap -v는 StringConcatFactory 부트스트랩 메서드를 보여 줍니다.
// Java 9+ string concat:
String s = "Hello " + name;
// Compiles to:
// invokedynamic #5,0 // InvokeDynamic #1:makeConcatWithConstants내부 클래스 접근 확인
외부 클래스가 내부 클래스의 비공개 필드에 접근하거나 그 반대의 경우, 컴파일러는 합성 access$000 메서드를 생성합니다. javap -p(비공개 멤버)를 사용하면 이러한 메서드를 확인할 수 있습니다.
# javap -p OuterClass
# static int access$000(OuterClass);
# -- synthetic bridge method generated by the compiler자동 박싱 비용 확인
자동 박싱은 Integer.valueOf() 또는 int.intValue() 호출로 컴파일됩니다. javap -c를 사용해 박싱이 발생하는지 확인하고 기본형을 사용할지 결정하십시오.
// Java:
List<Integer> list = new ArrayList<>();
list.add(42); // autoboxing
// Bytecode:
// bipush 42
// invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer;바이트코드에서 예외 처리 읽기
예외 처리기는 javap -v로 확인할 수 있는 예외 테이블 항목으로 나타납니다. 각 항목에는 시도 시작 지점, 시도 종료 지점, 처리기, 그리고 처리할 예외 타입이 표시됩니다.
# Exception table:
# from to target type
# 2 10 15 Class java/io/IOException
# -- means: if IOException in bytes 2-10, jump to handler at byte 15클래스 파일 헤더
클래스 파일 헤더에는 매직 넘버(CAFEBABE), 주 버전과 부 버전, 접근 플래그가 포함됩니다. javap -v는 클래스를 컴파일한 Java 릴리스에 대응하는 주 버전을 보여 줍니다.
# javap -v User
# minor version: 0
# major version: 61 <- Java 17
# flags: ACC_PUBLIC, ACC_SUPER빠른 확인
각 메서드의 JVM 연산 코드를 보여 주는 javap 플래그는 무엇입니까?
요약
연산 코드에는 javap -c를, 전체 세부 정보에는 javap -v를 사용하십시오. 주요 연산 코드인 invokevirtual, invokespecial, invokedynamic, getfield를 알아 두십시오. 람다, 박싱, 문자열 연결을 검사하면 컴파일러의 출력을 이해할 수 있습니다.
자주 묻는 질문
“javap으로 바이트코드 검사” 강의는 무료인가요?
네 — “javap으로 바이트코드 검사” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“javap으로 바이트코드 검사”에서 뭘 배우나요?
javap -c로 클래스 파일을 디컴파일하여 Java 구문이 바이트코드로 어떻게 변환되는지 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“javap으로 바이트코드 검사” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.