etc

[우아한테크코스] 프리코스 1주차

육빔 2024. 10. 22. 17:19
728x90
반응형

정신없이 1주차를 끝냈다. 토요일 코테, 일요일에 정처기 시험, 그 후 돌아오는 길에 교통사고;; 정신없어 1주차에 시간을 많이 투자하지 못했다. 2주차부턴 시간을 좀 더 투자할 계획이다. 참고로 교통사고 팁이 있다면 신고접수 -> 보험처리 -> 병원 -> 담당직원연결 -> 합의 순으로 진행하면 된다. 처음해봣다..ㅎ;

 

 

일단 진행한 소감문은 다음과 같다.

 

 

소감문

 

이번 문자열 계산기 과제를 통해 역할과 책임에 대해 깊이 고민하는 기회를 가졌습니다. 특히, 객체지향 설계의 핵심인 역할 분리와 책임 할당의 경계를 설정하는 과정이 어려웠습니다. 각 클래스의 역할과 기능 분리 여부에 대해 고민한 끝에, 계산기 클래스, 문자열 파싱 클래스, 입출력 처리 클래스로 나누어 3개의 클래스를 설계했습니다.

비록 요구사항은 단순했지만 쉽지 않았던 문제였습니다. 또 다양한 사람들의 코드를 보며 시야를 넓힐 수 있었습니다. MVC 패턴을 적용한 사람, 기능을 모듈화한 사람 등 여러 접근 방식을 참고하면서 설계와 구현에 대한 통찰을 얻을 수 있었습니다. 이번 과제는 객체지향적 설계에 대해 다시 한번 고민하고, 기본으로 돌아가 나에게 부족한 것을 되돌아볼 수 있는 시간이었습니다. 좋은 과제 내주셔서 감사합니다

 

배운점

 

기본기의 중요성

기본기를 더욱 탄탄히 해야겠다는 점이었습니다. 변수명과 클래스명을 명확하게 짓는 것이 생각보다 어렵다는 것을 알게 되었고, 구현 능력이 좀 더 필요하다는 것을 느꼈습니다. 더 나아가, 테스트 코드와 예외 처리에 대해서도 공부가 필요함을 깨달았고, Assert와 Exception에 대한 학습을 진행하며 구현했습니다.

자바 코드 컨벤션

https://github.com/woowacourse/woowacourse-docs/tree/main/styleguide/java

 

woowacourse-docs/styleguide/java at main · woowacourse/woowacourse-docs

우아한테크코스 문서를 관리하는 저장소. Contribute to woowacourse/woowacourse-docs development by creating an account on GitHub.

github.com

 

처음 기능 요구사항을 확인했을 때 "자바 코드 컨벤션을 준수하며 프로그래밍"하라는 항목을 접했습니다. 읽어보니 Google에서 좋은 코드를 위해 만든 가이드라인을 기반으로 제작된 것으로 많은 내용이 있었습니다. 하지만 단기간에 많은 내용을 숙지하고 지키는 것이 쉽지 않다고 생각하여 우아한테크코스 문서에서 제공하는 IntelliJ 설정 파일xml을 활용하여 자바 코드 컨벤션을 자동으로 적용할 수 있도록 설정했습니다. 이를 통해 저장만 하면 컨벤션을 지킬 수 있게 세팅하는 법을 배웠습니다.

자바 버전 업그레이드

과제 진행 중 ./gradlew clean test를 실행할 때 버전 호환 문제가 발생했습니다. 이를 해결하기 위해 자바21을 설치했으나, 여전히 자바17이 적용되는 문제가 있었습니다. 터미널 환경변수를 확인한 결과, java17이 고정되어 있었고, 이를 수정하여 문제를 해결했습니다. 자바 환경 설정과 버전 관리를 통해 빌드를 성공적으로 진행할 수 있었습니다.

Git

깃의 중요성이었습니다. 수정 사항을 바로바로 GitHub 컨벤션에 맞춰 커밋하고 PR을 하는 과정이 중요하다는 것을 깨달았습니다. 커밋 메시지를 통해 다른 사람의 코드 변화를 쉽게 파악할 수 있고, 진행과정을 알 수 있기에 협업 시에 꼭 사용해야겠다는 생각을 했습니다.

 

 

