[우테코 프리코스 7기]BE 1주차 미션 회고

오목조목·2024년 10월 24일
post-thumbnail

🤔 시작하기 전에 - 나의 최종 목표

나의 목표
1. "전공자" 라는 타이틀에 얽매이지 않기
2. 나는 어떤 개발자 인지 생각하기
3. 다양한 사람들과 의견을 주고받으며 성장하기

사실 저는 전공자이고, 나름 좋은 학점을 받았음에도 불구하고,
"전공자" 라는 타이틀이 부담스럽게 느껴지곤 했습니다.

기본적인 내용은 알고 있었지만, 작년 처음으로 부트캠프에서 Java에 대해 제대로 배우게 되었으며, Spring, 최신 실무 기술과 함께 짧은 시간 내에 학습해야 했기에
순수 Java 언어만 활용하는 프리코스의 미션들은 저에게 매우 큰 도전으로 다가왔고,
이를 최선을 다해 해결하고 다양한 사람들과 소통하며 새로운 지식에 대해 공유, 습득하는 것
프리코스 과정 동안의 저의 목표로 삼고 시작하게 되었습니다.


❓ 문제 - 문자열 덧셈 계산기

1주차 미션의 내용은 아래와 같았으며, ReadMe 파일을 다음과 같이 정리하였습니다.

입력한 문자열에서 숫자를 추출하여 더하는 계산기를 구현한다.


📝 기능 요구 사항 정리

  • 어플리케이션이 시작되면, Console.readLine()을 통해 구분자양수로 구성된 문자열을 입력 받는다.
  • 쉼표(,) 또는 콜론(:)은 기본 구분자로 사용된다.
  • 문자열 앞부분"//""\n" 사이에 위치하는 문자를 커스텀 구분자로 사용할 수 있다.
  • 각 구분자를 기준으로 분리된 모든 숫자를 더해 결과값을 출력한다.
  • 사용자가 잘못된 값을 입력할 경우, IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.

✏️ 기능 구현 목록

  • 입출력 기능

    • 덧셈할 문자열을 입력해 주세요 라는 문구를 출력한다.
    • Console.readLine() 메서드를 통해 사용자의 입력을 받는다.
    • 성공적으로 작업이 수행되면, 결과값을 결과 : N 과 같이 사용자에게 출력한다.
  • 구분자 판별 및 저장 기능

    • 입력된 문자열 안에 일반 구분자인 콜론 (:) 과 쉼표 (,) 가 존재하는지 확인한다.
    • 입력된 문자열 앞부분에 "//""\n" 사이에 위치하는 커스텀 구분자가 존재하는지 확인한다.
    • 커스텀 구분자가 존재한다면, 추가로 저장한다.
  • 문자열 처리 기능

    • 사용자가 입력한 문자열을 저장된 구분자를 기반으로 분할한다.
    • 분할된 데이터가 정상적인 데이터인지 확인한다.
    • 정상적으로 최종 분할된 내용을 모두 더해 결과값을 산출한다.

⁉️ 고려해야할 사항

  • 아무 것도 입력되지 않은 경우, 결과값은 0으로 출력되어야 한다.
  • 구분자 없이 숫자만 입력된 경우, 숫자 그대로를 출력할 수 있어야 한다.
  • 커스텀 구분자로 숫자가 설정될 수 있다. (숫자도 문자이다)
  • 이스케이프 문자(\) 혹은 공백(whitespace) 에 유의해야 한다. (공백도 문자이다)
  • 최종 연산 대상에 음수는 포함될 수 없지만, 커스텀 구분자에 (-) 가 오는 경우는 가능할 수 있다.
  • 일반 구분자 보다 커스텀 구분자의 분리를 우선적으로 진행한다. (음수, 공백, 숫자 등 특이케이스를 위해)
  • 입력되는 양수는 한 자리 수가 아닌 여러 자릿수가 입력될 수도 있다.
  • 최종 연산 값의 범위가 지정되지 않았기 때문에, 단순 int로 처리되지 못할 수 있다.
  • (+) 또한 커스텀 구분자로 설정되지 않는다면 사용이 불가해야 한다.
  • 커스텀 구분자를 지정하는 곳은 반드시 문자열 맨 앞이어야 한다.
  • 문자열 앞 부분에 "//"와 "\n"이 모두 존재하지만, 그 사이가 아닌 곳에 문자가 주어지면 안된다.

