(우테코 7기 프리코스) 2주차

[2024-10-17-215628.png

10월 22일~23일 (화,수)

수요일 저녁에 데이터 통신 시험이 있어서 이날은 미션 확인만 하고 시험 공부를 하였다.


10월 24일 (목)

오늘은 우선 요구사항들을 분석하고 1주차 공통 피드백을 살펴봤다.

🚀오늘 한 작업

공통 피드백

다양한 공통 피드백 사항들이 있었지만 그중 가장 나에게 유익했던 것은 추가 학습 자료로 주어진 영상 자료였다. 이 영상은 1주차 미션이었던 문자열 계산기를 구현하는데 요구사항을 어떻게 구현하는지를 볼 수 있어서 좋았다.

특히 나에 경우 1주차 글에도 적었지만 자꾸 굵직한 흐름을 먼저 구현하지 않고, 자꾸 가지를 구현하려고 했다. 그래서 속도도 너무 느리기도 했고, 나중에 매인 흐름을 이어가기에도 너무 힘들었다. 근데 이 피드백 영상에서는 이미 주어진 요구사항들을 천천히 해결해 나가면서 그 과정에서 이 방법이 타당한가 왜 그렇게 생각하는 가를 스스로에게 질문하면서 적절한 선택을 해나가는 것이 인상깊었다.

요구사항 분석

앞에서 적은 것처럼 너무 딥하게 생각하지 않고 일단 주어진 요구사항에 맞는 돌아가는 코드를 만들보자 라고 생각을 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  

	System.out.println("\n실행 결과");  
	for (int i = 0; i < num; i++) {            
		racingGame(cars);            
		printResult(cars);           
		printWinner(cars);       
	}    
  
    private static void printWinner(Cars cars) {  
        List<String> winners = cars.getWinner();  
        String winnersMessage = String.join(", ", winners);  
        System.out.print("최종 우승자 : ");  
        System.out.print(winnersMessage);  
    }  
  
    private static void printResult(Cars cars) {  
        List<Car> cars1 = cars.getCars();  
        for (Car car : cars1) {  
            System.out.print(car.getName());  
            int position = car.getPosition();  
            for (int i = 0; i < position; i++) {  
                System.out.print("-");  
            }  
            System.out.println();  
        }  
        System.out.println();  
    }  
  
    private static void racingGame(Cars cars) {  
        cars.move();  
    }  
  
    private static void validateCarName(String name) {  
        if (name.isEmpty()) {  
            throw new IllegalArgumentException("경주할 자동차 이름을 입력해주세요");  
        }  
        if (name.length() > 5) {  
            throw new IllegalArgumentException("경주할 자동차 이름은 5자 이하입니다.");  
        }  
    }

대충 요런 식이었다. 이런식으로 결과가 나오는 코드를 작성해보니 어떤 순서로 코드를 작성하면 좋을지 눈에 들어왔다. (하지만 이렇게 하면 너무 속도가 느리다.. 실전에서는 이런식으로 하는 건 비 효율적이라 생각이든다. 연습용)

🥲공부 할 내용

  • java8
    • 책으로 공부를 해도 실제로 쓰려니 사례들을 적용하기 힘들어서 영상 자료들로 다시 공부해보려고 한다.

      2주차 회고

이번 주차는 아주 바빴다. 학교시험이 연달아 있어서 매일 회고를 못했다. 그래도 코드를 짤 때 만큼은 열심히 공부를 했고 어느정도 감을 잡은 것 같아 기분 좋은 주차였다.

이번 과제에서는 특히 각 클래스 별 역할과 흐름을 중심으로 읽기 좋은 코드를 작성하려고 많은 노력을 했다.

코드의 흐름도 2024-10-28-221644.png

Controller

프로그램의 전반적인 진행 흐름을 제어하는 역할을 한다.

  • CarRacingController
    • 전체 게임 흐름을 제어한다.
1
2
3
4
5
public void run() {  
    CarRacingGame carRacingGame = gameInit();  
    gameStart(carRacingGame);  
    showWinners(carRacingGame);  
}

View

컨트롤러로부터 데이터를 넘겨받아 출력하는 OutputView, 사용자로 부터 데이터를 입력 받아 컨트롤러로 넘기는 InputView

Model

상태를 변경 관리 조회를 담당하는 역할을 한다. - Car - 차량의 대한 정보와 상태를 변경 조회 하는 역할을 맡았다. - Cars - 차량들의 리스트를 가지고 있는 일급 컬렉션으로 차량들의 상태를 변경 조회 하는 역할을 맡았다 - CarRacingGame - 차량들과 NumberGenrator와 rounds의 정보를 가지고 있어 레이싱 게임 자체를 관리하는 역할을 맡았다

코드리뷰로 공부해본것들

이번 주차는 감사하게 많은 분들의(@SeoMoonk, @mingking2, @holyPigeon, @WooyoungKwon, @LSBsity, @StoneCAU) 리뷰를 받을 수 있었고 나도 많은 리뷰를 진행했다.

1. Comparable<>의 사용

우선 이번 과제에서 차량들 중 가장 position이 큰 차량 객체를 얻어 우승자들을 가려내는 코드를 구현할 때 Comparable을 사용했다

1
2
3
4
private Car getWinner() {  
    return carList.stream()  
            .max(Car::compareTo)  
            .get();

우선 어떤 상황에 사용할 수 있을까?

어떤 객체의 대소관계를 비교 할 필요가 있을 때

1
2
3
4
5
6
7
8
9
public class Car{
	private final String name;  
	private int position = 0;
	
	public Car(String name) {  
	    validate(name);  
	    this.name = name;  
	}
}

위 코드에서 자동차의 position을 기준으로 대소관계를 비교할 필요가 있었다.

사용 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Car 클래스는 Comparable<T> 인터페이스 구현체
public class Car implements **Comparable<Car>**{
	private final String name;  
	private int position = 0;
	
	public Car(String name) {  
	    validate(name);  
	    this.name = name;  
	}
	//Comparable<T>에서 정의된 compareTo 재정의
	@Override  
	public int **compareTo**(Car car) {  
	    return this.position - car.getPosition();  
	}
}

여기서 comparTo() 의 매개변수로 들어오는 car의 position과 현재 나의 position을 비교를 한다.

만약 내가 더 크다면 양수를 같다면 0을 매개변수로 들어오는 car의 값이 더 크다면 음수를 반환하고 이것이 비교의 기준이 된다.

2. record

dto에 record를 사용했다.

1
2
3
4
5
6
public record CarDto(String name, int position) {  
  
    public static CarDto from(Car car) {  
        return new CarDto(car.getName(), car.getPosition());  
    }  
}

record란 불변한 데이터를 표현하기 위한 간결하게 객체를 생성할 수 있도록 하는 클래스인데

특징으로는 불변성

  • 한번 생성되면 수정이 될 수 없다는 점 필드 암시적 정의
  • public record CarDto(String name, int position)
  • 이렇게만 적어도 필드가 자동으로 생성된다 getter, equals(), hashCode(), toString() 자동생성

3주차도 많은 것을 배우고 나가야겠다 ㅎㅎㅎ