본문 바로가기

실행 인자와 첫 회원가입

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

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

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

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

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

클래스 이름 뒤의 값이 실행 인자이며, Java는 이 값들을 문자열 목록으로 만들어 main의 String[] 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을 시작 실행 옵션 -cp out 클래스 이름 ArgumentEcho 프로그램 인자 [ "Java" ] args에는 프로그램 인자만 전달 main(String[] args) 문자열 배열 length = 1 args[0] = "Java" 출력 결과 first=Java 전달 String[]
클래스 이름 뒤의 값이 main의 문자열 배열이 된다 셸→launcher→main→출력; launcher 안의 옵션·클래스·프로그램 인자 3개 분류를 그대로 보임. 상세 문구와 명령은 바로 아래 원래 설명에서 확인합니다. 토큰 전달 String[] 읽기 PowerShell 명령 java -cp out ArgumentEcho Java 옵션·클래스·인자를 구분 java launcher 경계 해석 · JVM 시작 실행 옵션 -cp out 클래스 이름 ArgumentEcho 프로그램 인자 [ "Java" ] main(String[] args) 문자열 배열 · 프로그램 인자만 length = 1 args[0] = "Java" 출력 결과 first=Java
  1. 셸이 토큰을 전달

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

  2. launcher 옵션 소비

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

  3. 실행 클래스 선택

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

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

    Java만 String[] 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에서 배웁니다.

예시

컴파일한 ArgumentEcho를 java -cp out ArgumentEcho Java study로 실행하면 인자는 두 개이므로 count=2, 첫 값은 그대로이므로 first=Java가 나옵니다. java -cp out ArgumentEcho "Java study"처럼 공백을 포함한 값을 따옴표로 묶으면 하나의 인자가 되어 count=1, first=Java study가 나옵니다.

-cp out과 ArgumentEcho는 실행기 설정과 클래스 선택에 쓰이며 인자 개수에 포함되지 않습니다.


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

인자 없이 실행하면 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 검사 뒤 없는 args[0] 접근을 피하고 return하거나 가입 출력을 하는 실제 제어 흐름입니다. 인수 없음/있음의 도달·미도달을 단계로 구별하면 안전 조건이 선명합니다.

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[0] 접근 전 사용법 출력 MemberSignup <email> args[0] 읽기 [email protected] return main 종료 가입 결과 출력 회원 이메일 · 가입 완료 정상 종료 없는 args[0]을 읽지 않음 예 · 0 아니요 · 1+
길이를 확인한 뒤에만 첫 인자를 사용한다 main과 길이 판정; 인자없음→사용법→return, 인자있음→첫값읽기→결과출력→정상종료. 상세 문구와 명령은 바로 아래 원래 설명에서 확인합니다. 예 · 0개 아니요 · 1+ main(String[] args) 명령의 문자열 목록 받음 읽기 전에 길이를 확인 인자가 없는가? args.length == 0 사용법 출력 MemberSignup <email> 첫 값 미접근 args[0] 읽기 member@ example.com 첫 이메일 return main 종료 가입 결과 회원 이메일 가입 완료 정상 종료 없는 args[0]을 읽지 않음 형식 검사·저장은 아직 안 함

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

예 · 인자 0개

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

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

아니요 · 인자 1개 이상

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

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

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

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

이 예의 조건

  • 인수 없음/있음은 각각 독립 main 입력이다.
관계도의 보충 설명
원 도표의 설명과 주석
구분내용
전체 읽기 정보길이를 확인한 뒤에만 첫 인자를 사용한다 args.length가 0이면 사용법을 출력하고 return하며, 1 이상이면 args[0]을 이메일로 읽어 회원 이메일과 가입 완료를 출력하는 회원가입 입력 경계입니다. JAVA · FLOWCHART 길이를 확인한 뒤에만 첫 인자를 사용한다 args[0]을 읽기 전에 args.length를 분기하면 인자가 없는 실행과 회원가입 실행이 모두 안전하게 끝납니다. args.length == 0 을 먼저 묻습니다. 예 · 인자 0개 사용법 MemberSignup <email> 을 출력합니다. return 으로 main을 끝내므로 args[0]을 읽지 않습니다. 아니요 · 인자 1개 이상 args[0] 을 이메일 문자열로 읽습니다. 회원 이메일과 가입 완료를 출력하고 정상 종료합니다. 인자 없음: 사용법 후 종료 인자 있음: 첫 값 사용 검사가 접근보다 먼저 와야 존재하지 않는 args[0]을 읽지 않습니다. 이 단계는 이메일 형식 검증이나 저장소 없이 입력 유무만 판정합니다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
입력 배열

main이 명령 문자열 목록을 받습니다.

  • 입력 형태: String[] args
  • 검사: args.length
  • 첫 원소 접근 전에 배열 길이를 알아야 한다.
