실행 인자와 첫 회원가입
명령 뒤에 입력한 값을 String[] args로 받고 입력 유무를 확인하는 작은 회원 정보 프로그램을 만듭니다.
지금까지 프로그램 안의 문자열은 소스에 직접 적었습니다.
실행 인자를 사용하면 소스를 다시 고치지 않고 명령에서 값을 전달할 수 있습니다.
실행 명령은 java -cp out <클래스이름> <전달할 값> 모양입니다.
먼저 아래에서 클래스를 작성하고 컴파일한 뒤 실행합니다.
클래스 이름 뒤의 값이 실행 인자이며, Java는 이 값들을 문자열 목록으로 만들어 main의 String[] args에 전달합니다.
JAVA · DATA FLOW
클래스 이름 뒤의 값이 main의 문자열 배열이 된다
java launcher가 실행 옵션과 클래스 이름을 소비하고, 그 뒤의 값만 순서대로 String[] args에 전달합니다.
셸이 토큰을 전달
java -cp out ArgumentEcho Java를 명령 토큰으로 넘깁니다.
launcher 옵션 소비
-cp out은 클래스를 찾을 위치를 정하며 프로그램 인자가 아닙니다.
실행 클래스 선택
ArgumentEcho는 실행할 클래스 이름이며 args에 들어가지 않습니다.
나머지 값으로 배열 구성
Java만 String[] args에 들어가 length=1, args[0]="Java"가 됩니다.
- 셸과 launcher가 소비하는 값
- 프로그램에 전달되는 값
클래스 이름 뒤에 둔 프로그램 인자만 순서를 유지한 문자열 배열이 되며, 배열 위치는 0부터 시작합니다.
args의 가장 작은 사용법
String[]는 여러 문자열을 순서대로 담는 배열 타입입니다.
배열은 ch3에서 자세히 배우므로 지금은 두 규칙만 사용합니다.
args.length는 전달된 문자열 개수입니다.args[0]은 첫 번째 문자열입니다. 위치 번호는 0부터 시작합니다.
다음 파일을 만듭니다.
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 Javacount=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 실행을 끝냅니다.
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하거나 가입 출력을 하는 실제 제어 흐름입니다. 인수 없음/있음의 도달·미도달을 단계로 구별하면 안전 조건이 선명합니다.
JAVA · FLOWCHART
길이를 확인한 뒤에만 첫 인자를 사용한다
args[0]을 읽기 전에 args.length를 분기하면 인자가 없는 실행과 회원가입 실행이 모두 안전하게 끝납니다.
args.length == 0을 먼저 묻습니다.
예 · 인자 0개
사용법 MemberSignup <email>을 출력합니다.
return으로 main을 끝내므로 args[0]을 읽지 않습니다.
아니요 · 인자 1개 이상
args[0]을 이메일 문자열로 읽습니다.
회원 이메일과 가입 완료를 출력하고 정상 종료합니다.
- 인자 없음: 사용법 후 종료
- 인자 있음: 첫 값 사용
검사가 접근보다 먼저 와야 존재하지 않는 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이 명령 문자열 목록을 받습니다. |
|
|
| 길이 가드 0이면 사용법을 출력하고 return합니다. |
|
|
| 정상 가입 인수가 있으면 첫 이메일과 완료 결과를 출력합니다. |
|
|
길이를 확인한 뒤에만 첫 인자를 사용한다
args.length 검사 뒤 없는 args[0] 접근을 피하고 return하거나 가입 출력을 하는 실제 제어 흐름입니다. 인수 없음/있음의 도달·미도달을 단계로 구별하면 안전 조건이 선명합니다.
JAVA · FLOWCHART
길이를 확인한 뒤에만 첫 인자를 사용한다
args[0]을 읽기 전에 args.length를 분기하면 인자가 없는 실행과 회원가입 실행이 모두 안전하게 끝납니다.
args.length == 0을 먼저 묻습니다.
예 · 인자 0개
사용법 MemberSignup <email>을 출력합니다.
return으로 main을 끝내므로 args[0]을 읽지 않습니다.
아니요 · 인자 1개 이상
args[0]을 이메일 문자열로 읽습니다.
회원 이메일과 가입 완료를 출력하고 정상 종료합니다.
- 인자 없음: 사용법 후 종료
- 인자 있음: 첫 값 사용
검사가 접근보다 먼저 와야 존재하지 않는 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이 명령 문자열 목록을 받습니다. |
|
|
| 길이 가드 0이면 사용법을 출력하고 return합니다. |
|
|
| 정상 가입 인수가 있으면 첫 이메일과 완료 결과를 출력합니다. |
|
|
첫 회원가입
회원 이메일 하나를 받아 가입 결과를 출력하는 프로그램을 만듭니다.
아직 값을 저장하거나 합산하지는 않습니다.
이 절의 “가입”은 입력과 출력 흐름을 연습하는 이름입니다. wrong 같은 값도 그대로 출력하므로 이메일 형식 검사나 실제 회원 저장은 수행하지 않습니다. 뒤에서 조건과 저장소를 배울 때 이 책임을 하나씩 추가합니다.
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 같은 값을 변수에 담고 계산·조건·반복에 사용합니다.