Java를 시작할 때 가장 먼저 헷갈리는 것은 코드를 작성하는 일보다 설치와 실행이다. java와 javac는 무엇이 다르고, JDK를 설치했는데 왜 실행이 안 되는 걸까? 환경 구성과 실행 원리를 한 번에 정리해 보자.
Java 소스 코드는 일반적으로 .java 파일에 작성한다. 컴파일러는 이 코드를 JVM이 해석하거나 실행할 수 있는 바이트코드로 바꾼다.
HelloApp.java ── javac ──> HelloApp.class ── JVM ──> 실행
소스 코드 바이트코드 프로그램 동작
javac), 실행 도구(java), 표준 라이브러리 등 개발에 필요한 도구의 묶음소스 파일을 바로 실행하는 명령인 java HelloApp.java도 JDK 11부터 지원된다. 내부에서 컴파일 과정이 처리되는 것이지 Java가 컴파일을 하지 않는다는 뜻은 아니다.
처음 시작한다면 유지보수 기간이 긴 LTS JDK가 무난하다. 여기서는 JDK 25(LTS) 또는 프로젝트에서 지정한 LTS 버전을 기준으로 설명한다. 특정 버전을 요구하는 팀 프로젝트라면 그 요구사항을 먼저 따른다.
공식 배포처 중 하나인 Eclipse Temurin에서 운영체제에 맞는 JDK를 설치할 수 있다. Java 공식 학습 사이트에서도 설치와 실행 방법을 안내한다.
PATH 설정 옵션이 제공되면 활성화한다. 그렇지 않다면 JDK의 bin 경로를 PATH에 추가한다.java -version
javac -version
where.exe java
java뿐 아니라 javac까지 인식되어야 소스 코드를 컴파일할 수 있다. where.exe java가 이전 설치 경로를 가리킨다면 PATH에 오래된 Java가 먼저 등록되어 있는지 살펴본다.
운영체제용 JDK 설치 파일이나 배포판의 패키지 관리자를 이용한다. 설치 확인 명령은 같다.
java -version
javac -version
Ubuntu에서 배포판이 제공하는 OpenJDK를 설치하는 예시는 다음과 같다. 해당 버전의 패키지가 현재 Ubuntu 저장소에 있는 경우에만 실행한다.
sudo apt update
sudo apt install openjdk-25-jdk
일부 Ubuntu 릴리스에는 이 패키지가 없으므로 그런 경우 Temurin 배포 저장소 또는 공식 바이너리 설치 안내를 이용한다. 오래된 Java 7 PPA나 oracle-jdk7-installer, macOS의 시스템 Java 심볼릭 링크를 강제로 변경하는 절차는 따라 하지 않는 것이 좋다.
예제 폴더에 HelloApp.java 파일을 만들자.
public class HelloApp {
public static void main(String[] args) {
System.out.println("Java 실행 성공!");
}
}
터미널을 해당 폴더에서 열고 명령어를 실행한다.
javac HelloApp.java
java HelloApp
Java 실행 성공!
첫 번째 명령이 HelloApp.class를 만들고, 두 번째 명령이 클래스를 실행한다. java HelloApp에서 .class를 붙이지 않는 것에 주의하자.
간단한 단일 파일 프로그램은 다음처럼 실행해도 된다.
java HelloApp.java
main 메서드의 의미public: 외부에서 접근할 수 있다.static: 객체를 별도로 만들지 않고 호출할 수 있다.void: 반환값이 없다.String[] args: 실행 시 넘겨준 문자열 인자를 받는다.다음 명령으로 프로그램에 인자를 전달할 수 있다.
java HelloApp one two
지금 예제는 args를 사용하지 않으므로 화면 출력은 그대로다. 나중에 args.length를 출력하도록 바꾸면 2를 확인할 수 있다.
메모장으로도 Java 파일을 작성할 수 있지만, 소스 파일이 많아지면 자동 완성, 리팩터링, 디버깅, 실행 설정 등이 필요하다. IntelliJ IDEA, Eclipse, VS Code(Java 확장) 등 중 하나를 선택하면 된다. 처음에는 IDE가 빌드 과정을 대신해 주더라도 javac와 java가 하는 일을 알아두는 편이 좋다.
'javac'은(는) ... 명령이 아닙니다JDK 설치가 누락되었거나 PATH에 JDK bin 디렉터리가 등록되지 않았을 수 있다. java -version만 정상이라고 해결된 것이 아니다.
Could not find or load main class HelloApp파일을 컴파일한 위치와 실행 위치, 클래스 이름, 패키지 선언을 확인한다. 패키지를 붙였다면 이후 글에서 다룰 클래스 경로(classpath)도 중요하다.
class HelloApp is public, should be declared in a file named HelloApp.javapublic 최상위 클래스 이름과 파일 이름을 일치시킨다. 대소문자도 구분한다.
java HelloApp는 기존의 .class를 실행하므로 javac HelloApp.java로 다시 컴파일해야 한다. 반면 java HelloApp.java는 소스 파일 실행 모드다.
.java, 일반적인 컴파일 결과는 .class다.javac는 컴파일, java는 실행을 담당한다.