[그리디] 이채현 Java:자동차 경주 미션 1,2 단계 제출합니다.#171
Conversation
2Jin1031
left a comment
There was a problem hiding this comment.
안녕하세요~ 채현님! 리뷰어 이진입니다 ~
빠르게 제출해주셨네요~
코드 잘 봤습니다! 👍 기능 구현을 열심히 하신 게 보이네요.
다음 리뷰 요청하시기 전에, 함께 해보면 좋을 것들을 공유드릴게요!
1. README 파일 작성하기
프로젝트의 첫인상을 결정하는 README 파일을 작성해보면 어떨까요? 😊
- 채현님이 어떤 기능을 구현했는지 한눈에 이해할 수 있도록 작성해주시면 좋을 것 같아요!
- 나중에 다른 사람들이 코드를 볼 때 큰 도움이 될 거예요.
2. 요구사항이 잘 동작하는지 확인할 수 있는 테스트 코드 작성하기
테스트 코드를 작성해보는 연습을 함께 해보면 좋을 것 같아요!
- 프로젝트가 커지면 커질수록 테스트 코드의 진가가 보일 거예요
- 추후 수정사항이 생기더라도 이전 요구사항들이 함께 영향받았는지 쉽게 확인할 수 있어요!
3. PR 본문에 궁금한 사항 남겨보기
PR 본문을 활용해서 리뷰어에게 질문하는 것도 연습해보면 좋을 것 같아요~
- 채현님이 어떤 고민을 했는지, 어떤 생각으로 구현했는지 보여줄 수 있는 좋은 공간이에요
- 궁금한 사항이 없을 수도 있고, 어떤 게 궁금한지 조차 모를 수도 있어요. 괜찮습니다!
- 다른 사람들의 PR을 구경하면서 어떻게 질문하는지, 어떤 것을 궁금해하는지 보는 것부터 시작해봐요~
다음 리뷰 요청 주시면 함께 살펴보도록 할게요!
그리고 자바 코드 스타일 관련해서 함께 확인해볼 부분을 공유드려요! Java Style Guide > 한글 번역 - 1기 제이 에 들어가게 되면 아래와 같은 내용을 확인하실 수 있어요!
이 중 부분적으로 읽고 수정 방향성을 정리해봤어요~
- 현재 코드
public Car(String name){- 컨벤션에 맞게 수정 방향성 코드
public Car(String name) {
- 현재 코드
this.name=name;- 컨벤션에 맞게 수정 방향성 코드
this.name = name;이 외에도 다른 부분들 함께 수정해주시면 좋을 것 같아요! 😊
참고로, 컨벤션 가이드는 처음부터 다 외우실 필요는 없어요. 코드를 작성하면서 자연스럽게 익숙해지실 부분이라 크게 부담 갖지 않으셔도 됩니다! (시간 되면 읽어볼까의 마인드 정도~)
💡 꿀팁: 코드 스타일은 아래 단축키를 통해 한 번에 정렬 가능합니다!
- 윈도우:
Ctrl + Alt + L - 맥:
Command + Option + L
이 단축키를 사용하면 대부분의 포맷팅이 자동으로 맞춰지니까, 작성 후에 한 번씩 눌러주시면 편하실 거예요!
| import java.util.*; | ||
|
|
||
| class Car { | ||
| String name; |
There was a problem hiding this comment.
코드 잘 작성해주셨어요! 👍
지금 접근 제어자를 생략하고 작성해주셨는데요, Java에서는 접근 제어자를 명시하지 않으면 기본적으로 package-private(같은 패키지 내에서만 접근 가능)으로 설정돼요. 의도하셨다면 다른 접근 제어자 중에 default 방식을 사용하신 채현님만의 이유가 궁금합니다! (의도하지 않으셨어도 괜찮아요! 같이 이야기해보면 좋을 것 같아서 여쭤봤어요 😊)
참고로 Java의 접근 제어자 종류는 이렇게 있어요:
- public: 모든 곳에서 접근 가능
- protected: 같은 패키지 + 상속받은 클래스에서 접근 가능
- (생략): package-private, 같은 패키지 내에서만 접근 가능
- private: 같은 클래스 내에서만 접근 가능
이 부분 한번 고민해보시고, 코멘트 남겨주세요 🙌
There was a problem hiding this comment.
CarTest 코드를 구현하기 위해서 public이 필요한데 이부분을 놓친 것 같습니다! 감사합니다.
| import java.util.*; | ||
|
|
||
| public class GetWinners { | ||
| public static void getWinner(List<Car> cars) { |
There was a problem hiding this comment.
GetWinners 클래스를 별도로 분리해주셨네요~!
한 가지 참고할 점은, 자바에서는 일반적으로 클래스명은 명사로, 메서드명은 동사로 작성하는 것이 관례에요. 따라서 GetWinners(동사+명사)보다는 WinnerFinder, RaceResult, WinnerJudge 같은 명사형 이름을 고려해볼 수 있겠어요!
물론 정답은 없지만, 클래스가 "무엇"인지를 명사로 표현하면 코드를 읽는 사람이 그 역할을 더 명확하게 이해할 수 있다고 생각해서요! 한번 고민해보시면 좋을 것 같아요
There was a problem hiding this comment.
넵 수정하였습니다! 기존 클래스가 제가 보기에도 명확성이 떨어져서 RaceResult.java로 수정했습니다.
| public static void main(String[] args) { | ||
|
|
||
| } | ||
| } No newline at end of file |
| this.position=0; | ||
| } | ||
| public void move(){ | ||
| int roll=(int)(Math.random()*10); |
There was a problem hiding this comment.
0에서 9 사이의 랜덤 값을 구하기 위해 Math.random()을 사용하고 int로 형변환까지 꼼꼼하게 처리해주셨네요! 로직이 정확합니다 👏
지금 방식도 문제가 있는 건 아니지만, 좀 더 학습측면에서 다른 방식을 소개해드리자면 Java에는 int 값을 직접 반환하는 랜덤 메서드도 있더라구요! 형변환 없이 바로 정수를 얻을 수 있어서 코드가 조금 더 간결해질 수 있답니다.
한번 직접 찾아보고 비교한 후 어떤 방식이 더 마음에 드는지 고민해보는 것도 좋은 학습이 될 것 같아서 코멘트 남겨봅니다🚀
| } | ||
| public void move(){ | ||
| int roll=(int)(Math.random()*10); | ||
| if(roll>=4){ |
There was a problem hiding this comment.
코드 잘 봤습니다! 👍 요구사항을 읽고 구현해주신 부분이네요~
한 가지 함께 고민해보면 좋을 부분이 있어서 공유드려요. 현재 코드에서 4라는 숫자를 사용하고 계신데요, 지금은 채현님과 저 모두 요구사항 페이지를 확인해서 이게 "전진의
기준 값"이라는 걸 알고 있지만, 나중에 이 코드를 처음 보는 분들은 4가 무엇을 의미하는지 바로 파악하기 어려울 수 있을 것 같아요.
이런 숫자를 개발 용어로 매직 넘버(Magic Number) 라고 부르는데요, 보통은 이런 값들을 상수로 추출해서 의미 있는 이름을 붙여주는 방식으로 관리합니다. 😊
예를 들면 이런 식으로요:
private static final int FORWARD_THRESHOLD = 4;
// 사용할 때
if (randomValue >= FORWARD_THRESHOLD) {
// 전진 로직
}이렇게 하면:
- 코드만 봐도 4가 무엇을 의미하는지 명확
- 나중에 값을 변경할 때 한 곳만 수정하면 되어서 관리 용이
물론 프로젝트 규모나 팀 컨벤션에 따라 다를 수 있어요.
이번 기회에 한번 연습해보시면 좋을 것 같아서요! 어떻게 생각하시나요? 💭
|
|
||
| public class GetWinners { | ||
| public static void getWinner(List<Car> cars) { | ||
| int far=0; |
There was a problem hiding this comment.
far가 가장 먼 position을 의미한다는 의도를 파악했습니다!
변수 네이밍에 대해 함께 고민해보면 좋을 부분이 있어서 공유드려요. 일반적으로 변수명은 "그것이 무엇인지(명사)"를 나타내는 게 코드를 읽을 때 더 직관적이라고 알려져 있어요. 😊
물론 지금도 괜찮은 네이밍이라고 생각하지만, far는 형용사 형태라서 처음 보는 사람은 "무엇이 먼가?"라는 질문이 생길 수 있을 것 같아요. 명사형으로 바꿔보면 어떨까요?
예를 들면 이런 이름들을 고려해볼 수 있을 것 같아요:
- maxPosition - 최대 위치
- farthestPosition - 가장 먼 위치
- leadingPosition - 선두 위치
- topPosition - 최상위 위치
어떤 이름이 가장 의도를 잘 드러낼 수 있을지 한번 고민해보시면 좋을 것 같아 말씀드려봐요~
| this.name=name; | ||
| this.position=0; | ||
| } | ||
| public void move(){ |
There was a problem hiding this comment.
기능이 잘 동작하도록 구현하셨네요. 🤛
move 메서드를 보면서 함께 고민해보면 좋을 부분이 있어서 공유드립니다. 한번 질문을 드려볼게요
=> "move 메서드가 하는 일을 한 문장으로 설명한다면 어떻게 설명할 수 있을까요? 😊 "
제가 보기에는 이 메서드 안에 여러 책임이 함께 있는 것 같다는 생각이 들었어요.
"책임"이라는 표현이 처음에는 좀 모호하게 느껴질 수 있는데요, 이걸 이해하기 위해 제가 사용하는 방식의 질문을 소개해드려볼게요!
먼저 이 메서드에 대한 테스트 코드를 작성해보시면, 메서드가 실제로 몇 가지 일을 하고 있는지 더 명확하게 보일 거예요. 테스트 코드를 작성해주시면 다음 턴에서 함께 살펴보도록 할게요! 💭
이 과정을 통해 "단일 책임 원칙"에 대해 자연스럽게 이해하실 수 있을 거라고 생각해요.
|
저 혹시.. 자바 테스트 코드 작성이 감도 안잡혀서 그런데 혹시,, 참고할 강의나 책 추천해주실 수 있으실까요ㅠㅠ |
|
그리디 과정에서는 계산기 구현 미션을 건너뛰게 되어, 테스트 코드 작성에 대한 커리큘럼을 아직 접하지 못하셨을 것 같아요. 제가 처음 접했을 때 많은 도움을 받았던 LMS 내의 자료를 추천해드릴게요: LMS에 나와 있는 액션 플랜을 따라가다 보면 자연스럽게 익히실 수 있을 거예요. 혹시 실습하시다가 막히는 부분이나 궁금한 점이 생기면 언제든 편하게 연락주세요! 😊 |
chaehyunL2
|
3, 4단계를 한 번에 진행해 주셨다고 공유해 주셔서 말씀드린 대로 이 PR은 merge 진행하겠습니다~ |

No description provided.