단순 소스코드 프로그램 실행하기
단순 소스코드 프로그램 실행하기 (Launching Simple Source-Code Programs)
Java 11부터는 java 런처로 단일 파일 소스코드 프로그램을 실행할 수 있게 되었고, Java 22부터는 여러 파일로도 실행할 수 있게 됐어요. 별도로 컴파일할 필요 없이 소스 파일을 바로 실행하니, 아직 컴파일·실행이라는 절차에 익숙하지 않은 입문자에게 정말 유용한 기능이에요. 이 문서에서는 이 기능을 활용하는 여러 방법과 함께 주의할 점도 살펴볼게요.
본문
단순 소스코드 프로그램 실행
JDK 11에서는 java 런처로 단일 파일 소스코드 프로그램을 실행하는 기능이 도입됐어요. 그리고 JDK 22부터는 여러 파일로도 실행할 수 있게 됐죠. 소스 코드를 먼저 명시적으로 컴파일할 필요 없이 실행할 수 있어요. 이는 java 런처가 자동으로 컴파일러를 호출하고, 컴파일된 코드를 메모리에 저장하는 방식으로 동작해요. 코드를 컴파일하고 실행하는 번거로운 과정을 거치지 않아도 되니, Java를 배우거나 Java API의 새 기능을 탐구하는 데 아주 좋은 방법이에요. 이 기능을 사용하는 방법은 여러 가지이며, 몇 가지 제한 사항과 유의할 점도 있어요.
첫 번째 단일 파일 소스코드 프로그램 실행하기
단일 파일 소스코드 프로그램을 실행하려면, 소스 파일에 정의된 첫 번째 클래스가 다음 HelloWorld처럼 public static void main(String[])을 포함하고 있어야 해요.
public class HelloWorld {
public static void main(String[] args) {
IO.println("Hello World!");
}
}
명령줄에서 HelloWorld는 다음과 같이 실행할 수 있어요 (파일 이름도 HelloWorld.java라고 가정해요).
$ java HelloWorld.java
인자 전달하기
일반적으로 컴파일된 클래스처럼 인자를 전달할 수도 있어요. 아래 예시를 볼게요.
public class HelloJava {
public static void main(String[] args) {
IO.println("Hello " + args[0]);
}
}
인자는 다음과 같이 전달하면 돼요.
$ java HelloJava.java World!
같은 파일에 여러 클래스 정의하기
캡슐화 목적을 위해 같은 소스 파일 안에 여러 클래스를 정의할 수 있어요. 다음 예시를 볼게요.
public class MultipleClassesInSameFile {
public static void main(String[] args) {
IO.println(GenerateMessage.generateMessage());
IO.println(AnotherMessage.generateAnotherMessage());
}
}
class GenerateMessage {
static String generateMessage() {
return "Here is one message";
}
}
class AnotherMessage {
static String generateAnotherMessage() {
return "Here is another message";
}
}
실행하면:
$ java MultipleClassesInSameFile.java
다음과 같이 출력될 거예요.
Here is one message
Here is another message
여러 파일 프로그램 실행하기
JDK 22부터는 JEP 458: Launch Multi-File Source-Code Programs이 포함되면서, java 런처가 여러 파일 소스코드 프로그램을 실행할 수 있게 됐어요. 이는 단순한 단일 파일 프로그램에서 더 복잡한 프로그램으로 점진적으로 넘어갈 수 있게 해줘요.
java 런처는 이제 소스 파일의 위치가 가져오는(import) 클래스들의 패키지 구조와 일치하기만 하면, 여러 소스 파일 프로그램을 자동으로 찾아 컴파일하고 로드해요. 다음 예시를 볼게요.
import model.Person;
import service.PersonService;
public class Main {
public static void main(String[] args){
PersonService service = new PersonService();
Person person = service.createNewPerson();
IO.println(person.printName() + " has been created!");
}
}
model.Person과 service.PersonService 클래스는 Main 클래스가 있는 위치의 model 하위 디렉터리와 service 하위 디렉터리에 각각 존재해야 해요. 존재한다면 java 런처는 Main 클래스와 함께 이 클래스들을 컴파일하고 실행해요.
JDK 기본 클래스와 비(非)JDK 클래스 참조하기
JDK의 핵심(core)에 속한 클래스는 실행하기 위해 클래스패스에 추가할 필요가 없어요. 그래서 Scanner와 MatchResult 클래스를 참조하는 아래 예시는 java 런처만으로 간단히 실행할 수 있어요.
import java.util.Scanner;
import java.util.regex.MatchResult;
public class ScannerExample {
public static void main(String... args) {
String wordsAndNumbers = """
Longing rusted furnace
daybreak 17 benign
9 homecoming 1
freight car
""";
try (Scanner scanner = new Scanner(wordsAndNumbers)) {
scanner.findAll("benign").map(MatchResult::group).forEach(IO::println);
}
}
}
실행하려면:
$ java ScannerExample.java
하지만 Apache Commons Lang의 일부인 RandomUtils를 참조하는 다음 예시는, 실행 시에 commons-lang.jar를 클래스패스에 추가해야 해요.
import org.apache.commons.lang3.RandomUtils;
public class ReferenceNonJDKClass {
public static void main(String[] args) {
IO.println(RandomUtils.nextInt());
}
}
실행하려면:
java -cp /path/to/commons-lang3-3.12.0.jar ReferenceNonJDKClass.java
shebang 파일로 실행하기
Unix 계열 운영체제에서는 단일 파일 소스코드 애플리케이션을 스크립트처럼 shebang 파일로도 실행할 수 있어요. Java 소스 파일 안에서 파일의 첫 줄로 path/to/java/home --source <version>을 추가하세요. 아래 예시와 같아요.
#!/path/to/your/bin/java --source 26
public class HelloJava {
public static void main(String[] args) {
IO.println("Hello " + args[0]);
}
}
이 파일의 확장자는 .java가 될 수 없고, chmod +x로 실행 권한을 부여해야 해요. 그렇게 하면 다음과 같이 실행할 수 있어요.
./HelloJava Maria
인자를 전달하지 않으면 ArrayIndexOutOfBoundsException이 발생해요.
더 알아보기 (Learn more)
- JEP 458: Launch Multi-File Source-Code Programs — 여러 파일 소스코드 프로그램 실행 JEP의 상세 내용
- Getting Started with Java — Java 입문, JDK 설정 등 기본 과정
- java 런처 도구 문서 —
java명령의 자세한 사용법