본문으로 건너뛰기

안동민 개발노트

본문 시작

실행 인자와 첫 회원가입

명령 뒤에 입력한 값을 String[] args로 받고 입력 유무를 확인하는 작은 회원 정보 프로그램을 만듭니다.

지금까지 프로그램 안의 문자열은 소스에 직접 적었습니다.

실행 인자를 사용하면 소스를 다시 고치지 않고 명령에서 값을 전달할 수 있습니다.

실행 명령은 java -cp out <클래스이름> <전달할 값> 모양입니다.

먼저 아래에서 클래스를 작성하고 컴파일한 뒤 실행합니다.

클래스 이름 뒤의 값이 실행 인자이며, Java는 이 값들을 문자열 목록으로 만들어 mainString[] args에 전달합니다.

명령줄의 -cp out은 launcher 옵션, ArgumentEcho는 실행할 클래스 이름, Java는 프로그램 인자이며, 마지막 값만 args[0]이 되고 args.length는 1이 되는 데이터 흐름입니다.

JAVA · DATA FLOW

클래스 이름 뒤의 값이 main의 문자열 배열이 된다

java launcher가 실행 옵션과 클래스 이름을 소비하고, 그 뒤의 값만 순서대로 String[] args에 전달합니다.

명령줄에서 String 배열까지의 인자 경계 PowerShell이 java, -cp out, ArgumentEcho, Java 토큰을 전달합니다. java launcher는 -cp out을 옵션으로, ArgumentEcho를 클래스 이름으로 소비하고 Java만 프로그램 인자로 분류합니다. main은 길이 1인 String 배열을 받아 args[0]에서 Java를 읽습니다. POWERSHELL · 셸 토큰화 java -cp out ArgumentEcho Java 공백으로 구분된 네 토큰 java launcher 경계를 해석하고 JVM을 시작 LAUNCHER OPTION -cp out BINARY CLASS NAME ArgumentEcho PROGRAM ARGUMENTS [ "Java" ] 옵션과 클래스 이름은 args에 들어가지 않음 main(String[] args) 문자열 배열 length = 1 args[0] = "Java" 프로그램이 읽는 값 first=Java 전달 String[]
  1. 셸이 토큰을 전달

    java -cp out ArgumentEcho Java를 명령 토큰으로 넘깁니다.

  2. launcher 옵션 소비

    -cp out은 클래스를 찾을 위치를 정하며 프로그램 인자가 아닙니다.

  3. 실행 클래스 선택

    ArgumentEcho는 실행할 클래스 이름이며 args에 들어가지 않습니다.

  4. 나머지 값으로 배열 구성

    JavaString[] args에 들어가 length=1, args[0]="Java"가 됩니다.

  • 셸과 launcher가 소비하는 값
  • 프로그램에 전달되는 값

클래스 이름 뒤에 둔 프로그램 인자만 순서를 유지한 문자열 배열이 되며, 배열 위치는 0부터 시작합니다.


args의 가장 작은 사용법

String[]는 여러 문자열을 순서대로 담는 배열 타입입니다.

배열은 ch3에서 자세히 배우므로 지금은 두 규칙만 사용합니다.

  • args.length는 전달된 문자열 개수입니다.
  • args[0]은 첫 번째 문자열입니다. 위치 번호는 0부터 시작합니다.

다음 파일을 만듭니다.

src/ArgumentEcho.java — 완전한 파일
public class ArgumentEcho {
    public static void main(String[] args) {
        System.out.println("count=" + args.length);
        System.out.println("first=" + args[0]);
    }
}
javac -d out src/ArgumentEcho.java
java -cp out ArgumentEcho Java
count=1
first=Java

문자열 옆의 +는 두 값을 이어 하나의 출력 문자열로 만듭니다.

계산과 문자열 결합의 자세한 규칙은 ch2에서 배웁니다.


인자가 없을 때 먼저 확인한다

인자 없이 실행하면 args.length는 0인데 args[0]을 읽으려 해서 실행 중 오류가 납니다.

읽기 전에 개수를 확인해야 합니다.

if는 괄호 안의 조건이 참일 때만 중괄호 안을 실행하는 문장입니다.

ch2에서 조건식을 자세히 배우지만 여기서는 “값이 하나도 없는가”만 검사합니다.

return은 현재 main 실행을 끝냅니다.

