14์ฅ ์ ์ง์ ์ธ ๊ฐ์
์ถ๋ฐ์ ์ข์์ผ๋ ํ์ฅ์ฑ์ด ๋ถ์กฑํ๋ ๋ชจ๋์ ์๊ฐํ๊ณ ๊ทธ ๋ชจ๋์ ๊ฐ์ ํ๋ฉฐ ์ ๋ฆฌํ๋ ๋จ๊ณ๋ก ์ดํด๋ณผ ๊ฒ์ด๋ค.
1. Args
ํ๋ก๊ทธ๋จ์ ์ง๋ค ๋ณด๋ฉด ์ข ์ข ๋ช ๋ นํ ์ธ์์ ๊ตฌ๋ฌธ์ ๋ถ์ํ ํ์๊ฐ ์๊ธด๋ค.
ํธ๋ฆฌํ ์ ํธ๋ฆฌํฐ๊ฐ ์๋ค๋ฉด main ํจ์๋ก ๋์ด์ค๋ ๋ฌธ์์ด ๋ฐฐ์ด์ ์ง์ ๋ถ์ํ๊ฒ ๋๋ค.
์๋ก ์งค ์ ํธ๋ฆฌํฐ๋ฅผ Args๋ผ ๋ถ๋ฅผ ๊ฒ์ด๊ณ ์ฌ์ฉ๋ฒ์ ๊ฐ๋จํ๋ค.
Args ์์ฑ์์ ์ธ์ ๋ฌธ์์ด๊ณผ ํ์ ๋ฌธ์์ด์ ๋๊ฒจ Args ์ธ์คํด์ค๋ฅผ ์์ฑํ ํ Args ์ธ์คํด์ค์๋ค ์ธ์ ๊ฐ์ ์ง์ํ๋ค.
public static void main(String[] args) {
try {
Args arg = new Args("l,p#,d*", args);
boolean logging = arg.getBoolean('l');
int port = arg.getInt('p');
String directory = arg.getString('d');
executeAppliocation(logging, port, directory);
} catch (ArgsException e) {
System.out.printf("Argument error: %s\n", e.errorMessage());
}
}
๋งค๊ฐ๋ณ์ ๋ ๊ฐ๋ก Args ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์๋ค.
- ์ฒซ์งธ ๋งค๊ฐ๋ณ์๋ ํ์ ๋๋ ์คํค๋ง๋ฅผ ์ง์ ํ๋๋ฐ, "l(๋ถ์ธ), p(์ ์)#, d(๋ฌธ์์ด)*"๋ ๋ช ๋ นํ ์ธ์ ์ธ ๊ฐ๋ฅผ ์ ์ํ๋ค.
- ๋์งธ ๋งค๊ฐ๋ณ์๋ main์ผ๋ก ๋์ด์จ ๋ช ๋ นํ ์ธ์ ๋ฐฐ์ด ์์ฒด์ด๋ค.
์์ฑ์์์ ArgsException์ด ๋ฐ์ํ์ง ์์๋ค๋ฉด
๋ช ๋ นํ ์ธ์์ ๊ตฌ๋ฌธ์ ์ฑ๊ณต์ ์ผ๋ก ๋ถ์ํ์ผ๋ฉฐ Args ์ธ์คํด์ค์ ์ง์๋ฅผ ๋์ ธ๋ ์ข๋ค๋ ๋ง์ด๋ค.
1) Args ๊ตฌํ
import static com.objectmentor.utilities.args.ArgsException.ErrorCode.*;
public class Args {
private Map<Character, ArgumentMarshaler> marshalers;
private Set<Character> argsFound;
private ListIterator<String> currentArgument;
public Args(String schema, String[] args) throws ArgsException {
marshalers = new HashMap<Character, ArgumentMarshaler>();
argsFound = new HashSet<Character>();
parseSchema(schema);
parseArgumentStrings(Arrays.asList(args));
}
private void parseSchema(String schema) throws ArgsException {
for (String element : schema.split(","))
if (element.length() > 0)
parseSchemaElement(element.trim());
}
private void parseSchemaElement(String element) throws ArgsException {
char elementId = element.charAt(0);
String elementTail = element.substring(1); validateSchemaElementId(elementId);
if (elementTail.length() == 0)
marshalers.put(elementId, new BooleanArgumentMarshaler());
else if (elementTail.equals("*"))
marshalers.put(elementId, new StringArgumentMarshaler());
else if (elementTail.equals("#"))
marshalers.put(elementId, new IntegerArgumentMarshaler());
else if (elementTail.equals("##"))
marshalers.put(elementId, new DoubleArgumentMarshaler());
else if (elementTail.equals("[*]"))
marshalers.put(elementId, new StringArrayArgumentMarshaler());
else
throw new ArgsException(INVALID_ARGUMENT_FORMAT, elementId, elementTail);
}
private void validateSchemaElementId(char elementId) throws ArgsException {
if (!Character.isLetter(elementId))
throw new ArgsException(INVALID_ARGUMENT_NAME, elementId, null);
}
private void parseArgumentStrings(List<String> argsList) throws ArgsException {
for (currentArgument = argsList.listIterator(); currentArgument.hasNext();) {
String argString = currentArgument.next();
if (argString.startsWith("-")) {
parseArgumentCharacters(argString.substring(1));
} else {
currentArgument.previous();
break;
}
}
}
private void parseArgumentCharacters(String argChars) throws ArgsException {
for (int i = 0; i < argChars.length(); i++)
parseArgumentCharacter(argChars.charAt(i));
}
private void parseArgumentCharacter(char argChar) throws ArgsException {
ArgumentMarshaler m = marshalers.get(argChar);
if (m == null) {
throw new ArgsException(UNEXPECTED_ARGUMENT, argChar, null);
} else {
argsFound.add(argChar);
try {
m.set(currentArgument);
} catch (ArgsException e) {
e.setErrorArgumentId(argChar);
throw e;
}
}
}
public boolean has(char arg) {
return argsFound.contains(arg);
}
public int nextArgument() {
return currentArgument.nextIndex();
}
public boolean getBoolean(char arg) {
return BooleanArgumentMarshaler.getValue(marshalers.get(arg));
}
public String getString(char arg) {
return StringArgumentMarshaler.getValue(marshalers.get(arg));
}
public int getInt(char arg) {
return IntegerArgumentMarshaler.getValue(marshalers.get(arg));
}
public double getDouble(char arg) {
return DoubleArgumentMarshaler.getValue(marshalers.get(arg));
}
public String[] getStringArray(char arg) {
return StringArrayArgumentMarshaler.getValue(marshalers.get(arg));
}
}
์ ์ฝ๋๋ ์์์ ์๋๋ก ์ฝํ๊ณ ์ ๋ฐ์ ์ผ๋ก ๊น๋ํ ๊ตฌ์กฐ์ ์ ์ง์ธ ํ๋ก๊ทธ๋จ์ผ๋ก ์ฌ๊ฒจ์ง๋ค.
์๋ฅผ ๋ค์ด ๋ ์ง ์ธ์๋ ๋ณต์์ ์ธ์ ๋ฑ ์๋ก์ด ์ธ์ ์ ํ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด ๋ช ๋ฐฑํ๋ค.
2) ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ์ด๋ฐ ์ฝ๋๋ฅผ ์งฐ์๊น?
์ ํ๋ก๊ทธ๋จ์ ์ฒ์๋ถํฐ ์ ๋ ๊ฒ ๊ตฌํํ์ง ์์๋ค.
๊นจ๋ํ ์ฝ๋๋ฅผ ์ง๋ ค๋ฉด ๋จผ์ ์ง์ ๋ถํ ์ฝ๋๋ฅผ ์ง ๋ค์ ์ ๋ฆฌํด์ผ ํ๋ค.
๊ทธ์ ๋์๊ฐ๋ ์ฝ๋๋ง์ผ๋ก๋ ๋ถ์กฑํ๊ณ ๋์๊ฐ๋ ์ฝ๋๊ฐ ์ฌํ๊ฒ ๋ง๊ฐ์ง๋ ์ฌ๋ก๋ ํํ๋ค.
๋จ์ํ ๋์๊ฐ๋ ์ฝ๋์ ๋ง์กฑํ๋ ํ๋ก๊ทธ๋๋จธ๋ ์ ๋ฌธ๊ฐ ์ ์ ์ด ๋ถ์กฑํ๋ค.
๋์ ์ฝ๋๋ณด๋ค ๋ ์ค๋ซ๋์ ๋ ์ฌ๊ฐํ๊ฒ ๊ฐ๋ฐ ํ๋ก์ ํธ์ ์
์ํฅ์ ๋ฏธ์น๋ ์์ธ๋ ์๋ค.
๋์ ์ฝ๋๋ฅผ ๊นจ๋ํ ์ฝ๋๋ก ๊ฐ์ ํ๋ ค๋ฉด ๋น์ฉ์ด ์์ฒญ๋๊ฒ ๋ง์ด ๋ ๋ค.
์ค๋๋ ์์กด์ฑ์ ์ฐพ์๋ด ๊นจ๋ ค๋ฉด ์๋นํ ์๊ฐ๊ณผ ์ธ๋ด์ฌ์ด ํ์ํ๋ค.
๋ฐ๋ฉด ์ฒ์๋ถํฐ ์ฝ๋๋ฅผ ๊นจ๋ํ๊ฒ ์ ์งํ๊ธฐ๋ ์๋์ ์ผ๋ก ์ฝ๋ค. ์์นจ์ ์๋ง์ผ๋ก ๋ง๋ ์ฝ๋๋ฅผ ์คํ์ ์ ๋ฆฌํ๊ธฐ๋ ์ด๋ ต์ง ์๋ค. ๋์ฑ์ด 5๋ถ ์ ์ ์๋ง์ผ๋ก ๋ง๋ ์ฝ๋๋ ์ง๊ธ ๋น์ฅ ์ ๋ฆฌํ๊ธฐ ์์ฃผ ์ฝ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ฝ๋๋ ์ธ์ ๋ ์ต๋ํ ๊น๋ํ๊ณ ๋จ์ํ๊ฒ ์ ๋ฆฌํด์ผ ํ๋ค.