같은 "컴파일 → 실행" 흐름을 조금씩 다른 상황에서 반복합니다. 인자를 숫자로 바꿔 계산하고, 메서드로 나누고, 출력 폴더를 분리하고, 런타임 오류 메시지를 읽는 연습입니다.
예제 2는 인자를 문자열 그대로 출력했습니다. 이번엔 Integer.parseInt로 숫자로 바꿔 더합니다. 인자는 개수와 상관없이 항상 문자열 배열로 들어오므로, 계산이 필요하면 반드시 변환해야 합니다.
public class Sum {
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("사용법: java Sum <숫자1> <숫자2> ...");
return;
}
int total = 0;
for (String arg : args) {
total += Integer.parseInt(arg); // "3" → 3
}
System.out.println(args.length + "개 합계: " + total);
}
}
// java Sum 3 5 10
// 출력: 3개 합계: 18
//
// java Sum
// 출력: 사용법: java Sum <숫자1> <숫자2> ...javac 없이 java Info.java로 바로 실행하는 방식(JDK 11+)입니다. 한 파일짜리 실험 코드를 빠르게 돌려볼 때 편하지만 .class가 남지 않으므로, 파일이 여러 개인 프로젝트에서는 여전히 javac → java 두 단계를 씁니다.
public class Info {
public static void main(String[] args) {
System.out.println("자바 주 버전: " + Runtime.version().feature());
System.out.println("실행 클래스: " + Info.class.getSimpleName());
System.out.println("받은 인자 수: " + args.length);
}
}
// java Info.java (컴파일과 실행을 한 번에)
// 출력: 자바 주 버전: 21
// 출력: 실행 클래스: Info
// 출력: 받은 인자 수: 0예제 2의 인사 문장을 greet 메서드로 빼면 같은 형식을 여러 곳에서 재사용할 수 있고, 인자가 없을 때 기본 이름을 쓰는 처리도 한 줄로 끝납니다. main이 "무엇을 할지"만 보여 주고 "어떻게 만들지"는 메서드에 숨기는 습관의 출발점입니다.
public class GreetingMethod {
static String greet(String name) {
return "안녕하세요, " + name + "님!";
}
public static void main(String[] args) {
String name = args.length > 0 ? args[0] : "방문자"; // 인자 없으면 기본값
System.out.println(greet(name));
System.out.println(greet("관리자"));
}
}
// java GreetingMethod
// 출력: 안녕하세요, 방문자님!
// 출력: 안녕하세요, 관리자님!
//
// java GreetingMethod 김철수
// 출력: 안녕하세요, 김철수님!
// 출력: 안녕하세요, 관리자님!예제 3처럼 한 파일에 두 클래스를 두되, .class 파일이 소스와 섞이지 않도록 -d out으로 출력 폴더를 지정합니다. 실무 빌드 도구(Gradle, Maven)가 build/, target/ 폴더를 따로 두는 것과 같은 원리이며, 실행할 때는 -cp out으로 그 폴더를 알려 줘야 합니다.
// 파일: App.java
public class App {
public static void main(String[] args) {
System.out.println(Config.APP_NAME + " 시작 (환경: " + Config.env() + ")");
}
}
class Config {
static final String APP_NAME = "order-batch";
static String env() { return "local"; }
}
// javac -encoding UTF-8 -d out App.java → out/App.class, out/Config.class 생성
// java -cp out App
// 출력: order-batch 시작 (환경: local)예제 5는 컴파일 오류였습니다. 이번엔 컴파일은 통과하지만 실행 중에 죽는 프로그램입니다. 오류 메시지의 at 클래스.메서드(파일:줄번호) 부분이 문제가 난 정확한 위치이므로, 이 한 줄만 읽어도 어디를 고칠지 알 수 있습니다.
public class Crash {
public static void main(String[] args) {
int[] prices = {1000, 2000};
int count = 0;
System.out.println("시작");
System.out.println(prices[0] / count); // 0으로 나누기 → 실행 중 예외
System.out.println("이 줄은 실행되지 않음");
}
}
// javac Crash.java → 조용히 성공 (문법에는 문제가 없음)
// java Crash
// 출력: 시작
// 출력: Exception in thread "main" java.lang.ArithmeticException: / by zero
// 출력: at Crash.main(Crash.java:6)Crash.java의 6번째 줄에서 ArithmeticException(산술 예외)이 났고, 원인은 / by zero(0으로 나눔)입니다. "시작"은 찍혔지만 그 다음 줄은 실행되지 않았습니다. 이런 오류를 다루는 방법은 중급 03 레슨(예외 처리)에서 배웁니다.