객체를 다루는 것에 책을 읽다가 감명을 받아 코드를 짯다.

 

최종적으로 짠 코드다

 

https://github.com/woowacourse-precourse/java-calculator-7/pull/1415

 

[문자열 덧셈 계산기] 장영재 미션 제출합니다. by urinaner · Pull Request #1415 · woowacourse-precourse/java-

 

github.com

 

급하게 짜느냐 다양한 예외처리나 테스트를 작성하지 못했다.

 

내 코드를 좀 봐보자

 

public class CalculatorView {
    private static final String READ_NUMBER_MESSAGE = "덧셈할 문자열을 입력해 주세요.";
    private static final String RESULT_MESSAGE = "결과 : ";

    public static String readInputString() {
        System.out.println(READ_NUMBER_MESSAGE);
        return Console.readLine();
    }

    public static void printResult(int result) {
        System.out.println(RESULT_MESSAGE + result);
    }
}

 

원래 Input, Output 따로 두려다가 너무 많이 나눠도 가독성이 떨어질 것 같아 한 곳에 몰아적었다.

 

public class InputParser {
    private static final String INVALID_NUMBER_MESSAGE = "잘못된 입력 값";
    private static final String INVALID_CUSTOM_MESSAGE = "잘못된 입력 값, 구분자 다음에 줄바꿈이 필요합니다.";
    private static final String NEGATIVE_NOT_ALLOWED_MESSAGE = "음수 비허용: ";


    public static int[] parseAndValidateInput(String input) {
        String delimiter = ",:";

        if (input.startsWith("//")) {
            int delimiterIndex = input.indexOf("\\n");
            if (delimiterIndex == -1) {
                throw new IllegalArgumentException(INVALID_CUSTOM_MESSAGE);
            }
            delimiter += input.substring(2, delimiterIndex);
            input = input.substring(delimiterIndex + 2);
        }
        StringTokenizer st = new StringTokenizer(input, delimiter);
        List<Integer> numbers = new ArrayList<>();

        while (st.hasMoreElements()) {
            String token = st.nextToken();
            int num = parseNumber(token);
            numbers.add(num);
        }

        return numbers.stream()
                .mapToInt(i -> i).toArray();
    }

    private static int parseNumber(String token) {
        try {
            int number = Integer.parseInt(token);
            if (number < 0) {
                throw new IllegalArgumentException(NEGATIVE_NOT_ALLOWED_MESSAGE + token);
            }
            return number;
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException(INVALID_NUMBER_MESSAGE + token);
        }
    }
}

 

이 클래스를 만든 이유는 최대한 계산기 클래스에 문자열 관련 내용을 줄이려고 했기 때문이다.

 

public class Calculator {
    public int add(String input) {
        if (input == null || input.isEmpty()) {
            return 0;
        }

        int[] numbers = InputParser.parseAndValidateInput(input);
        return sum(numbers);
    }

    private int sum(int[] numbers) {
        int result = 0;
        for (int num : numbers) {
            result += num;
        }
        return result;
    }
}

 

사실 처음에 아는 동생한테 코드리뷰를 부탁했다가 혼났다;ㅋㅋ 

메서드이름~~ 코드 로직~~ 토크나이저~~ 덕분에 도움이 많이 되었다. 코드리뷰는 좋다. 특히 코딩을 잘하는 친구라 도움이 많이 되었다. 급하게 짠거여서 욕을 먹을 각오였지만 확실히 먹어서 뭔가 좋았다.

 

덕분에 문제로직이나 메서드이름을 직관적이게 바꿔서 제출할 수 있었다.

 

옛날에는 최대한 많이 파일을 나눠서 작성하면 잘짠다라고 생각했었는데 이제는 최대한 다른 사람들이 이해하기 좋은 코드가 잘짜여진 코드인 것 같다. 장단점이 다 있지만.. 나는 이해하기 좋은 코드를 짜는 개발자가 되고 싶다.

728x90
반응형