😈 예외 사항

사용자가 잘못된 값을 입력할 경우, IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.

  • "//" 와 "\n" 사이의 커스텀 구분자로 콜론(:)과 콤마(,)가 올 수 없다.
  • 커스텀 구분자로 문자 가 아닌 문자열 이 주어질 수 없다.
  • 입력되는 숫자에는 음수가 올 수 없다.
  • "//" 와 "\n" 사이가 아닌 곳에 숫자와 일반 구분자가 아닌 이외의 문자가 입력될 수 없다.
  • 커스텀 구분자로 공백이 설정되지 않는 이상 공백이 사용될 수 없다.

🖥️ 예시

덧셈할 문자열을 입력해 주세요.
1,2:3
결과 : 6

✊ 이뤄내고자 했던 것

이번 미션을 진행하면서, 1주차 미션인 만큼 처음부터 많은 것을 해내려 하기 보다,
기본적인 것에 충실하며 아래와 같은 것에 집중하고자 하였습니다.

  • 개발 이외의 과정에 좀 더 노력을 기울이기(기능 명세, git commit, 코드 스타일 등)

  • Java의 최대한 많은 기능을 사용해 보려고 노력할 것

  • 테스트 코드 에 소홀히 하지 않을 것

  • "어떤 원칙을 지키기 위해" 라는 생각보다는, 내가 이미 자연스럽게 하고 있는 개발 습관으로 나 자신에 대해 깨닫기

이와 같은 생각을 하게 된 이유는 아래와 같았습니다.

  • 여러 번의 프로젝트 과정을 통해 단순 코딩 능력 외에 생각하는 것, 문서의 작성, 초기 설계 의 중요성에 대해 깨닫게 되었기 때문에

  • 새로운 지식을 많이 습득하여 이번 미션을 최대한 develop 해 제출하는 것 보다는,
    내가 어떤 것은 알고 있고, 어떤 부분은 부족한지를 내 눈으로 직접 확인하기 위함

  • AI를 활용하거나 누군가의 어떤 코딩 방식과 구조를 따라하는 것은 지금 나의 상황에서
    도움이 되지 않을 것
    이며, 현실을 직시하고 피드백을 받는 것이 옳다고 판단했기 때문

  • 항상 주눅들었던 JavaTest Code에 더 이상 주눅들지 않기 위하여


🙆‍♂️ 이뤄낸 점

1. 개발 이외의 과정에 좀 더 노력을 기울이기

기능 명세를 고민함과 더불어, 개발 이외의 과정에 시간을 좀 더 할애하려고 노력하였습니다.
완벽한 구조는 아니었지만, Main에서 일부 클래스만 분리하여 전부 구현했던 상황에서,
일부 클래스를 분리하여 최대한 얕은 지식 내의 MVC 패턴에 맞추려고 노력하였고,
기능 명세 또한 두 번의 수정을 거쳐 아래와 같은 결과가 나오게 되었습니다.

또한, 이러한 과정을 커밋 컨벤션을 적용하여 코딩과 문서 작성을 함께 신경쓰며 하나의 과정으로 만들고자 하였습니다.

Before After
Before After

리뷰1 리뷰2
Before After

2. Java의 최대한 많은 기능과 테스트 코드를 사용할 것

테스트의 경우 총 25개의 테스트가 나왔고,
숫자의 입력 범위가 제대로 주어지지 않았기 때문에, int나 long 이외에
무한에 가까운 숫자까지 표현할 수 있는 BigInteger 라는 것을 처음 활용하여 프로그래밍 해 보았고, 특수 구분자가 특이한 경우(공백이나 숫자 등) 으로 주어졌을 때를 고려하여 특수 구분자가 먼저 처리되도록 하고자 하였는데, 이를 ArrayDeque 를 활용하여 특수 구분자가 있다면, 특수 구분자가 먼저 처리되도록 구현하였습니다. 또한, 상수는 static final을 사용해 선언하고, publicprivate 접근제어자를 최대한 이치에 맞게 적용하고자 하였습니다.

    BigInteger result = BigInteger.ZERO;

    for (String part : splitResult) {
        result = result.add(parseBigInteger(part));
    }
    
    ---
    private ArrayDeque<String> separatorQueue = new ArrayDeque<>();

	---
    
    private final String SPECIAL_PREFIX = "//";
    private final String SPECIAL_SUFFIX = "\\n";
    private final ArrayList<String> NORMAL_SEPARATORS = new ArrayList<>(Arrays.asList(",", ":"));