src/ArgumentEcho.java — 안전하게 고친 완전한 파일
public class ArgumentEcho {
    public static void main(String[] args) {
        if (args.length == 0) {
            System.out.println("사용법: java -cp out ArgumentEcho <email>");
            return;
        }

        System.out.println("count=" + args.length);
        System.out.println("first=" + args[0]);
    }
}
javac -d out src/ArgumentEcho.java
java -cp out ArgumentEcho
java -cp out ArgumentEcho variables

첫 실행은 사용법을 출력하고 안전하게 끝납니다.

둘째 실행은 variables를 출력합니다.

args.length가 0이면 사용법을 출력하고 return하며, 1 이상이면 args[0]을 이메일로 읽어 회원 이메일과 가입 완료를 출력하는 회원가입 입력 경계입니다.

JAVA · FLOWCHART

길이를 확인한 뒤에만 첫 인자를 사용한다

args[0]을 읽기 전에 args.length를 분기하면 인자가 없는 실행과 회원가입 실행이 모두 안전하게 끝납니다.

args 길이 검사와 회원가입의 두 실행 경로 main이 String 배열을 받습니다. args.length가 0인지 검사해 예이면 사용법을 출력하고 return으로 종료합니다. 아니오이면 args[0]을 이메일로 읽고 회원 이메일과 가입 완료를 출력한 뒤 종료합니다. main(String[] args) 명령에서 받은 문자열 목록 args.length == 0 첫 위치를 읽기 전에 검사 사용법 출력 MemberSignup <email> args[0] 읽기 email = member@example.com return main을 안전하게 종료 가입 결과 출력 회원 이메일 · 가입 완료 정상 종료 두 경로 모두 범위 밖 접근 없음 예 · 0 아니요 · 1+

args.length == 0을 먼저 묻습니다.

예 · 인자 0개

  1. 사용법 MemberSignup <email>을 출력합니다.

  2. return으로 main을 끝내므로 args[0]을 읽지 않습니다.

아니요 · 인자 1개 이상

  1. args[0]을 이메일 문자열로 읽습니다.

  2. 회원 이메일과 가입 완료를 출력하고 정상 종료합니다.

  • 인자 없음: 사용법 후 종료
  • 인자 있음: 첫 값 사용

검사가 접근보다 먼저 와야 존재하지 않는 args[0]을 읽지 않습니다. 이 단계는 이메일 형식 검증이나 저장소 없이 입력 유무만 판정합니다.


첫 회원가입

회원 이메일 하나를 받아 가입 결과를 출력하는 프로그램을 만듭니다.

아직 값을 저장하거나 합산하지는 않습니다.

src/MemberSignup.java — 완전한 파일
public class MemberSignup {
    public static void main(String[] args) {
        if (args.length == 0) {
            System.out.println("사용법: java -cp out MemberSignup <email>");
            return;
        }

        System.out.println("회원 이메일: " + args[0]);
        System.out.println("가입 완료");
    }
}
javac -d out src/MemberSignup.java
java -cp out MemberSignup member@example.com
회원 이메일: member@example.com
가입 완료

이 프로그램에는 하나의 입력 경계가 있습니다.

인자가 없으면 사용법을 보여 주고, 있으면 첫 값을 사용합니다.

이메일은 공백을 포함하지 않으므로 보통 따옴표 없이 하나의 인자로 전달합니다.

java -cp out MemberSignup member@example.com

지금 이해할 것과 뒤에서 배울 것

public static void main(String[] args)에는 아직 배우지 않은 단어가 남아 있습니다.

지금 필요한 뜻과 정식 학습 위치를 구분합니다.

표현지금 필요한 뜻자세히 배우는 곳
class코드를 묶는 프로그램 단위ch4
main실행 시작점ch3 메서드
static객체를 만들기 전에도 실행기가 호출 가능ch6
String[] args명령에서 받은 문자열 목록ch3 배열
if, ==조건이 맞을 때만 실행ch2

모르는 문법을 숨기지 않되 한 번에 내부 규칙까지 외우게 하지 않습니다.

각 장에서 더 작은 예제로 다시 열어 봅니다.


연습 문제

Welcome.java를 작성하세요.

  • 인자가 없으면 사용법: Welcome <name>을 출력합니다.
  • 인자가 있으면 안녕하세요, <name>을 출력합니다.
  • 두 경우 모두 실행 중 오류 없이 끝나야 합니다.
javac -d out src/Welcome.java
java -cp out Welcome
java -cp out Welcome 안동민

다음 장에서는 안동민, 45, true 같은 값을 변수에 담고 계산·조건·반복에 사용합니다.