
Java를 공부하면서, 자바 실행 과정에 대해 공부했습니다.
그러던 중 이름이 유사한 java와 javac명령어가 어떤 차이를 가지는지 궁금해졌습니다.
아래에서는 Java에서 사용하는 두 명령어인 javac와 java를 비교해보겠습니다.
javac와 java
Java로 프로그램을 작성하고 실행하기 위해서는 단순히 소스 코드를 작성하는 것만으로는 충분하지 않습니다.
작성한 코드를 컴파일(Compile)해서 실행 가능한 형태로 변환하고, 변환된 결과를 실행(Run)해야 비로소 프로그램이 동작합니다.
이 과정에서 사용하는 두 가지 핵심 명령어가 바로 javac와 java입니다.
하나는 컴파일을 담당하고, 다른 하나는 실행을 담당하는 서로 다른 역할을 가지고 있습니다.
아래에서 각각을 자세히 살펴보겠습니다.
1) javac (Java Compiler)
Java 소스 코드(.java)를 바이트코드(.class)로 변환하는 컴파일러
JDK(Java Development Kit)에 포함된 Java 컴파일러 프로그램을 가리키며,
그 프로그램을 실행하는 명령어가 javac입니다.
자바로 작성한 소스 코드(.java)는 운영체제(OS)가 직접 실행할 수 없습니다.
따라서 javac 명령어를 사용해 소스코드를 컴파일해야 하며,
이 과정에서 JVM(Java Virtual Machine)이 해석할 수 있는 바이트코드(.class)로 변환됩니다.

위의 이미지는 예시로 작성한 자바 소스 코드(.java)입니다.
이 파일을 실행하기 위해 javac 명령어로 컴파일하는 과정을 보면 아래와 같습니다.


결과적으로 Hello.java가 Hello.class로 변환됩니다.
생성된 Hello.class 파일은 바이트코드이며, JVM이 실행할 수 있는 형태로 변환된 것입니다.
2) java (Java Application Launcher)
컴파일된 바이트코드(.class)를 JVM 위에서 실행하는 명령어
javac로 컴파일된 .class 파일은 기계어(Machine Code)가 아니기 때문에,
운영체제가 직접 실행할 수 없습니다.
이때 java 명령어를 사용하면 JVM이 .class 파일의 바이트코드를 해석하여, OS/CPU가 실행할 수 있는 기계어로 변환합니다.
즉, java는 프로그램을 실행(run)하는 명령어입니다.

위의 실행 예시를 보면, Hello.class 바이트코드가 JVM에 의해 해석되어 기계어로 변환되고,
그 결과가 잘 출력되는 것을 확인할 수 있습니다.
여기서 주의할 점은 코드를 실행할 때 .class 확장자를 붙이지 않고 클래스 이름만 적는다는 것입니다.
javac vs java
- javac : 컴파일러 → .java 파일을 .class 바이트코드 파일로 변환
- java : 실행기 → .class 바이트코드를 JVM에서 실행
즉, javac는 "준비" 과정, java는 "실행" 과정이라고 이해하면 쉽습니다.
실제 개발 환경에서
지금까지는 javac와 java명령어를 직접 사용하여 자바 소스 코드의 실행 과정을 이해하기 쉽게 살펴보았습니다.
그러나 실제 개발 과정에서는 보통 IntelliJ, Eclipse 같은 IDE나 Maven, Gradle 같은 빌드 도구가 내부적으로 javac와 java를 자동으로 실행해 줍니다.
따라서 개발자는 단순히 Run 버튼을 클릭하거나 빌드 명령어를 실행하는 것만으로,
소스 코드 작성 → 컴파일 → 실행의 전 과정을 한 번에 처리할 수 있습니다.
마무리하며
이처럼 이름이 비슷한 javac와 java는 하는 역할이 분명히 다릅니다.
앞서 JVM의 구조와 실행 과정을 공부했기 때문에,
두 명령어가 각각 컴파일과 실행을 담당한다는 점을 더욱 명확하게 이해할 수 있었습니다.
또한, 직접 명령어를 입력해 실행 과정을 확인하면서,
평소에 IDE에서 단순히 Run 버튼을 클릭하는 것만으로 실행이 가능했던 이유가 무엇인지 알 수 있었습니다.
좀 더 자바 실행 과정 전반에 대해 깊이 이해하고 싶다면,
JVM 구조와 실행 과정까지 살펴보는 아래의 글을 참고해주시면 좋겠습니다.
[Java] JVM 구조부터 자바 실행 과정까지
Java를 공부하면서 JVM, JRE, JDK, JIT의 개념을 하나씩 익히다 보니,네 가지 개념이 어떻게 다른지 조금씩 구분할 수 있게 되었습니다. 처음에는 이름이 비슷하여 헷갈렸지만, 개념이 정리되니 오히
suhyun113.tistory.com
'프로그래밍 > Java' 카테고리의 다른 글
| [Java] JVM 구조부터 자바 실행 과정까지 (7) | 2025.08.15 |
|---|---|
| [Java] JVM, JRE, JDK, JIT 차이와 포함 관계 (5) | 2025.08.14 |