길이 가드

0이면 사용법을 출력하고 return합니다.

  • 인수 없음: MemberSignup <email>
  • args[0]: 미접근
  • 없을 수 있는 첫 원소를 읽기 전에 호출을 끝낸다.
정상 가입

인수가 있으면 첫 이메일과 완료 결과를 출력합니다.

  • 가드를 통과한 경로에서만 첫 값을 사용한다.

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

args.length 검사 뒤 없는 args[0] 접근을 피하고 return하거나 가입 출력을 하는 실제 제어 흐름입니다. 인수 없음/있음의 도달·미도달을 단계로 구별하면 안전 조건이 선명합니다.

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[0] 접근 전 사용법 출력 MemberSignup <email> args[0] 읽기 [email protected] return main 종료 가입 결과 출력 회원 이메일 · 가입 완료 정상 종료 없는 args[0]을 읽지 않음 예 · 0 아니요 · 1+
길이를 확인한 뒤에만 첫 인자를 사용한다 main과 길이 판정; 인자없음→사용법→return, 인자있음→첫값읽기→결과출력→정상종료. 상세 문구와 명령은 바로 아래 원래 설명에서 확인합니다. 예 · 0개 아니요 · 1+ main(String[] args) 명령의 문자열 목록 받음 읽기 전에 길이를 확인 인자가 없는가? args.length == 0 사용법 출력 MemberSignup <email> 첫 값 미접근 args[0] 읽기 member@ example.com 첫 이메일 return main 종료 가입 결과 회원 이메일 가입 완료 정상 종료 없는 args[0]을 읽지 않음 형식 검사·저장은 아직 안 함

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

예 · 인자 0개

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

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

아니요 · 인자 1개 이상

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

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

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

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

이 예의 조건

  • 인수 없음/있음은 각각 독립 main 입력이다.

관계도의 보충 설명

원 도표의 설명과 주석
구분내용
전체 읽기 정보길이를 확인한 뒤에만 첫 인자를 사용한다 args.length가 0이면 사용법을 출력하고 return하며, 1 이상이면 args[0]을 이메일로 읽어 회원 이메일과 가입 완료를 출력하는 회원가입 입력 경계입니다. JAVA · FLOWCHART 길이를 확인한 뒤에만 첫 인자를 사용한다 args[0]을 읽기 전에 args.length를 분기하면 인자가 없는 실행과 회원가입 실행이 모두 안전하게 끝납니다. args.length == 0 을 먼저 묻습니다. 예 · 인자 0개 사용법 MemberSignup <email> 을 출력합니다. return 으로 main을 끝내므로 args[0]을 읽지 않습니다. 아니요 · 인자 1개 이상 args[0] 을 이메일 문자열로 읽습니다. 회원 이메일과 가입 완료를 출력하고 정상 종료합니다. 인자 없음: 사용법 후 종료 인자 있음: 첫 값 사용 검사가 접근보다 먼저 와야 존재하지 않는 args[0]을 읽지 않습니다. 이 단계는 이메일 형식 검증이나 저장소 없이 입력 유무만 판정합니다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
입력 배열

main이 명령 문자열 목록을 받습니다.

  • 입력 형태: String[] args
  • 검사: args.length
  • 첫 원소 접근 전에 배열 길이를 알아야 한다.
길이 가드

0이면 사용법을 출력하고 return합니다.

  • 인수 없음: MemberSignup <email>
  • args[0]: 미접근
  • 없을 수 있는 첫 원소를 읽기 전에 호출을 끝낸다.
정상 가입

인수가 있으면 첫 이메일과 완료 결과를 출력합니다.

  • 가드를 통과한 경로에서만 첫 값을 사용한다.

첫 회원가입

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

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

이 절의 “가입”은 입력과 출력 흐름을 연습하는 이름입니다. wrong 같은 값도 그대로 출력하므로 이메일 형식 검사나 실제 회원 저장은 수행하지 않습니다. 뒤에서 조건과 저장소를 배울 때 이 책임을 하나씩 추가합니다.

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 [email protected]
회원 이메일: [email protected]
가입 완료

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

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

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

java -cp out MemberSignup [email protected]

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

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 안동민
작성한 뒤 확인할 풀이 흐름

먼저 args.length == 0인 경우 사용법을 출력하고 return으로 끝냅니다. 그 아래에서만 args[0]을 읽어 인사 문자열을 출력합니다. 순서를 바꾸면 인자가 없는 실행에서 배열의 첫 값을 읽다가 실패합니다.

정상 출력은 첫 실행에서 사용법: Welcome <name>, 둘째 실행에서 안녕하세요, 안동민입니다. 실행을 마친 뒤 이름을 바꾸어 다시 실행하고, 소스를 다시 컴파일하지 않아도 입력만 바뀌는 이유를 설명해 보세요.

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