콘텐츠로 이동

2주 차 피드백

2주 차 미션의 학습 목표는 함수 분리와 테스트 도구 사용법을 익히는 것이었습니다. 새로운 개념을 학습하고 미션에 적용하는 과정이 쉽지 않았을 텐데요. 다른 사람과 비교하다 보면 조바심이 날 수 있지만, 어제의 나와 비교하며 자신만의 속도로 성장해 나가는 것을 목표로 삼아 보세요.

프리코스는 완벽한 결과물을 만드는 시험이 아닙니다. 여러분이 얼마나 깊이 몰입하고 도전했는지를 경험하는 기간입니다. 8기의 핵심 키워드는 '도전'입니다. 완벽한 코드보다 중요한 것은 문제를 해결하기 위해 나만의 방법을 찾아가는 과정입니다. 이런 과정을 소중히 여기는 사람은 어떤 문제를 만나더라도 결국 해법을 찾아냅니다.

단위 테스트와 같은 용어가 아직 낯설게 느껴질 수 있습니다. 하지만 작은 기능부터 차근차근 테스트를 작성해 나가다 보면 빠르게 익숙해질 거예요. 실패하거나 돌아가는 길도 괜찮습니다. 그 모든 흔적이 여러분의 몰입과 성장을 보여주는 소중한 발자국이 됩니다.

이번 소감문에는 여러분의 도전 과정을 담아주세요. 예를 들어 - 이번 미션에서 가장 오래 고민했던 부분과 시도들 - 실패했지만 의미 있었던 도전 - 다음에는 다르게 접근해보고 싶은 부분

이 외에도 여러분만의 고민과 성장 과정이 있다면 자유롭게 작성해주세요. 여러분이 경험한 모든 과정이 소중한 기록이 됩니다.

이번 주도 여러분에게 의미 있는 시간이 되기를 바랍니다.

공통 피드백

README.md를 상세히 작성한다

미션 저장소의 README.md는 소스 코드 이전에 프로젝트의 개요를 소개하는 문서다. 이 문서를 통해 해당 프로젝트가 어떤 프로젝트인지, 주요 기능이 무엇인지 소개할 수 있다. 효과적으로 작성하기 위해 마크다운 문법을 검색하여 학습하고, 이를 활용해 README.md를 작성해 본다.

기능 목록을 재검토한다

기능 목록을 작성할 때 클래스 설계와 구현, 메서드 설계와 구현 같은 상세한 내용은 포함하지 않는다. 클래스 이름이나 메서드 시그니처, 반환값 등은 언제든지 변경될 수 있기 때문이다. 구현해야 할 기능 목록을 중심으로 작성하되, 정상적인 경우뿐만 아니라 예외 상황도 함께 정리한다. 예외 상황은 시작 단계에서 파악하기 어려우므로, 기능을 구현하면서 지속적으로 업데이트하는 것이 좋다.

기능 목록을 업데이트한다

README.md 파일의 기능 목록은 구현 과정에서 변경될 수 있다. 시작부터 모든 기능을 완벽하게 정리해야 한다는 부담을 갖기보다는, 기능을 구현하면서 문서를 지속적으로 업데이트하는 것을 목표로 한다. 이를 통해 죽은 문서가 아닌 살아있는 문서로 유지될 수 있도록 노력해 보자.

값을 하드 코딩하지 않는다

코드 내에서 문자열이나 숫자 값을 하드 코딩하지 않는다. 대신 상수(static final)를 정의하고 의미 있는 이름을 부여하여 해당 값이 어떤 역할을 하는지 명확히 드러낸다. 구글에 "java 상수"등의 키워드로 검색하여 상수 구현 방법을 학습하고 코드에 적용해 본다.

구현 순서도 코딩 컨벤션이다

클래스는 상수, 멤버 변수, 생성자, 메서드 순으로 작성한다.

class A {
    상수(static final) 또는 클래스 변수
    인스턴스 변수
    생성자
    메서드
}

변수 이름에 자료형은 사용하지 않는다

변수 이름에 자료형, 자료 구조 등을 포함하지 않는다. 변수 이름은 의미를 명확히 드러낼 수 있도록 하고, 자료형은 코드 작성 시점에 자연스럽게 이해될 수 있도록 한다.

String carNameList = Console.readLine();
String[] arrayString = carNameList.split(",");

한 메서드가 한 가지 기능만 담당하게 한다

함수의 길이가 길어진다면 여러 기능을 한 함수에서 처리하려는 신호일 가능성이 높다. 예를 들어, 안내 문구 출력, 사용자 입력 처리, 유효값 검증 등의 작업을 한 함수에 모두 포함하는 대신, 이를 각기 다른 함수로 분리해 본다.

public List<String> userInput() {
    System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).");
    String userInput = Console.readLine().trim();
    String[] splittedName = userInput.split(",");
    for (int index = 0; index < splittedName.length; index++) {
        if (splittedName.length < 1 || splittedName.length > 5) {
            throw new IllegalArgumentException("[ERROR] 자동차 이름은 1자 이상 5자 이하만 가능합니다.");
        }
    }
    return Arrays.asList(splittedName);
}

메서드가 한 가지 기능을 하는지 확인하는 기준을 세운다

여러 메서드에서 중복되는 코드가 있다면 이를 별도 메서드로 분리하는 것을 고려한다. 메서드의 길이가 길어지면 여러 기능을 포함하고 있을 가능성이 커지므로, 15라인이 넘지 않도록 구현하면 의식적으로 메서드를 분리하는 연습을 할 수 있다.

테스트를 작성하는 이유에 대해 본인의 경험을 토대로 정리해본다

테스트를 작성하면 기능의 정확성을 점검함을 넘어 코드의 즉각적인 피드백을 받을 수 있다. 테스트 작성 과정을 통해 구현한 기능의 문제를 빠르게 발견할 수 있을 뿐만 아니라, 코드의 구조와 의도를 명확히 이해하는 데도 도움을 받을 수 있다. 학습 도구로도 활용할 수 있는데, 수 많은 테스트의 장점 중 본인이 가장 공감하는 작성 이유를 작성해 본다.

처음부터 큰 단위의 테스트를 만들지 않는다

테스트의 핵심 목적 중 하나는 코드에 대해 빠르고 자주 피드백을 받는 것이다. 처음부터 큰 단위의 테스트를 작성하게 되면, 작성한 코드의 문제를 발견하기까지 시간이 오래 걸린다. 따라서 문제를 작게 나누어 핵심 기능부터 작게 테스트를 만들어 가는 것이 효과적이다.

큰 단위의 테스트 - 자동차 경주 게임을 시작하여, 사용자가 이름과 진행 횟수를 입력하고, 게임을 진행한 후 결과를 확인한다.

작은 단위의 테스트 - 무작위 값이 4 이상이면 자동차가 전진한다. - 무작위 값이 3 이하이면 자동차가 전진하지 않는다.