Skip to content

[장지훈_BackEnd] 2주차 과제 제출합니다.#2

Open
Superpinoiman wants to merge 24 commits intoBCSDLab-Edu:mainfrom
Superpinoiman:main
Open

[장지훈_BackEnd] 2주차 과제 제출합니다.#2
Superpinoiman wants to merge 24 commits intoBCSDLab-Edu:mainfrom
Superpinoiman:main

Conversation

@Superpinoiman
Copy link
Copy Markdown

테스트 모두 확인하고 올립니다.
image

Copy link
Copy Markdown
Collaborator

@dh2906 dh2906 left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!
메소드 명을 더 명확하게, 이게 무슨 역할을 담당하는지를 고민해주시면 좋을 것 같아요.

Comment on lines +17 to +25
static class Car {
String name;
int score = 0;
boolean winner = true;

Car(String name) {
this.name = name;
}
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Application.javaCar 클래스가 종속되는 것보단 파일을 추가로 만들어서 분리하는 것은 어떻게 생각하시나요?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

클래스를 사용하는 의도에 맞게 유지,보수가 편해지도록 따로 분리하여 코딩하는 습관이 있어야 할 것 같다고 생각하게 되었습니다. 참고하겠습니다.

Comment on lines +18 to +20
String name;
int score = 0;
boolean winner = true;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

  1. 접근 제어자를 지정하지 않으면 무슨 일이 생길까요??
  2. 자동차 경주를 시작하지도 않았는데 기본값으로 winnertrue로 둔 이유가 있으신가요?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

접근제어자를 지정하지 않으면 같은 패키지 안에서만 접근이 가능해집니다. 어떤 의도로 클래스를 만들었는지 알아보기 어려워질 수 있겠네요. 참고하겠습니다. winner는 실행 마지막에 score 비교 후 낮은 객체의 winner를 False로만 바꾸면 간단할 것 같다고 생각해서 미리 true로 설정했는데 이것도 경주시작도 안했는데 winner라면 말이 안되네요. 참고하겠습니다.

}
}

private static boolean nameAgain(ArrayList<Car> Cars){
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

  1. private static 메소드는 무슨 특징을 지닐까요?
  2. 이렇게 지정한 이유가 있으신가요?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

해당 클래스 안에서만 호출이 가능하고 객체 없이 호출이 가능한 특징이 있습니다. 그리고 여기 클래스 안에서만 사용하고 따로 객체 없이 기능을 하는 메소드라는 특징이 있습니다. 따로 이유는 없이 유틸 메소드를 만들려고 static으로 지정했습니다.

}

private static boolean nameAgain(ArrayList<Car> Cars){
Set<String> nameSet = new HashSet<>();
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Set 자료구조의 특징은 무엇일까요?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

순서가 없어 중복을 허용하지 않습니다.

Comment on lines +46 to +48
} else {
Cars.add(new Car(names[i]));
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

별 차이는 없지만, if 문에서 조건이 걸린다면 어차피 예외를 발생해서 프로그램을 종료하므로 else 문은 명시하지 않아도 될 것 같아요!

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

더욱 깔끔하게 되네요. 참고하겠습니다.

for (int i = 0; i < Cars.size(); i++){
random = Randoms.pickNumberInRange(0, 9);
if(random >= 4){
Cars.get(i).score++;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

이런 식으로 객체의 멤버 변수를 직접 접근하는 방식은 지양해주세요!
전용 메소드를 하나 만들어서 이를 호출하는 방식을 채택해주세요

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

이것 또한 클래스를 사용한 의도랑 맞지 않네요. 메소드를 만들도록 참고하겠습니다.

}
}
}
} No newline at end of file
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

깃허브에 코드를 올릴때는 맨 마지막 라인에 공백이 들어와야 해요!

자료 참고바랍니당

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

참고하겠습니다. 피드백 공부 많이 됐습니다 감사합니다.

@Superpinoiman Superpinoiman changed the title [장지훈_BackEnd] 1주차 과제 제출합니다. [장지훈_BackEnd] 2주차 과제 제출합니다. Apr 5, 2026
Comment on lines +20 to +25
public boolean isWinner() {
if (this.winner) {
return true;
}
return false;
}
Copy link
Copy Markdown

@JanooGwan JanooGwan Apr 13, 2026

Choose a reason for hiding this comment

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

이 메소드를 더 간결하게 만들 수도 있어요!

Suggested change
public boolean isWinner() {
if (this.winner) {
return true;
}
return false;
}
public boolean isWinner() {
return this.winner;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

그리고 추가로, 해당 자동차가 승자인지에 대한 정보 + 이를 판단하는 메소드를 Car 객체 안에 포함시킨 이유가 있을까요??

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

winner라는 특성이 car객체들의 특성이라고 생각해서 winner의 값을 반환하는 메소드를 만들려고 한건데 차라리 수정해주신 코드처럼 간결하게 했거나 아니면 winner의 판단 여부 기능을 RaceResult에서 한번에 처리하여 배열에 승자를 저장하는 방식으로 하는게 더 좋았을 것 같습니다. 감사합니다.

Comment on lines +12 to +14
public String getName() {
return this.name;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

아래에 있는 메소드들의 return 도 마찬가지지만,
제공받은 인자가 따로 없으므로 this를 빼고 필드만 써주셔도 무방합니다

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

매개변수와 이름이 같지 않으면 this를 생략해도 무방하군요 참고하겠습니다.

Comment on lines +30 to +32
if (random >= 4) {
this.cars.get(i).move();
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

숫자 4 와 같이 어떤 의미가 있는 수들은 상수로 처리하는 것을 권장합니다!

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

상수처리하는게 안정성과 가독성이 더 좋겠네요 참고하겠습니다.

for (int i = 0; i < this.round; i++) {
moveCars();
printScore();
System.out.println(" ");
Copy link
Copy Markdown

@JanooGwan JanooGwan Apr 13, 2026

Choose a reason for hiding this comment

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

하나 팁을 드리자면,
개행을 할 때에는 System.out.print('\n') 을 하는 것이 성능 상 이득을 볼 수 있습니다!
그 이유도 같이 찾아보심 좋을 것 같아요

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

print('\n')에는 실행중에 flush가 없이 내부 버퍼에만 기록되어 os에 I/O요청을 하지 않아서 println()를 사용하여 공백을 넣는 것 보다 효율적이군요. 참고하겠습니다.

Comment on lines +36 to +44
private void printScore() {
for (int i = 0; i < this.cars.size(); i++) {
System.out.print(this.cars.get(i).getName() + " : ");
for (int j = 0; j < this.cars.get(i).getScore(); j++) {
System.out.print("-");
}
System.out.println(" ");
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

이 메소드의 내부 for문을 살펴보시면,
조건식에 this.cars.get(i).getScore() 가 있어서, for문 한 바퀴를 돌 때마다 이 조건식이 호출됩니다
그래서 비효율적일 수 있기 때문에, 이렇게 반복적으로 쓰이는 것은 필드로 저장해서 사용하는 것을 추천합니다

Suggested change
private void printScore() {
for (int i = 0; i < this.cars.size(); i++) {
System.out.print(this.cars.get(i).getName() + " : ");
for (int j = 0; j < this.cars.get(i).getScore(); j++) {
System.out.print("-");
}
System.out.println(" ");
}
}
private void printScore() {
for (int i = 0; i < this.cars.size(); i++) {
System.out.print(this.cars.get(i).getName() + " : ");
int score = cars.get(i).getScore();
for (int j = 0; j < score; j++) {
System.out.print("-");
}
System.out.println(" ");
}
}

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

불필요하게 복잡도만 올라가는 코드였네요 참고하겠습니다.

Comment on lines +11 to +14
Race(ArrayList<Car> cars, int round) {
this.cars = cars;
this.round = round;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

public 이 빠진 것 같습니다..!

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

확인했습니다 참고하겠습니다.

Comment on lines +6 to +9
private ArrayList<Car> cars;
RaceResult(ArrayList<Car> cars) {
this.cars = cars;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

여기로 마찬가지로 생성자 앞에 public 써주셔야 합니다
그리고 상단에 있는 cars 필드 다음에 한 칸 개행해주시는 것을 권장합니다(코드 작성 관례와 관련이 있습니다)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

그러네요 주의하겠습니다. 한 칸 개행도 확인했습니다.

Comment on lines +11 to +27
public void printWinner() {
boolean flag = true;

this.findWinner();
System.out.print("최종 우승자 : ");

for (int i = 0; i < this.cars.size(); i++) {
if (this.cars.get(i).isWinner() && !flag) {
System.out.print(", ");
System.out.print(this.cars.get(i).getName());
}
if (this.cars.get(i).isWinner() && flag) {
System.out.print(this.cars.get(i).getName());
flag = false;
}
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

flag 변수를 이용해서 쉼표 처리 로직을 구현해주신 것 같은데, 이것 또한 좋은 방법인 것 같아요!
다만 이를 StringJoiner 등을 이용해서 좀 더 단순화 시킬 수도 있습니다!!
이와 관련해서는 여러 가지 방법이 있으니, 구글링을 하시거나, AI한테 물어보거나, 다른 비기너들이 작성한 코드들도 보면서 추가적으로 고민해보시면 도움 많이 될 거예요!

Suggested change
public void printWinner() {
boolean flag = true;
this.findWinner();
System.out.print("최종 우승자 : ");
for (int i = 0; i < this.cars.size(); i++) {
if (this.cars.get(i).isWinner() && !flag) {
System.out.print(", ");
System.out.print(this.cars.get(i).getName());
}
if (this.cars.get(i).isWinner() && flag) {
System.out.print(this.cars.get(i).getName());
flag = false;
}
}
}
public void printWinner() {
findWinner();
StringJoiner joiner = new StringJoiner(", ");
for (Car car : this.cars) {
if (car.isWinner()) {
joiner.add(car.getName());
}
}
System.out.println("최종 우승자 : " + joiner);
}

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

훨씬 간결하네요. 참고하고 다양한 방법을 찾아보겠습니다.

Comment on lines +32 to +36
for (int i = 0; i < this.cars.size(); i++) {
if (this.cars.get(i).getScore() >= maxScore) {
maxScore = this.cars.get(i).getScore();
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

이 부분도 Math 라이브러리를 활용해서 단순화시킬 수 있어요!

Suggested change
for (int i = 0; i < this.cars.size(); i++) {
if (this.cars.get(i).getScore() >= maxScore) {
maxScore = this.cars.get(i).getScore();
}
}
for (Car car : this.cars) {
maxScore = Math.max(maxScore, car.getScore());
}

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

그러네요 다른 라이브러리 활용도 참고하겠습니다.

private ArrayList<Car> cars;
private int round;

RaceSetup(){}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

해당 생성자를 작성해주신 이유가 있을까요??
자바에서는 생성자를 작성해주지 않아도 기본 생성자(어떤 인자도 받지 않는 생성자)를 자동으로 생성해주는 기능이 있습니다!

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

다른 클래스들의 생성자 만들며 자연스레 같이 만들었습니다. 자동으로 기본 생성자를 생성해주는 기능이 있는지 몰랐습니다. 참고하겠습니다.

Comment on lines +45 to +50
for (int i = 0; i < names.length; i++) {
if (names[i].length() > 5 || names[i].contains(" ") || names[i].isEmpty()) {
throw new IllegalArgumentException();
}
cars.add(new Car(names[i]));
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

for-each 문으로 바꾸면 좀 더 간결하게 작성하실 수 있습니다

Suggested change
for (int i = 0; i < names.length; i++) {
if (names[i].length() > 5 || names[i].contains(" ") || names[i].isEmpty()) {
throw new IllegalArgumentException();
}
cars.add(new Car(names[i]));
}
for (String name : names) {
if (name.length() > 5 || name.contains(" ") || name.isEmpty()) {
throw new IllegalArgumentException();
}
cars.add(new Car(name));
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

그리고 자동차 이름 검증하는 부분(if (names[i].length() > 5 || names[i].contains(" ") || names[i].isEmpty())) 은 별도의 메소드로 분리해주셔도 좋을 것 같습니다! 현재 setupCars() 메소드가 맡고 있는 역할이 조금 많아 보입니다

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

더욱 간결하네요 참고하겠습니다. 그리고 셋업과 별개의 기능인 검증하는 기능도 별도로 분리하는게 좋아 보이네요. 최대한 기능단위로 작게 구현하도록 하겠습니다. 피드백 감사합니다.

import java.util.Set;

public class RaceSetup {
private ArrayList<Car> cars;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

리스트형 변수를 선언할 때에는 ArrayList 보단 List 를 사용하시는 것을 권장합니다
구현체(ArrayList)보단 인터페이스(List)에 의존하는 것이 더 좋습니다

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

알겠습니다. ArrayList보다 List를 더욱 활용하도록 하겠습니다.

Comment on lines +7 to +8
RaceSetup setup = new RaceSetup();
setup.raceSetup();
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

RaceSetup 클래스의 raceSetup 메소드를 RaceSetup 생성자 내에서 실행되도록 하면 setup.raceSetup() 없이 new RaceSetup() 만 해도 레이스 세팅이 자동으로 되도록 하는 것도 가능합니다..!

Copy link
Copy Markdown
Author

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.

3 participants