Skip to content

[자동차 경주 미션 1,2단계] 이태규 미션 제출합니다.#173

Open
Cappucciyes wants to merge 14 commits intonext-step:cappucciyesfrom
Cappucciyes:main
Open

[자동차 경주 미션 1,2단계] 이태규 미션 제출합니다.#173
Cappucciyes wants to merge 14 commits intonext-step:cappucciyesfrom
Cappucciyes:main

Conversation

@Cappucciyes
Copy link

@Cappucciyes Cappucciyes commented Mar 15, 2026

안녕하세요! 시간을 내어 리뷰해 주셔서 감사합니다.

이번 미션을 진행하면서 몇 가지 궁금한 점이 생겨 질문을 드리고 싶습니다.

  1. 이번 미션에서는 "indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다" 라는 요구사항을 신경 쓰면서 코드를 작성했습니다. 그런데 생각보다 조건이 꽤 제한적으로 느껴져서, 왜 기준이 2 depth로 설정되어 있는지 궁금해졌습니다. 예를 들어 행렬에 적용하는 이중 for문처럼 상황에 따라 충분히 자연스럽고 효율적인 코드가 나올 수 있다고 생각하는데, 이러한 기준이 있는 이유가 무엇인지 알고 싶습니다.

  2. 테스트 코드를 작성하면서 테스트를 더 편하게 만들기 위한 메서드를 추가하고 싶다는 생각이 들었습니다. 하지만 이런 메서드가 테스트를 위한 목적에만 사용된다면, 실제 코드 품질에 도움이 되는지 아니면 오히려 코드의 의도를 흐릴 수 있는지 궁금합니다.
    예를 들어 Race 클래스의 테스트를 작성하면서, Race 객체가 관리하는 모든 Car 인스턴스의 이름과 현재 distance를 반환하는 메서드가 있으면 테스트를 작성하기 편하겠다고 느꼈습니다. 이런 방식이 괜찮은 접근인지 의견을 듣고 싶습니다.

이외에도 개선하면 좋을 부분이 있다면 편하게 말씀해주시면 감사하겠습니다.

@Cappucciyes Cappucciyes changed the title [자동차 경주 미션 1,2단계] 김하은 미션 제출합니다. [자동차 경주 미션 1,2단계] 이태규 미션 제출합니다. Mar 15, 2026
Copy link

@70825 70825 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요 태규님! 저도 잘 부탁드립니다 🙇‍♂️ 첫 미션 화이팅이에요!

기술적인 코드 리뷰의 경우에는 AI가 더 잘해주기 때문에 제가 이야기하는 것보다 AI 활용하시는게 좋아보여서 태규님의 생각을 물어보는 질문들 위주로 남겼어요

이번 미션에서는 "indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다" 라는 요구사항을 신경 쓰면서 코드를 작성했습니다. 그런데 생각보다 조건이 꽤 제한적으로 느껴져서, 왜 기준이 2 depth로 설정되어 있는지 궁금해졌습니다. 예를 들어 행렬에 적용하는 이중 for문처럼 상황에 따라 충분히 자연스럽고 효율적인 코드가 나올 수 있다고 생각하는데, 이러한 기준이 있는 이유가 무엇인지 알고 싶습니다.

요거는 제약조건이 어렵긴한데 좋은 코드를 만들기 위한 연습이라고 생각하시면 됩니다. 개발에서 좋은 코드란 유지보수하기 쉬운 코드인데요. 유지보수하기 좋은 코드란 아직까지는 사람이 코드를 관리하기 때문에 읽기 쉬운 코드가 중요합니다
읽기 쉬운 코드는 저는 '큰 생각 없이 읽을 수 있는 코드'라고 생각해요. 그런 의미에서 이중 for문의 경우에는 첫 for문을 기억하면서 두번째 for문까지 기억해야하는 이해하는데 비용이 비싼 코드라고 생각합니다
요즘은 컴퓨터 기술이 발전해서 서비스 개발의 경우에는 성능보다는 가독성이 중요하다고 생각하는게 정석이 된 것 같아요 그래서 어떻게하면 더 가독성 있는 코드가 될지에 대한 연습도 되는 목적이 있다고 생각합니다.

