Skip to main content

김주엽

1. 📌 핵심 개념 정리

✅ 요약하기

이 챕터에서는 저자가 겪은 점진적인 개선을 보여주는 사례를 다룬다.
main 함수에서 인수 문자열을 다루는 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());
    }
}

물론이죠! <details> 태그 안에 있는 코드 블록이 마크다운 문법상 제대로 렌더링되지 않는 문제가 있습니다. <details> 내부에서는 <pre><code>나 HTML 형식이 더 적절하지만, 순수 마크다운 기반에서 GitHub 등에서도 잘 보이도록 하기 위해서는 <details> 바깥쪽에 코드 블록을 위치시키는 게 가장 안전합니다.

아래는 마크다운 문법을 수정한 버전입니다:


  1. Args 구현
  • 전체 코드
    Args.java

    펼치기/접기
    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));
        } 
    }
    
  • 위 코드를 보면 위에서 아래로 코드가 읽힌다는 것을 알 수 있다.

  • ArgumentMarshaler 인터페이스를 몰라도 인터페이스와 파생 클래스가 무슨 기능을 하는지 파악할 수 있다.


  1. 한 줄 요약 내용
    .
    .
    .

  1. 한 줄 요약 내용
    .
    .
    .

2. 🤔 이해가 어려운 부분

🔍 질문하기

책을 읽으며 이해하기 어려웠던 개념이나 명확하지 않았던 내용을 정리합니다.

  1. 개념 또는 원칙의 이름
    • 어려웠던 부분
      해당 개념이 헷갈리거나 명확하지 않았던 점을 구체적으로 설명합니다.
    • 궁금한 점
      해당 개념이 어떤 원리로 동작하는지, 실무에서 어떻게 활용되는지 등을 질문 형태로 정리합니다.

  1. 개념 또는 원칙의 이름
    • 어려웠던 부분
      .
    • 궁금한 점
      .

  1. 개념 또는 원칙의 이름
    • 어려웠던 부분
      .
    • 궁금한 점
      .

3. 📚 참고 사항

📢 논의하기

관련된 자료가 있다면 공유하고, 더 깊이 논의하고 싶은 아이디어나 의견을 정리합니다.

  1. 관련 자료 공유
    • 추가 자료
      관련 블로그 글이나 공식 문서 링크를 제공합니다.

  1. 논의하고 싶은 주제
    • 주제
      논의하고 싶은 내용을 간략히 정리합니다.
    • 설명
      논의하고 싶은 이유를 작성합니다.