본문 바로가기

부트캠프/우아한테크코스

[우테코 6기] 프리코스 2주차 회고 - 자동차 경주

반응형

[문제] 프리코스 2주차 GitHub

 

GitHub - woowacourse-precourse/java-racingcar-6

Contribute to woowacourse-precourse/java-racingcar-6 development by creating an account on GitHub.

github.com

 

[풀이] 프리코스 2주차 GitHub

 

GitHub - kyum-q/java-racingcar-6

Contribute to kyum-q/java-racingcar-6 development by creating an account on GitHub.

github.com

 


개발 요구사항 - 구현 기능 목록

 

https://github.com/kyum-q/java-racingcar-6/tree/kyum-q/docs


소감 - 느낀 점 

 

미션을 진행하면서 어떻게 하면 함수를 분리할지에 가장 많은 시간을 투자한 것 같다.
그러다 보니 코드 작성 시간도 길었지만, 요구사항에 맞춰 구현 기능 목록을 수정하는데 많은 시간이 소요되었다. 클래스를 나누고 함수를 나눌 때 어려움이 되었던 부분은 불분명한 기능들이었다. 특히, 함수를 세분화하지 않으면 기능이 불분명해지는 것을 깨달았다. 예를 들어 '가장 많이 간 자동차를 알아내 출력한다.'라고 기능을 분류하니 자동차를 알아내는 것과 출력하는 것을 하나의 함수에 담게 되어 어떤 클래스에 두어야 할지 함수명은 어떻게 해야 할지 어려움이 커졌다.
그러다 함수를 더 세분화하려고 노력해 보니, '가장 많이 간 자동차 알아내기', '우승한 자동차 이름을 출력하기'로 명확하게 나눠지게 되니 뿌듯하고 나름 성장한 기분을 느꼈다.
또한 구현하다 보니 예상과 다르게 함수명이나 구현방식에 관해 기능 목록이 완벽하지 않아 계속해서 다시 기능 구현목록을 작성하고 코드를 수정하고의 반복이었다.

또한 코드에 관한 테스트 코드를 작성하면서 스스로 작동을 확인하는 새로운 경험을 하게 되었다.
테스트 코드를 처음 작성하다 보니, 제공해 준 예제 테스트와 1주차 피드백으로 받았던 영상을 통해 공부하였다. 점차 하는 법을 인지하게 되니 '어렵다.' 보다는 '재밌다.'라는 느낌과 '어떤 예외 케이스가 있을까?'에 대한 고민도 깊어졌다. 새로운 개념을 배워야 할 때 '어떻게 하는 거지?'라는 '두려움'을 이겨낸다면 돌아오는 것은 '뿌듯함'과 '즐거움'이라는 것 알게 되며 다음 프리코스에서는 더 좋은 성과를 내고 싶다.

이 외에도 이번 프리코스 주차에는 깃을 더 잘 사용할 수 있었다. 깃을 자주 사용해 왔지만 commit 내용에 대해 어떻게 작성하는지 알지 못하였다. 하지만 1주차 피드백을 토대로 git을 commit하니 전과는 다르게 내가 수정했던 코드, 수정 전 코드를 찾기가 수월해졌다. 앞으로도 git을 commit 할 때 주의해야겠다고 다짐했다.


피드백

 

기능 목록을 재검토 및 업데이트

  • 기능 목록 작성할 때 정상적인 경우도 중요하지만, 예외적인 상황도 기능 목록에 정리한다.
  • 처음부터 기능 목록이 완벽할 수 없으니, 중간중간 수정해 가고 추가해 간다.

 

하드 코딩하지 않는다

  • 문자열, 숫자 등의 값을 하드 코딩하지 마라. 
  • 상수(static final)를 만들고 이름을 부여해 이 변수의 역할이 무엇인지 의도를 드러내라.

 

구현 순서도 코딩 컨벤션

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

 

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

  • 변수 이름에 자료형, 자료 구조들은 사용하지 않는다.
    • 예전부터 변수 이름에 자료형을 자주 사용해 왔었다. ㅎㅎ
      ex) List<Integer> lists

 

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

  • 단순 기능 점검이 아니라 내 코드에 대해 빠르게 피드백을 받을 수 있다.
    • 잘은 모르겠는데 테스트 코드를 작성하면서 코드를 업데이트해 가고 잘 작성되었는지 확인하라는 것 같다.
  • 학습테스트를 통해 JUnit 학습하기.pdf

 

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

  • 테스트의 중요한 목적 중 하나는 내가 작성하는 코드에 대해 빠르게 피드백을 받는 것이다.
  • 시작부터 큰 단위의 테스트를 만들게 된다면 작성한 코드에 대한 피드백을 받기까지 많은 시간이 걸린다. 그래서 문제를 작게 나누고, 그중 핵심 기능에 가까운 부분부터 작게 테스트를 만들어 나간다.
    • 큰 단위의 테스트
      : 자동차경주를 시작해서 사용자가 이름, 진행 횟수를 입력하면, 게임을 진행한 후 그 결과를 알려준다.
    • 작은 단위의 테스트
      : 무작위 값이 4 이상이면 자동차가 전진한다.
      : 무작위 값이 3 이하이면 자동차가 전진하지 않는다.

 

 

내가 깨달은 간단한 몇가지 테스트 작성법 

 

  • extends NsTest : 랜덤 값 조정 등 컴퓨터를 조작할 일이 필요할 때
    • run() : runMain() 실행
    • assertRandomNumberInRangeTest( () -> { ... } ... );
      ... : 원하는 랜덤 값 설정
class CarsTest extends NsTest {
    @Test
    void 레이싱_최종_우승자_중복() {
        assertRandomNumberInRangeTest(
                () -> {
                    run();
                    ArrayList<String> result = cars.getFinalWinners();
                    assertThat(result).contains("pobi","woni");
                },
                MOVING_FORWARD, MOVING_FORWARD
        );
    }

    @Override
    public void runMain() {
        cars.racing();
    }
}

 

  • @BeforeEach() : 해당 클래스에 있는 테스트를 하기 전에 하는 중복 동작이 있을 때
    Cars cars;
    @BeforeEach
    void setUp() {
        cars = new Cars();
        cars.add("pobi");
        cars.add("woni");
    }

 

 

  • assertThat(result).~ : result 결과 값 확인 해당 결과가 true 여야지 테스트 통과
    @Test
    void 자동차_전진() {
        car.forward();
        int result = car.getDistance();

        assertThat(result).isEqualTo(1);
    }

 

 

  • @RepeatedTest(n) : n번 결과를 돌리고 싶을 때
    @Test
    @RepeatedTest(100)
    void 무작위_숫자_값_생성_음수() {
        int result = NumberGenerator.createRandomNumber();
        assertThat(result).isGreaterThan(-1);
    }
반응형