추가적으로 객체지향에 SOLID 법칙이라는게 있는데, 그중에 S인 단일 책임 원칙을 만족하는지에 대한 내용도 포함되어 있다고 생각해요. 자바 미션이 어떻게하면 객체지향적인 코드를 만들 수 있는지에 대한 고민을 많이하는 미션이기 때문에 객체지향쪽도 잘 고민해서 적용해보시길 바래요~

테스트 코드를 작성하면서 테스트를 더 편하게 만들기 위한 메서드를 추가하고 싶다는 생각이 들었습니다. 하지만 이런 메서드가 테스트를 위한 목적에만 사용된다면, 실제 코드 품질에 도움이 되는지 아니면 오히려 코드의 의도를 흐릴 수 있는지 궁금합니다.
예를 들어 Race 클래스의 테스트를 작성하면서, Race 객체가 관리하는 모든 Car 인스턴스의 이름과 현재 distance를 반환하는 메서드가 있으면 테스트를 작성하기 편하겠다고 느꼈습니다. 이런 방식이 괜찮은 접근인지 의견을 듣고 싶습니다.

요거는 태규님이 생각하는 테스트 코드의 목적과 일반적인 테스트 코드의 목적과 어긋나는게 있어보이는데요

테스트 코드의 목적은 "기능이 잘 동작하는가?"입니다. 모든 데이터를 들여다보는게 쉽고 빠른 길이긴한데 😁, 결국 서비스란 메서드를 통해서 데이터를 제공하므로 태규님이 만든 메서드가 의도대로 잘 동작하는지가 중요한 것 같아요

}

public void move() {
int flag = numberGenerator.generateNumber();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

일반적으로 flag는 true / false에 쓰이는 용도의 변수라서 변수명을 바꾼다고하면 어떤 변수명이 더 좋을까요?

Comment on lines +2 to +4
private int distance = 0;
private String name;
private NumberGenerator numberGenerator;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

값이 바뀌지 않는 부분은 final을 명시하는 것도 좋아보여요
불변성에 대해 찾아보시면 좋습니다~

Comment on lines +8 to +12
Car testCar;
@BeforeEach
public void setupTest() {
this.testCar = new Car("TestCar", new TestNumberGeneratorImpl());
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기 영역의 코드를 추가했을때 장단점은 무엇이 있다고 생각하시나요?

Comment on lines +21 to +27
@Test
public void testCarMovesForwardProperly() {
for (int i = 0; i < 5; i++) {
testCar.move();
Assertions.assertEquals(max(3, i) - 3, testCar.getDistance());
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5번이나 움직이면서 테스트하는 이유가 있을까요?_?

Comment on lines +14 to +16
public void simulateSingleRound() {
for (Car racer: this.racers) racer.move();
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public void simulateSingleRound() {
for (Car racer: this.racers) racer.move();
}
public void simulateSingleRound() {
for (Car racer: this.racers) {
racer.move();
}
}

들여쓰기 전반적으로 챙겨주시면 코드 읽기 더 편할 것 같아요

Comment on lines +19 to +21
if (this.racers.isEmpty()) {
return new ArrayList<String>();
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

racers가 비어있는지 체크하는 코드를 만든 이유가 있을까요??

@@ -0,0 +1,11 @@
import java.util.Random;

public class NumberGeneratorImpl implements NumberGenerator {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Impl 이라는 네이밍을 붙인 이유가 있는지 궁금해요 (= 많고 많은 네이밍중에 Impl을 선택한 이유)
  2. 인터페이스를 통한 구현체를 만들면 어떤 장점이 있다고 생각하시나요??

import java.util.*;

public class Race {
private final List<Car> racers;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요거는 지금 단계에서 어려울 수도 있는 내용인데, 일급 컬렉션에 대해 찾아보시면 좋아보여요
일급 컬렉션을 적용한다고 하면 어떤 메서드를 일급 컬렉션에서 구현할 수 있어보이나요?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants