[Book] ํด๋ฆฐ์ฝ”๋“œ - 14์žฅ ์ ์ง„์ ์ธ ๊ฐœ์„ 

2021. 2. 28. 18:45ยท๐Ÿ“ Book/โœ Clean Code

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๋ถ„ ์ „์— ์—‰๋ง์œผ๋กœ ๋งŒ๋“  ์ฝ”๋“œ๋Š” ์ง€๊ธˆ ๋‹น์žฅ ์ •๋ฆฌํ•˜๊ธฐ ์•„์ฃผ ์‰ฝ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ฝ”๋“œ๋Š” ์–ธ์ œ๋‚˜ ์ตœ๋Œ€ํ•œ ๊น”๋”ํ•˜๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ์ •๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Book/โœ Clean Code' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Book] ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜
  • [Book] ํด๋ฆฐ์ฝ”๋“œ - 13์žฅ ๋™์‹œ์„ฑ
  • [Book] ํด๋ฆฐ์ฝ”๋“œ - 12์žฅ ์ฐฝ๋ฐœ์„ฑ
  • [Book] ํด๋ฆฐ์ฝ”๋“œ - 11์žฅ ์‹œ์Šคํ…œ
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[Book] ํด๋ฆฐ์ฝ”๋“œ - 14์žฅ ์ ์ง„์ ์ธ ๊ฐœ์„ 
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”