🙅‍♂️ 아쉬운 점

1. 제대로 알지 못하는 이론을 적용하려 했다 - MVC

이번 주차의 미션을 수행하면서, 자연스러운 나만의 코드를 구현하는 것을 목표로 했는데,
구조에 대한 고민을 하며 클래스 분리를 시도했는데, 다소 아쉬운 구조가 나왔습니다.

첫 주차라 긴장을 많이해서 인 것 같기도 하고, Spring을 통한 자연스러운 MVC 구조 구현에 익숙해져 있다 보니, 제가 직접 구조를 작성하는 데에 있어 연관 관계나, 각 클래스가 가지는 역할을 제대로 분리하지 못한 것 같다는 생각이 들었습니다.


2. 아직도 두려운 Java - 스트림과 람다식

Java를 공부하면서 어려운 이론이 몇 가지 있었는데. 그 중 일부가 저에게는 스트림과 람다식이었습니다. 람다와 스트림을 활용하지 못한 것과, 메서드 분리를 원활히 하지 못하자 아래와 같은 이해하기 힘든 코드를 작성하게 되었습니다.

    private ArrayList<String> splitStrListBySep(ArrayList<String> strList, String separator) {

        ArrayList<String> tempList = new ArrayList<>();

        for (String str : strList) {
            if (str.contains(separator)) {
                String[] split = str.split(Pattern.quote(separator));
                for (String s : split) {
                    if (!s.isEmpty()) {
                        tempList.add(s);
                    }
                }
            } else {
                if (!str.isEmpty()) {
                    tempList.add(str);
                }
            }
        }
        return tempList;
    }

본래 목적은 분리가 가능해진 문자들을 구분자로 나누고, 이를 더하기 위해 다시 리스트에 담아 return 하기 위한 메서드였습니다.

메서드 분리를 하지 못해 indent가 깊어지게 되었고, isEmpty()를 두 번이나 검사하고 있으며, 과정 또한 "뭘하고자 하는 코드이지?" 라는 생각이 들 정도로 복잡해 졌습니다.


🏃‍♂️ 마무리 - 앞으로 해야 할 것, 다짐

목표를 세우고 1주차를 마무리 지었지만, 이뤄낸 목표도 있었고, 이뤄내지 못한 목표도 있었기에
다소 아쉬웠지만, 1주차 미션은 앞으로 무엇을 위해 나아갈지에 대해 알 수 있는 뜻 깊은 시간이었던 것 같습니다.

그리고, 앞으로 해야할 것에 대해 생각해 보게 되었습니다.

  1. MVC 구조는 무엇을 위한 것이며, 어떻게 구현해야 하는지 공부하고
    혹은, MVC외의 구조에는 어떤 것들이 존재하는지에 대해 알아보기

  2. 깔끔하고 가독성 좋은 코드를 위해 클래스와 메서드 분리, 구조 설계 등에 대해 공부하고,
    피드백을 양분삼아 더 좋은 코드를 위해 노력하기

  3. JAVA 심화 - 람다와 스트림이 필요하다면 공부하여 적용해 보도록 노력하기 (두려워 하지 않기)

  4. 테스트가 개발 과정의 일부가 되도록 노력할 것
    이번 주차에서는 단순히 입력이 ~면 ~여야 한다 라는 위주의 나열식 테스트 였다면
    각 클래스와 메서드들이 어떤 기능을 수행해야 하는지 와 이뤄내고자 하는 것에 집중함으 로써, 1주차에서 이뤄냈던 "기능 명세를 개발의 일부가 되도록" 에 더하여
    "테스트도 개발의 일부" 가 되도록 할 것


Pull Request 보러가기

이 글을 보고 계신 여러분들은 1주차를 어떻게 진행하셨는지 궁금하네요,

제 코드는 위의 링크에서 확인하실 수 있습니다!

코드리뷰나 좋은 내용 공유, 회고 공유 등은 언제나 환영입니다!

2주차도 화이팅 해보아요! :)

profile
블로그 이전중입니다 https://www.notion.so/2465adc69d7e805a9fd1e1ca971d657d?source=copy_link

0개의 댓글