-
1. ๋๋ค๊ฐ ํ ์คํธ๋ ์ด๋ป๊ฒ ํด์ผํ ๊น?
-
2. ์ ๋ ฅ๊ฐ ๊ฒ์ฆ ์ฑ ์์ ์ด๋์ ๋ฌ์ผ ํ ๊น?
-
3. ์ถ๋ ฅ์ ๋ฐ๋์ OutputHandler์ ๋ฃ์ด์ผ ํ ๊น?
-
4. ์ฝ๋๋ฆฌ๋ทฐ ๋ฐ์ํ๊ธฐ
-
(1) Rounds์์ ์ถ๋ ฅ๊น์ง ๋ด๋นํ๊ณ ์์ด์.
-
(2) Game.start() ๋ฉ์๋๊ฐ ๋๋ฌด ๋ง์ ์ฑ ์์ ์ง๊ณ ์์ด์.
-
(3) ์ ์ ์ ํธ๋ฆฌํฐ ํด๋์ค์ธ๋ฐ ์์ฑ์ ๋ณดํธ๊ฐ ๋์ด์์ง ์์์.
-
(4) ๋๋ฉ์ธ ๊ฐ์ฒด ํด๋์ค์ ์ฑ ์์ด ๋๋ฌด ๋ง์์. ๊ฒ์ฆ์ ๋ณ๋ ํด๋์ค๋ก ๋ถ๋ฆฌํ๋ ๊ฒ ์ข์๋ณด์ฌ์.
-
5. ๋ฐ์ํ์ง ์์ ์ฝ๋๋ฆฌ๋ทฐ
-
InputHandler์ OutputHandler๋ฅผ staticํ ํ์ง ์๊ณ ์ธ์คํด์คํํ ์ด์ ๊ฐ ์๋์?
-
6. ๋ฌด์์ ๋ฐฐ์ ๋์?
-
(1) ํ ์คํธ ์ฝ๋ ์์ฑ๋ฒ
-
(2) ์ผ๊ธ ์ปฌ๋ ์ ์ฌ์ฉ๋ฒ
-
(3) ์ธ์ static์ผ๋ก ์ ์ธํด์ผ ํ ๊น?
ํ๋ฆฌ์ฝ์ค 2์ฃผ์ฐจ๊ฐ ์ง๋๊ฐ๋ค. ์ด๋ฒ ์ฃผ์ฐจ์๋ ํ ์คํธ ์ฝ๋๊น์ง ์์ฑํด์ผ ํด์ ์กฐ๊ธ ํ๋ค์์ง๋ง ๊ทธ๋งํผ ์ข์ ๊ฒฝํ์ด์๋ค.
๋ฆฌํฉํ ๋ง๊น์ง ๋๋ง์น ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค. ์ง๋ ์ฃผ์ฐจ์ ๋นํด ํด๋์ค์ ์๊ฐ ๋ง์์ง๊ฒ ๋์ ๋๋ค๐

๊ทธ๋ผ ์ด๋ฒ ์ฃผ์ฐจ ํ๊ณ ๋ ์์~! แ( แ )แ
1. ๋๋ค๊ฐ ํ ์คํธ๋ ์ด๋ป๊ฒ ํด์ผํ ๊น?
2์ฃผ์ฐจ ๋ฏธ์ ์์ ๊ฐ์ฅ ์ด๋ ค์ ๋ ์ ์ด์๋ค. 0~9 ์ฌ์ด์ ์๋ฅผ ๋ฌด์์๋ก ๋ฝ์ 4 ์ด์์ด๋ฉด ์ฐจ๊ฐ ์ ์งํ๋ ๋ฐฉ์์ด์๋๋ฐ, ์๊ตฌ์ฌํญ์ ํ ์คํธ ์ฝ๋ ๊ตฌํ๊น์ง ์์๋ค๐ฅน ๋๋ค๊ฐ์ ์ปจํธ๋กคํ ์ ์๋ ๋ถ๋ถ์ด๋ผ ํ ์คํธ๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํด์ผ ํ๋ ๊ณ ๋ฏผํ๋๋ฐ, ๊ฒฐ๊ตญ Car.move() ๋ฉ์๋์์ ๋๋ค ํจ์๋ฅผ ์ง์ ํธ์ถํ์ง ์๊ณ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ์ ์ ๋ฌ๋ฐ๋ ํ์์ผ๋ก ๋จ์ ํ ์คํธ๋ฅผ ์งํํ๋ค.
public Car {
public void move(int power) {
if (power >= POWER_THRESHOLD) {
this.distance++;
}
}
}
public CarTest {
@ParameterizedTest
@ValueSource(ints = {4, 6, 9})
void ๋ฌด์์๋ก_๋ฝ์_๊ฐ์ด_4_์ด์์ด๋ฉด_์ ์งํ๋ค(int value) {
car.move(value);
assertThat(car.getDistance()).isEqualTo(3);
}
}
๊ทธ๋ฐ๋ฐ ๋์ค์ ์ฐพ์๋ณด๋ NumberUtil ์์ ์ธํฐํ์ด์ค๋ก ์ ์ธํ๊ณ , ๊ตฌํ์ฒด๋ฅผ ๊ฐ์๋ผ์ฐ๋ ๋ฐฉ์์ผ๋ก๋ ํ ์คํธ๋ฅผ ์งํํ ์ ์์๋ค.
public interface NumberUtil {
public int getNumber();
}
public class Car {
// ์ค๋ต
private final String name;
private int distance;
private final NumberUtil numberUtil;
// ์ค๋ต
public void move() {
int power = numberUtil.getNumber();
if (power >= POWER_THRESHOLD) {
this.distance++;
}
}
}
class CarTest {
@ParameterizedTest
@ValueSource(ints = {4, 6, 9})
void ๋ฌด์์๋ก_๋ฝ์_๊ฐ์ด_4_์ด์์ด๋ฉด_์ ์งํ๋ค(int value) {
Car car = new Car("pobi", () -> value);
car.move();
assertThat(car.getDistance()).isEqualTo(3);
}
}
๊ธฐ์กด ๋ฐฉ์์ ์ธ๋ถ์์ ๋งค๋ฒ RandomUtil์ ์ด์ฉํด Car์๊ฒ ํ์ํ ์ซ์๋ฅผ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค. ํ์ง๋ง ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ Car ๊ฐ์ฒด๊ฐ ์ง์ ์ซ์๋ฅผ ์์ฑํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ์์ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค๋ ์ ์์ ์ข ๋ ์์ง๋๊ฐ ๋์์ก๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ค์ ๋๋ค๊ฐ์ ๋ฝ๋ ๋ฐฉ์์ด ๋ณ๊ฒฝ๋์ด๋, ๊ตฌํ์ฒด๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ๋ฒ์ด ์ ์ฐ์ฑ ์ธก๋ฉด์์ ๋ ๋์๊ฒ๊ฐ๋ค๐
2. ์ ๋ ฅ๊ฐ ๊ฒ์ฆ ์ฑ ์์ ์ด๋์ ๋ฌ์ผ ํ ๊น?
์ฒ์์๋ InputValidator์์ ์ ๋ ฅ๊ฐ์ ๊ฒ์ฆํ๋ค. ๊ทธ๋ฐ๋ฐ ์๊ตฌ์ฌํญ์ ํ๋ ๋ ๊ตฌํํ๋ค ๋ณด๋ InputValidator๊ฐ ์ ์ ๋ฌด๊ฑฐ์์ก๋ค. ์๋์ฐจ๋ช ๋ ๊ฒ์ฆํด์ผ ํ๊ณ , ์๋์ฐจ ๋ชฉ๋ก๋ ๊ฒ์ฆํด์ผ ํ๊ณ , ์๋ ํ์๋ ๊ฒ์ฆํด์ผ ํ๊ณ ... ๊ฒ์ฆ ์กฐ๊ฑด์ด๋ ๊ฒ์ฆ ๋์์ด ์ถ๊ฐ๋๋ฉด ํด๋์ค๊ฐ ๋์ฑ ๋ฌด๊ฑฐ์์ง ๊ฒ์ด๋ผ๋ ์๊ฐ์ ๊ฒ์ฆ ์ฑ ์์ ๊ฐ ๋๋ฉ์ธ ๊ฐ์ฒด๋ก ์ด๋ํ๋ค.
public Car(String name) {
this.name = validateCarName(name);
this.distance = 0;
}
private static String validateCarName(String name) {
validateNotNull(name);
validateNotBlank(name);
name = name.strip();
validateNameLength(name);
return name;
}
private static void validateNameLength(String name) {
if (name.length() < MIN_CAR_NAME_LENGTH || name.length() > MAX_CAR_NAME_LENGTH) {
throw new IllegalArgumentException(
String.format(INVALID_LENGTH_RANGE_CAR_NAME.getMessage(),
MIN_CAR_NAME_LENGTH, MAX_CAR_NAME_LENGTH, name));
}
}
private static void validateNotBlank(String name) {
if (name.isBlank()) {
throw new IllegalArgumentException(BLANK_CAR_NAME.getMessage());
}
}
private static void validateNotNull(String name) {
if (name == null) {
throw new IllegalArgumentException(NULL_CAR_NAME.getMessage());
}
}
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ๋๋ฉด Car ๊ฐ์ฒด๋ฅผ ์์ํ์ ๋ ๊ฒ์ฆ ๋ก์ง๊น์ง ํจ๊ป ์์๋๋ค๊ณ ํ๋ค๐ฑ ๋น์ฐํ ๊ฑด๋ฐ ์ ์๊ฐ์ ๋ชปํ์๊น...๐ฅน
์ฌ์ง์ด static ๋ฉ์๋๋ก ์ ์ธํ๋ ๋ฐ๋์ ์ค๋ฒ๋ผ์ด๋ฉ๋ ๋ถ๊ฐ๋ฅํ ๋์ชฝ๊ฐ์ ๋ฉ์๋๊ฐ ๋์ด๋ฒ๋ ธ๋ค ^_ใ
Car ๊ฐ์ฒด์์๋ ์กธ์ง์ ์ ๋ ฅ๊ฐ ๊ฒ์ฆ์ด๋ผ๋ ์ฑ ์๊น์ง ์ง๊ฒ ๋์๋ค. ๊ทธ๋์ ๋ฆฌํฉํ ๋ง ๋ ์ด ๋ถ๋ถ์ ์์ ํ๋๋ฐ ์์ธํ ๋ด์ฉ์ ํ์ ..!
3. ์ถ๋ ฅ์ ๋ฐ๋์ OutputHandler์ ๋ฃ์ด์ผ ํ ๊น?
public class InputHandler {
public List<String> getCarNames() {
System.out.println(CAR_NAME_INPUT_MESSAGE.getMessage());
String input = Console.readLine();
return Arrays.stream(input.split(DELIMITER)).toList();
}
public Integer getRoundSize() {
System.out.println(ROUND_SIZE_INPUT_MESSAGE.getMessage());
String input = Console.readLine();
validateRoundSize(input);
return Integer.parseInt(input);
}
}
์ง๋ ์ฃผ์ฐจ์์ ์ฐจ์ด์ ! ์ง๋ ์ฃผ์๋ ์ถ๋ ฅ์ ์ ๋ถ OutputHandler์์ ๊ด๋ฆฌํ๋๋ฐ, ์ด๋ฒ์ ์ ๋ ฅ์ ๋ฃ์ด๋ฌ๋ผ๋ ๋ฉ์ธ์ง๋ InputHandler์์ ํธ์ถํ๋คโจ
์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๊ฐ์ฅ ํฐ ์ด์ ๋ INPUT_MESSAGE ์ถ๋ ฅ์ OutputHandler์ ๋ฉ์๋๋ก ๋ถ๋ฆฌํ ๊ฒฝ์ฐ, ํด๋น ๋ฉ์ธ์ง๊ฐ ๋จ๋ ์ผ๋ก ์ถ๋ ฅ๋ ์ ์๋ค๋ ์ ์ด์๋ค. INPUT_MESSAGE๋ฅผ ์ถ๋ ฅํ๊ณ ์ ๋ ฅ์ ์๋ฐ๋๋ค๋ฉด? ์ง๊ธ์ด์ผ ๋ ํผ์ ๊ฐ๋ฐํ๋๊น ํท๊ฐ๋ฆฌ์ง ์๊ฒ ์ง๋ง ๊ฐ๋ฐ ๋ด๋น ์ธ์์ด ๋์ด๋๋ฉด ์ด๋ป๊ฒ ๋ ์ง ๋ชจ๋ฅด๋ ์ผ์ด๋ค.
๋ ๋ ผ๋ฆฌ์ ์ธ ํ๋ฆ ์ InputHandler์์๋ ์ด ์ ๋์ ๋ฉ์ธ์ง๋ฅผ ๋์ฐ๋ ๊ฑด ์ด์ํ์ง ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ด๋ฒ์๋ ์ ๋ ฅ๊ฐ์ ๋ฃ์ด๋ฌ๋ผ๋ ์ถ๋ ฅ์ InputHandler์ ์์น์์ผฐ๋ค.
4. ์ฝ๋๋ฆฌ๋ทฐ ๋ฐ์ํ๊ธฐ
์ด๋ฒ ์ฃผ์ฐจ์๋ ์ฉ๊ธฐ๋ด์ ๊ธ์ ์ฌ๋ ค๋ดค๋๋ฐ, ๋ ๊น๋นกํ๋ ์ฌ์ด์ ์์ฒญ ๋ง์ ๋ถ๋ค์ด ์์ฃผ์ ์ ๊น์ง ๋๋๋ค. ๋์ถํ ๊ณณ์ ๊ทํ ๋ถ๋ค์ด...๐ฅน ๊ทํ ๋ถ๋ค์ ํผ๋๋ฐฑ์ ๋ชจ์ ๋ฐ์ํด๋ณด๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
๋จผ์ ๋ฆฌ๋ทฐ์ด๋ถ๋ค๊ป์ ๋จ๊ฒจ์ฃผ์ ๊ธ์ ์ ์ธ ํผ๋๋ฐฑ์ ์๋์ ๊ฐ์๋ค. ๋๋ฆ ์ ๊ฒฝ์ผ๋ ๋ถ๋ถ์ธ๋ฐ ๊ท์ ๊ฐ์ด ์์๋ด ์ฃผ์๋ ๊ธฐ๋ถ์ ์ข๋ค์ฉ๐
- ์ฐธ์ฌ ์๋์ฐจ ๊ฐ์์, ์ต๋ ์๋ ํ์๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์ ํํ ์ ์ด ์ข๋ค.
- @BeforeEach, @ParameterizedTest ๋ฑ ์ ์ ํ ํ ์คํธ ์ด๋ ธํ ์ด์ ์ ํ์ฉํ ์ ์ด ์ข๋ค.
- ์ผ๊ธ ์ปฌ๋ ์ ์ฌ์ฉ ์, ๋ฆฌํดํ ๋ ๋ฆฌ์คํธ ์๋ณธ์ด ์๋ unmodifiableList()๋ก ํ๋ฒ ๊ฐ์ธ์ ๋ฐํํ ๊ฒ์ด ์ข๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ์๊ฐํด๋ณผ๋งํ ํผ๋๋ฐฑ์ ์๋์ ๊ฐ์๋ค.
(1) Rounds์์ ์ถ๋ ฅ๊น์ง ๋ด๋นํ๊ณ ์์ด์.
public class Rounds {
private final Integer roundSize;
public void proceedRounds(List<Car> cars, OutputHandler outputHandler) {
for (int i = 0; i < roundSize; i++) {
List<String> roundResult = processRound(cars);
outputHandler.printRoundResult(roundResult);
}
}
}
Rounds ๊ฐ์ฒด๋ ์๋ ํ์๋ฅผ ๊ด๋ฆฌํ๊ณ , ์๋ ํ์๋งํผ ๋ผ์ด๋๋ฅผ ์งํ์ํค๋ ํด๋์ค์ด๋ค. ๋งค ๋ผ์ด๋๊ฐ ๋๋ ๋๋ฉด OutputHandler๋ฅผ ํธ์ถํด์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋๋ฐ, ๋๋ฉ์ธ ๋ชจ๋ธ์์ ์ถ๋ ฅ๊น์ง ๋ด๋นํ๊ณ ์๋๊ฒ๊ฐ๋ค๋ ์๊ฒฌ์ ๋ฐ์๋ค.
์๊ฐํด๋ณด๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํด์ผ ํ๋ Rounds ๊ฐ์ฒด์์ OutputHandler๋ฅผ ์ง์ ํธ์ถํ๋ ๊ฒ์ ์ข์๋ณด์ด์ง ์์๋ค. ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ฌ๋ฌ ๊ตฐ๋ฐ์์ ์ฌ์ฌ์ฉํ ์ ์์ด์ผ ํ๋๋ฐ ์ถ๋ ฅ์ ์ง์ ๋ด๋นํ๋ค ๋ณด๋ ๊ทธ๊ฒ ์ด๋ ค์์ง๊ณ , OutputHandler๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ Rounds๋ ์ํฅ์ ๋ฐ์ ์ํ์ด ์์๊ธฐ ๋๋ฌธ์ด๋ค.
public List<List<String>> proceedRounds(List<Car> cars) {
List<List<String>> result = new ArrayList<>();
for (int i = 0; i < roundSize; i++) {
List<String> roundResult = processRound(cars);
result.add(roundResult);
}
return result;
}
๊ทธ๋์ 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๊ณ , ์ถ๋ ฅ์ Rounds.proceedRounds()๋ฅผ ํธ์ถํ๋ Game์์ ์์ ํ ๋ด๋นํ๊ธฐ๋ก ๊ฒฐ์ !
(2) Game.start() ๋ฉ์๋๊ฐ ๋๋ฌด ๋ง์ ์ฑ ์์ ์ง๊ณ ์์ด์.
public void start() {
List<String> carNames = inputHandler.getCarNames();
cars = new Cars(carNames);
String roundSizeInput = inputHandler.getRoundSize();
rounds = new Rounds(roundSizeInput);
outputHandler.printResultMessage();
rounds.proceedRounds(cars.getCars(), outputHandler);
List<String> winners = cars.getWinners();
outputHandler.printWinner(winners);
}
Game.start()๊ฐ ์กฐ๊ธ ๋ฑ๋ฑํ๋ค ์ถ๊ธด ํ๋๋ฐ ์ญ์๋ ์ฝ๋๋ฆฌ๋ทฐ์์ ๋น์ทํ ์๊ฒฌ์ ๋ฐ์๋ค๐ ๋ณ๋ ๋ฉ์๋๋ก ๋ถ๋ฆฌํด๋ดค์ ํธ์ถ ๋์ค๋ง ๊น์ด์ง ๊ฒ ๊ฐ์์ ๋ฐ๋ก ๋ถ๋ฆฌํ์ง๋ ์์๋๋ฐ... ์ด์ ๋ณด๋ ๋ถ๋ฆฌํ๋๊ฒ ๋์ ๊ฒ ๊ฐ์์ ๋ถ๋ฆฌ ๊ฒฐ์ .
public void start(NumberUtil numberUtil) {
getUserInputs(numberUtil);
processRounds();
announceWinner();
}
private void getUserInputs(NumberUtil numberUtil) {
List<String> carNames = inputHandler.getCarNames();
cars = new Cars(carNames, numberUtil);
Integer roundSize = inputHandler.getRoundSize();
rounds = new Rounds(roundSize);
}
private void processRounds() {
outputHandler.printResultMessage();
List<List<String>> roundResult = rounds.proceedRounds(cars.getCars());
roundResult.stream().forEach(result -> outputHandler.printRoundResult(result));
}
private void announceWinner() {
List<String> winners = cars.pickWinners();
outputHandler.printWinner(winners);
}
๊ทธ๋ฐ๋ฐ ์ด๋ฐ๋ค๊ณ start() ๋ฉ์๋์ ์ฑ ์์ด ์ค์ด๋๋ ๊ฑธ๊น? ๋ผ๋ ์๊ฐ์ด ๋ ๋ค. ๋จ์ํ ๋ฉ์๋๋ง ๋ถ๋ฆฌํ์ ๋ฟ์ธ๋ฐ? ์ฌ์ ํ start() ๋ฉ์๋๋ ์ ๋ ฅ๊ฐ์ ๋ฐ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , ๋ผ์ด๋ ์งํ ๋ฉ์๋๋ ํธ์ถํ๊ณ , ์ฐ์น์ ๋ฐํ ๋ฉ์๋๊น์ง ํธ์ถํ๊ณ ์๋ค. ์ด๊ฑธ ์ฑ ์์ด ์ค์ด๋ค์๋ค๊ณ ๋ณผ ์ ์์๊น..?๐ค
์ ํด๋์ค๋ฅผ ์์ฑํด์ ์ฑ ์์ ๋ถ๋ฆฌํ ๊น ํ๋๋ฐ ์์ง ๊ทธ๋ด ๋จ๊ณ๊น์ง ์๋ ๊ฒ ๊ฐ์์ ๊ทธ๋ฅ ๋์์ง๋ง ์ ์ง ์ฐ์ฐํ๋ค๐ ์ด ๋ถ๋ถ์ ๋ํด์๋ ์กฐ๊ธ ๋ ๊ณ ๋ฏผํด๋ณผ ์์ .
(3) ์ ์ ์ ํธ๋ฆฌํฐ ํด๋์ค์ธ๋ฐ ์์ฑ์ ๋ณดํธ๊ฐ ๋์ด์์ง ์์์.
public class RandomUtil {
private static final int MIN_VALUE = 0;
private static final int MAX_VALUE = 10;
public static int getRandomNumber() {
return Randoms.pickNumberInRange(MIN_VALUE, MAX_VALUE);
}
}
์์ ํ ๋์น ๋ถ๋ถ โงโบโ( แตฬดฬถฬทฬฅฬ ยทฬซ แตฬดฬถฬทฬฃฬฅฬ ) ๋ฆฌํฉํ ๋ง ๊ณผ์ ์์ RandomUtil ํด๋์ค๋ ์ ์ ์ ํธ๋ฆฌํฐ ํด๋์ค์์ ๋ฒ์ด๋ RandomNumberUtil์ด๋ผ๋ ๊ตฌํ์ฒด๊ฐ ๋์์ง๋ง ์๋ฏธ์๋ ํผ๋๋ฐฑ์ด์๋ค... ๋ค์์๋ ๊น๋จน์ง ๋ง์.
(4) ๋๋ฉ์ธ ๊ฐ์ฒด ํด๋์ค์ ์ฑ ์์ด ๋๋ฌด ๋ง์์. ๊ฒ์ฆ์ ๋ณ๋ ํด๋์ค๋ก ๋ถ๋ฆฌํ๋ ๊ฒ ์ข์๋ณด์ฌ์.
public class InputHandler {
private static final String DELIMITER = ",";
public List<String> getCarNames() {
System.out.println(CAR_NAME_INPUT_MESSAGE.getMessage());
String input = Console.readLine();
List<String> names = Arrays.stream(input.split(DELIMITER)).toList();
CarsValidator.validateCars(names);
names.stream().forEach(CarNameValidator::validateCarNames);
return names.stream()
.map(String::strip)
.toList();
}
}
๋ฏธ์ ์ ์ํํ๋ฉฐ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ๊ณผ ์ด์ด์ง๋ ํผ๋๋ฐฑ์ด์๋ค. ๋ค๋ฅธ ๋ถ๋ค ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํ๋ค ๋ณด๋ ๋๋ฉ์ธ ๊ฐ์ฒด๋ณ๋ก Validator ํด๋์ค๋ฅผ ๋ง๋์ ๋ถ๋ค์ด ๊ณ์ ์ ๋๋ ๊ฐ ๋๋ฉ์ธ๋ณ๋ก ๊ฒ์ฆ ํด๋์ค๋ฅผ ์์ฑํ์ฌ ๋ฉ์๋๋ฅผ ์ด๋์์ผฐ๋ค. ์ด๋ ๊ฒ ํ๋ ๊ฐ ํด๋์ค๋ณ๋ก ์ฑ ์์ด ๋ช ํํด์ ๋ง์กฑ์ค๐
5. ๋ฐ์ํ์ง ์์ ์ฝ๋๋ฆฌ๋ทฐ
InputHandler์ OutputHandler๋ฅผ staticํ ํ์ง ์๊ณ ์ธ์คํด์คํํ ์ด์ ๊ฐ ์๋์?
์ด ๋ถ๋ถ์ ๋๋ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ธ๋ฐ ๋๋ง์นจ ์ฝ๋๋ฆฌ๋ทฐ์ ๋น์ทํ ์ง๋ฌธ์ด ๋ฌ๋ ค์ ๋ด ์๊ฐ์ ์ ๋ฆฌํด๋ดค๋ค. ๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด ๋๋ static์ ๊ฐ์ฒด์งํฅ๊ณผ ๋ฉ๋ฆฌ ์๋ ๊ฐ๋ ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
static ํจ์๋ ํด๋์ค ๋ ๋ฒจ์ ์ ์ธ๋๋ค. ์ด ๋ง์ธ ์ฆ์จ ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ธฐ ์ ๋ถํฐ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ณ์ ์กด์ฌํ๊ณ , ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ์์ ๋ฒ์ด๋ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ทธ๋์ ์ธ์คํด์ค ์์ฑ ์์ด ํธ์ถํ ์ ์๊ณ , ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค. (์ค๋ฒ๋ผ์ด๋ฉ์ ์ฌ์ฉํ๋ฉด ํธ์ถํ ๋ฉ์๋๊ฐ ๋ฐํ์ ์์ ์ ๊ฒฐ์ ๋๋๋ฐ, static ํจ์๋ ์ปดํ์ผ ์์ ์ ํธ์ถ์ด ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ด๋ค.)
์ด๋ฌํ ์ด์ ๋ก ๋๋ ์๋์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํน๋ณํ ๊ฒฝ์ฐ์๋ง static์ ์ฌ์ฉํ๋ค.
- ๊ฐ์ฒด์ ์ํ๊ฐ๊ณผ ๋ฌด๊ดํ๊ฒ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฉฐ
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์ ์ผ๋ก ํธ์ถ๋์ด ๋ฉ๋ชจ๋ฆฌ ์์ ๊ณ์ ์กด์ฌํ ํ์๊ฐ ์์ผ๋ฉฐ
- ์ค๋ฒ๋ผ์ด๋ฉ์ ํตํ ํ์ฅ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋ฎ์ ๋
์ ์ถ๋ ฅ๊ฐ ํธ๋ค๋ฌ์ ๊ฒฝ์ฐ (1)์ ์กฐ๊ฑด์ ๋ง์กฑํ์ง๋ง (2) ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์ด ์๋ Game์์๋ง ํธ์ถ๋๋ค. (3)์ ๊ฒฝ์ฐ๋ ์ง๊ธ์ ์ฝ์์์ ์ ๋ ฅ์ ๋ฐ๊ณ ์์ง๋ง, ์๊ตฌ์ฌํญ์ด ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋ ์ง ๋ชจ๋ฅธ๋ค๋ ์ ์ ๊ฐ์ํ์๋ ์กฐ๊ฑด์ ์ถฉ์กฑ์ํค์ง ์๋๋ค๊ณ ํ๋จํ์ฌ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ์ฃผ์ ํด์ฃผ์๋ค. ๋ฐ์ํ์ง๋ ์์์ง๋ง ์๊ฐํด ๋ณผ ๊ฑฐ๋ฆฌ๊ฐ ๋ง์, ์ข์ ํผ๋๋ฐฑ์ด์๋ค๐
6. ๋ฌด์์ ๋ฐฐ์ ๋์?
(1) ํ ์คํธ ์ฝ๋ ์์ฑ๋ฒ
์๋๋ ์กฐ๊ธ์ ์๊ณ ์์์ง๋ง @ParameterizedTest์ @ValueSource๋ฅผ ํตํด ํ๋์ ๋ฉ์๋๋ก ์ฌ๋ฌ ์
๋ ฅ๊ฐ์ ํ
์คํธํ๋ ๋ฐฉ๋ฒ์ ์ด๋ฒ์ ์ฒ์ ์๊ฒ ๋์๋ค. ์ง๋ ์ฃผ์ฐจ์๋ ํ
์คํธ ์ฝ๋๋ฅผ ๋์ค์ ์์ฑํ๋๋ฐ, ํ
์คํธ ๊ฒฐ๊ณผ์ ๋ง์ถฐ ์๊ตฌ์ฌํญ์ ๋ณ๊ฒฝํ๊ณ ์ถ์ด์ง๊ธธ๋ ์ด๋ฒ์๋ ์๊ตฌ์ฌํญ์ ๋ช
ํํ๊ฒ ์ ์ํ๊ณ ๋น์ฆ๋์ค ๋ก์ง ์์ฑ๊ณผ ๋์์ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
ํ
์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๊ณ ๋๋ ์ฅ์ ์ ์ฝ๋ ๋ฆฌํฉํ ๋ง ์์๋ ํ
์คํธ๋ฅผ ์คํํ์ฌ ๋ณ๊ฒฝ๋ ์ฝ๋๊ฐ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ๋์ง ํ์ธํ ์ ์๋ค๋ ์ ์ด์๋ค. ๋จ์ ์ ๋ฆฌํฉํ ๋ง ๋ ํ
์คํธ ์ฝ๋๋ ์๋ณธ ํด๋์ค๋ฅผ ๋ฐ๋ผ ํจ๊ป ๋ณ๊ฒฝํด์ผ ํด์ ์ข ๋ฒ๊ฑฐ๋ก์ ๋ค๋๊ฑฐ...๐ ๊ทธ์น๋ง ๋จ์ ์ ๋นํด ์ฅ์ ์ด ํฐ ๊ฒ ๊ฐ์์ ์์ผ๋ก๋ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ฑฐ์ ๋์์ ์์ฑํด๋ณผ ์๊ฐ์ด๋ค ๐
(2) ์ผ๊ธ ์ปฌ๋ ์ ์ฌ์ฉ๋ฒ
์๋์ฐจ ๋ชฉ๋ก์ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ๊น..! ํ๋ค๊ฐ ์ผ๊ธ ์ปฌ๋ ์ ์ ์ฌ์ฉํด๋ดค๋ค. ์ฌ์ฉ ์๊ฐ์ ๋๋ง์กฑ~! Game์์ ์ง์ ์๋์ฐจ ๋ฆฌ์คํธ๋ฅผ ๊ด๋ฆฌํ ๋๋ ์ฐ์น์๋ Game์์ ๋ฝ์์ผ ํ๋ค. ํ์ง๋ง ์ผ๊ธ ์ปฌ๋ ์ ๊ฐ์ฒด๋ก ๋ถ๋ฆฌํ๊ณ ๋๋, ์๋์ฐจ ๋ชฉ๋ก๊ณผ ๊ด๋ จ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ ๋ถ Cars์์ ์ฒ๋ฆฌํ ์ ์์ด์ Game ํด๋์ค๊ฐ ํ๊ฒฐ ๊ฐ๋ฒผ์์ก๋ค. ๋ ๋ฐํ ์์๋ ๋ถ๋ณ ๋ฆฌ์คํธ๋ก ๋ฐํํด์ ์ธ๋ถ์์ ๋ฆฌ์คํธ์ ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฑธ ๋ฐฉ์งํ ์๋ ์์ด์ ์์ฃผ ์ ์ฉํ๋ค. unmodifiableList์ ๋ํด์๋ ์กฐ๊ธ ๋ ์๊ฐํด๋ด์ผ ํ ๊ฒ ๊ฐ์ง๋ง...๐ฅน
(3) ์ธ์ static์ผ๋ก ์ ์ธํด์ผ ํ ๊น?
์ฌ์ค ์ง๊ธ๊น์ง๋ static์ ๋๋์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์๋๋ฐ ์ด๋ฒ ๊ธฐํ์ static ์ฌ์ฉ์ ๋ํด ๋ช ํํ ๊ธฐ์ค์ ์ ๋ฆฌํ ์ ์์๋ค. ์ด ๊ธฐ์ค์ด ์ณ์์ง ๊ทธ๋ฅธ์ง์๋ ๋ณ๊ฐ๋ก ๋์ ์๊ฐ๊ณผ ๊ธฐ์ค์ด ์๊ฒผ๋ค๋ ์ ์ ๊ธ์ ์ ์ธ ๋ณํ๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๐ static์ ๊ฐ๋ ์ ๋ํด์๋ ๋์๋ณผ ์ ์์๋ ์ข์ ๊ธฐํ๋ผ๊ณ ์๊ฐํ๋ค.
์ด์งธ ์ ์ ํ๊ณ ๊ฐ ๊ธธ์ด์ง๋ ๊ฒ ๊ฐ์๋ฐ... ์ด์ฐจํผ ์๊ฐ์ด ์ง๋๋ฉด ๋จ๋ ๊ฑด ๊ธฐ๋ก๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ์ต๋ํ ๋ง์ ๊ฒ์ ๋ด์ผ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
์๋ฌด๋ฆฌ ์๊ฐํด๋ ์ฐํ ์ฝ ๋ฏธ์ ์ ์ ์ถ์ด ์์์ด๊ณ ๋ฆฌํฉํ ๋ง๊ณผ ํ๊ณ ์์ฑ๊น์ง๊ฐ ์ง์ง ๋์ธ๊ฒ๊ฐ๋ค๐ ํ๋ค์ง๋ง ์ด์ ์ ๋ฐ ์ง๋ฌ์ผ๋๊น ๋ค์์ฃผ ๋ฏธ์ ๋ ํ์ดํ ...๐ซ
'๐๐๐ฏ๐ข๐๐ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ฆฌ์ฝ์ค 3์ฃผ์ฐจ ํ๊ธฐ: getter ์ง์ํด์ผ ํ๋๊ฑฐ ์์ง๋ง ๋๋ฌด ํธ๋ฆฌํด์ (0) | 2024.11.11 |
---|---|
ํ๋ฆฌ์ฝ์ค 1์ฃผ์ฐจ ํ๊ธฐ: ์์กด์ฑ ์ฃผ์ ํด์ฃผ์ค ์คํ๋ง ๊ตฌํจ (1) | 2024.10.25 |
์์ธ ์คํฐ๋ ํฌ๋ฃจ ๋ฐํํ ํ๊ธฐ (3) | 2024.09.21 |
[์ฑ ] ๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด ๋ฆฌ๋ทฐ (2) | 2024.09.14 |
[์ฑ ] Clean Code(ํด๋ฆฐ ์ฝ๋) ๋ฆฌ๋ทฐ (0) | 2024.07.10 |
ํ๋ฆฌ์ฝ์ค 2์ฃผ์ฐจ๊ฐ ์ง๋๊ฐ๋ค. ์ด๋ฒ ์ฃผ์ฐจ์๋ ํ ์คํธ ์ฝ๋๊น์ง ์์ฑํด์ผ ํด์ ์กฐ๊ธ ํ๋ค์์ง๋ง ๊ทธ๋งํผ ์ข์ ๊ฒฝํ์ด์๋ค.
๋ฆฌํฉํ ๋ง๊น์ง ๋๋ง์น ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค. ์ง๋ ์ฃผ์ฐจ์ ๋นํด ํด๋์ค์ ์๊ฐ ๋ง์์ง๊ฒ ๋์ ๋๋ค๐

๊ทธ๋ผ ์ด๋ฒ ์ฃผ์ฐจ ํ๊ณ ๋ ์์~! แ( แ )แ
1. ๋๋ค๊ฐ ํ ์คํธ๋ ์ด๋ป๊ฒ ํด์ผํ ๊น?
2์ฃผ์ฐจ ๋ฏธ์ ์์ ๊ฐ์ฅ ์ด๋ ค์ ๋ ์ ์ด์๋ค. 0~9 ์ฌ์ด์ ์๋ฅผ ๋ฌด์์๋ก ๋ฝ์ 4 ์ด์์ด๋ฉด ์ฐจ๊ฐ ์ ์งํ๋ ๋ฐฉ์์ด์๋๋ฐ, ์๊ตฌ์ฌํญ์ ํ ์คํธ ์ฝ๋ ๊ตฌํ๊น์ง ์์๋ค๐ฅน ๋๋ค๊ฐ์ ์ปจํธ๋กคํ ์ ์๋ ๋ถ๋ถ์ด๋ผ ํ ์คํธ๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํด์ผ ํ๋ ๊ณ ๋ฏผํ๋๋ฐ, ๊ฒฐ๊ตญ Car.move() ๋ฉ์๋์์ ๋๋ค ํจ์๋ฅผ ์ง์ ํธ์ถํ์ง ์๊ณ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ์ ์ ๋ฌ๋ฐ๋ ํ์์ผ๋ก ๋จ์ ํ ์คํธ๋ฅผ ์งํํ๋ค.
public Car {
public void move(int power) {
if (power >= POWER_THRESHOLD) {
this.distance++;
}
}
}
public CarTest {
@ParameterizedTest
@ValueSource(ints = {4, 6, 9})
void ๋ฌด์์๋ก_๋ฝ์_๊ฐ์ด_4_์ด์์ด๋ฉด_์ ์งํ๋ค(int value) {
car.move(value);
assertThat(car.getDistance()).isEqualTo(3);
}
}
๊ทธ๋ฐ๋ฐ ๋์ค์ ์ฐพ์๋ณด๋ NumberUtil ์์ ์ธํฐํ์ด์ค๋ก ์ ์ธํ๊ณ , ๊ตฌํ์ฒด๋ฅผ ๊ฐ์๋ผ์ฐ๋ ๋ฐฉ์์ผ๋ก๋ ํ ์คํธ๋ฅผ ์งํํ ์ ์์๋ค.
public interface NumberUtil {
public int getNumber();
}
public class Car {
// ์ค๋ต
private final String name;
private int distance;
private final NumberUtil numberUtil;
// ์ค๋ต
public void move() {
int power = numberUtil.getNumber();
if (power >= POWER_THRESHOLD) {
this.distance++;
}
}
}
class CarTest {
@ParameterizedTest
@ValueSource(ints = {4, 6, 9})
void ๋ฌด์์๋ก_๋ฝ์_๊ฐ์ด_4_์ด์์ด๋ฉด_์ ์งํ๋ค(int value) {
Car car = new Car("pobi", () -> value);
car.move();
assertThat(car.getDistance()).isEqualTo(3);
}
}
๊ธฐ์กด ๋ฐฉ์์ ์ธ๋ถ์์ ๋งค๋ฒ RandomUtil์ ์ด์ฉํด Car์๊ฒ ํ์ํ ์ซ์๋ฅผ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค. ํ์ง๋ง ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ Car ๊ฐ์ฒด๊ฐ ์ง์ ์ซ์๋ฅผ ์์ฑํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ์์ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค๋ ์ ์์ ์ข ๋ ์์ง๋๊ฐ ๋์์ก๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ค์ ๋๋ค๊ฐ์ ๋ฝ๋ ๋ฐฉ์์ด ๋ณ๊ฒฝ๋์ด๋, ๊ตฌํ์ฒด๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ๋ฒ์ด ์ ์ฐ์ฑ ์ธก๋ฉด์์ ๋ ๋์๊ฒ๊ฐ๋ค๐
2. ์ ๋ ฅ๊ฐ ๊ฒ์ฆ ์ฑ ์์ ์ด๋์ ๋ฌ์ผ ํ ๊น?
์ฒ์์๋ InputValidator์์ ์ ๋ ฅ๊ฐ์ ๊ฒ์ฆํ๋ค. ๊ทธ๋ฐ๋ฐ ์๊ตฌ์ฌํญ์ ํ๋ ๋ ๊ตฌํํ๋ค ๋ณด๋ InputValidator๊ฐ ์ ์ ๋ฌด๊ฑฐ์์ก๋ค. ์๋์ฐจ๋ช ๋ ๊ฒ์ฆํด์ผ ํ๊ณ , ์๋์ฐจ ๋ชฉ๋ก๋ ๊ฒ์ฆํด์ผ ํ๊ณ , ์๋ ํ์๋ ๊ฒ์ฆํด์ผ ํ๊ณ ... ๊ฒ์ฆ ์กฐ๊ฑด์ด๋ ๊ฒ์ฆ ๋์์ด ์ถ๊ฐ๋๋ฉด ํด๋์ค๊ฐ ๋์ฑ ๋ฌด๊ฑฐ์์ง ๊ฒ์ด๋ผ๋ ์๊ฐ์ ๊ฒ์ฆ ์ฑ ์์ ๊ฐ ๋๋ฉ์ธ ๊ฐ์ฒด๋ก ์ด๋ํ๋ค.
public Car(String name) {
this.name = validateCarName(name);
this.distance = 0;
}
private static String validateCarName(String name) {
validateNotNull(name);
validateNotBlank(name);
name = name.strip();
validateNameLength(name);
return name;
}
private static void validateNameLength(String name) {
if (name.length() < MIN_CAR_NAME_LENGTH || name.length() > MAX_CAR_NAME_LENGTH) {
throw new IllegalArgumentException(
String.format(INVALID_LENGTH_RANGE_CAR_NAME.getMessage(),
MIN_CAR_NAME_LENGTH, MAX_CAR_NAME_LENGTH, name));
}
}
private static void validateNotBlank(String name) {
if (name.isBlank()) {
throw new IllegalArgumentException(BLANK_CAR_NAME.getMessage());
}
}
private static void validateNotNull(String name) {
if (name == null) {
throw new IllegalArgumentException(NULL_CAR_NAME.getMessage());
}
}
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ๋๋ฉด Car ๊ฐ์ฒด๋ฅผ ์์ํ์ ๋ ๊ฒ์ฆ ๋ก์ง๊น์ง ํจ๊ป ์์๋๋ค๊ณ ํ๋ค๐ฑ ๋น์ฐํ ๊ฑด๋ฐ ์ ์๊ฐ์ ๋ชปํ์๊น...๐ฅน
์ฌ์ง์ด static ๋ฉ์๋๋ก ์ ์ธํ๋ ๋ฐ๋์ ์ค๋ฒ๋ผ์ด๋ฉ๋ ๋ถ๊ฐ๋ฅํ ๋์ชฝ๊ฐ์ ๋ฉ์๋๊ฐ ๋์ด๋ฒ๋ ธ๋ค ^_ใ
Car ๊ฐ์ฒด์์๋ ์กธ์ง์ ์ ๋ ฅ๊ฐ ๊ฒ์ฆ์ด๋ผ๋ ์ฑ ์๊น์ง ์ง๊ฒ ๋์๋ค. ๊ทธ๋์ ๋ฆฌํฉํ ๋ง ๋ ์ด ๋ถ๋ถ์ ์์ ํ๋๋ฐ ์์ธํ ๋ด์ฉ์ ํ์ ..!
3. ์ถ๋ ฅ์ ๋ฐ๋์ OutputHandler์ ๋ฃ์ด์ผ ํ ๊น?
public class InputHandler {
public List<String> getCarNames() {
System.out.println(CAR_NAME_INPUT_MESSAGE.getMessage());
String input = Console.readLine();
return Arrays.stream(input.split(DELIMITER)).toList();
}
public Integer getRoundSize() {
System.out.println(ROUND_SIZE_INPUT_MESSAGE.getMessage());
String input = Console.readLine();
validateRoundSize(input);
return Integer.parseInt(input);
}
}
์ง๋ ์ฃผ์ฐจ์์ ์ฐจ์ด์ ! ์ง๋ ์ฃผ์๋ ์ถ๋ ฅ์ ์ ๋ถ OutputHandler์์ ๊ด๋ฆฌํ๋๋ฐ, ์ด๋ฒ์ ์ ๋ ฅ์ ๋ฃ์ด๋ฌ๋ผ๋ ๋ฉ์ธ์ง๋ InputHandler์์ ํธ์ถํ๋คโจ
์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๊ฐ์ฅ ํฐ ์ด์ ๋ INPUT_MESSAGE ์ถ๋ ฅ์ OutputHandler์ ๋ฉ์๋๋ก ๋ถ๋ฆฌํ ๊ฒฝ์ฐ, ํด๋น ๋ฉ์ธ์ง๊ฐ ๋จ๋ ์ผ๋ก ์ถ๋ ฅ๋ ์ ์๋ค๋ ์ ์ด์๋ค. INPUT_MESSAGE๋ฅผ ์ถ๋ ฅํ๊ณ ์ ๋ ฅ์ ์๋ฐ๋๋ค๋ฉด? ์ง๊ธ์ด์ผ ๋ ํผ์ ๊ฐ๋ฐํ๋๊น ํท๊ฐ๋ฆฌ์ง ์๊ฒ ์ง๋ง ๊ฐ๋ฐ ๋ด๋น ์ธ์์ด ๋์ด๋๋ฉด ์ด๋ป๊ฒ ๋ ์ง ๋ชจ๋ฅด๋ ์ผ์ด๋ค.
๋ ๋ ผ๋ฆฌ์ ์ธ ํ๋ฆ ์ InputHandler์์๋ ์ด ์ ๋์ ๋ฉ์ธ์ง๋ฅผ ๋์ฐ๋ ๊ฑด ์ด์ํ์ง ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ด๋ฒ์๋ ์ ๋ ฅ๊ฐ์ ๋ฃ์ด๋ฌ๋ผ๋ ์ถ๋ ฅ์ InputHandler์ ์์น์์ผฐ๋ค.
4. ์ฝ๋๋ฆฌ๋ทฐ ๋ฐ์ํ๊ธฐ
์ด๋ฒ ์ฃผ์ฐจ์๋ ์ฉ๊ธฐ๋ด์ ๊ธ์ ์ฌ๋ ค๋ดค๋๋ฐ, ๋ ๊น๋นกํ๋ ์ฌ์ด์ ์์ฒญ ๋ง์ ๋ถ๋ค์ด ์์ฃผ์ ์ ๊น์ง ๋๋๋ค. ๋์ถํ ๊ณณ์ ๊ทํ ๋ถ๋ค์ด...๐ฅน ๊ทํ ๋ถ๋ค์ ํผ๋๋ฐฑ์ ๋ชจ์ ๋ฐ์ํด๋ณด๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
๋จผ์ ๋ฆฌ๋ทฐ์ด๋ถ๋ค๊ป์ ๋จ๊ฒจ์ฃผ์ ๊ธ์ ์ ์ธ ํผ๋๋ฐฑ์ ์๋์ ๊ฐ์๋ค. ๋๋ฆ ์ ๊ฒฝ์ผ๋ ๋ถ๋ถ์ธ๋ฐ ๊ท์ ๊ฐ์ด ์์๋ด ์ฃผ์๋ ๊ธฐ๋ถ์ ์ข๋ค์ฉ๐
- ์ฐธ์ฌ ์๋์ฐจ ๊ฐ์์, ์ต๋ ์๋ ํ์๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์ ํํ ์ ์ด ์ข๋ค.
- @BeforeEach, @ParameterizedTest ๋ฑ ์ ์ ํ ํ ์คํธ ์ด๋ ธํ ์ด์ ์ ํ์ฉํ ์ ์ด ์ข๋ค.
- ์ผ๊ธ ์ปฌ๋ ์ ์ฌ์ฉ ์, ๋ฆฌํดํ ๋ ๋ฆฌ์คํธ ์๋ณธ์ด ์๋ unmodifiableList()๋ก ํ๋ฒ ๊ฐ์ธ์ ๋ฐํํ ๊ฒ์ด ์ข๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ์๊ฐํด๋ณผ๋งํ ํผ๋๋ฐฑ์ ์๋์ ๊ฐ์๋ค.
(1) Rounds์์ ์ถ๋ ฅ๊น์ง ๋ด๋นํ๊ณ ์์ด์.
public class Rounds {
private final Integer roundSize;
public void proceedRounds(List<Car> cars, OutputHandler outputHandler) {
for (int i = 0; i < roundSize; i++) {
List<String> roundResult = processRound(cars);
outputHandler.printRoundResult(roundResult);
}
}
}
Rounds ๊ฐ์ฒด๋ ์๋ ํ์๋ฅผ ๊ด๋ฆฌํ๊ณ , ์๋ ํ์๋งํผ ๋ผ์ด๋๋ฅผ ์งํ์ํค๋ ํด๋์ค์ด๋ค. ๋งค ๋ผ์ด๋๊ฐ ๋๋ ๋๋ฉด OutputHandler๋ฅผ ํธ์ถํด์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋๋ฐ, ๋๋ฉ์ธ ๋ชจ๋ธ์์ ์ถ๋ ฅ๊น์ง ๋ด๋นํ๊ณ ์๋๊ฒ๊ฐ๋ค๋ ์๊ฒฌ์ ๋ฐ์๋ค.
์๊ฐํด๋ณด๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํด์ผ ํ๋ Rounds ๊ฐ์ฒด์์ OutputHandler๋ฅผ ์ง์ ํธ์ถํ๋ ๊ฒ์ ์ข์๋ณด์ด์ง ์์๋ค. ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ฌ๋ฌ ๊ตฐ๋ฐ์์ ์ฌ์ฌ์ฉํ ์ ์์ด์ผ ํ๋๋ฐ ์ถ๋ ฅ์ ์ง์ ๋ด๋นํ๋ค ๋ณด๋ ๊ทธ๊ฒ ์ด๋ ค์์ง๊ณ , OutputHandler๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ Rounds๋ ์ํฅ์ ๋ฐ์ ์ํ์ด ์์๊ธฐ ๋๋ฌธ์ด๋ค.
public List<List<String>> proceedRounds(List<Car> cars) {
List<List<String>> result = new ArrayList<>();
for (int i = 0; i < roundSize; i++) {
List<String> roundResult = processRound(cars);
result.add(roundResult);
}
return result;
}
๊ทธ๋์ 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๊ณ , ์ถ๋ ฅ์ Rounds.proceedRounds()๋ฅผ ํธ์ถํ๋ Game์์ ์์ ํ ๋ด๋นํ๊ธฐ๋ก ๊ฒฐ์ !
(2) Game.start() ๋ฉ์๋๊ฐ ๋๋ฌด ๋ง์ ์ฑ ์์ ์ง๊ณ ์์ด์.
public void start() {
List<String> carNames = inputHandler.getCarNames();
cars = new Cars(carNames);
String roundSizeInput = inputHandler.getRoundSize();
rounds = new Rounds(roundSizeInput);
outputHandler.printResultMessage();
rounds.proceedRounds(cars.getCars(), outputHandler);
List<String> winners = cars.getWinners();
outputHandler.printWinner(winners);
}
Game.start()๊ฐ ์กฐ๊ธ ๋ฑ๋ฑํ๋ค ์ถ๊ธด ํ๋๋ฐ ์ญ์๋ ์ฝ๋๋ฆฌ๋ทฐ์์ ๋น์ทํ ์๊ฒฌ์ ๋ฐ์๋ค๐ ๋ณ๋ ๋ฉ์๋๋ก ๋ถ๋ฆฌํด๋ดค์ ํธ์ถ ๋์ค๋ง ๊น์ด์ง ๊ฒ ๊ฐ์์ ๋ฐ๋ก ๋ถ๋ฆฌํ์ง๋ ์์๋๋ฐ... ์ด์ ๋ณด๋ ๋ถ๋ฆฌํ๋๊ฒ ๋์ ๊ฒ ๊ฐ์์ ๋ถ๋ฆฌ ๊ฒฐ์ .
public void start(NumberUtil numberUtil) {
getUserInputs(numberUtil);
processRounds();
announceWinner();
}
private void getUserInputs(NumberUtil numberUtil) {
List<String> carNames = inputHandler.getCarNames();
cars = new Cars(carNames, numberUtil);
Integer roundSize = inputHandler.getRoundSize();
rounds = new Rounds(roundSize);
}
private void processRounds() {
outputHandler.printResultMessage();
List<List<String>> roundResult = rounds.proceedRounds(cars.getCars());
roundResult.stream().forEach(result -> outputHandler.printRoundResult(result));
}
private void announceWinner() {
List<String> winners = cars.pickWinners();
outputHandler.printWinner(winners);
}
๊ทธ๋ฐ๋ฐ ์ด๋ฐ๋ค๊ณ start() ๋ฉ์๋์ ์ฑ ์์ด ์ค์ด๋๋ ๊ฑธ๊น? ๋ผ๋ ์๊ฐ์ด ๋ ๋ค. ๋จ์ํ ๋ฉ์๋๋ง ๋ถ๋ฆฌํ์ ๋ฟ์ธ๋ฐ? ์ฌ์ ํ start() ๋ฉ์๋๋ ์ ๋ ฅ๊ฐ์ ๋ฐ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , ๋ผ์ด๋ ์งํ ๋ฉ์๋๋ ํธ์ถํ๊ณ , ์ฐ์น์ ๋ฐํ ๋ฉ์๋๊น์ง ํธ์ถํ๊ณ ์๋ค. ์ด๊ฑธ ์ฑ ์์ด ์ค์ด๋ค์๋ค๊ณ ๋ณผ ์ ์์๊น..?๐ค
์ ํด๋์ค๋ฅผ ์์ฑํด์ ์ฑ ์์ ๋ถ๋ฆฌํ ๊น ํ๋๋ฐ ์์ง ๊ทธ๋ด ๋จ๊ณ๊น์ง ์๋ ๊ฒ ๊ฐ์์ ๊ทธ๋ฅ ๋์์ง๋ง ์ ์ง ์ฐ์ฐํ๋ค๐ ์ด ๋ถ๋ถ์ ๋ํด์๋ ์กฐ๊ธ ๋ ๊ณ ๋ฏผํด๋ณผ ์์ .
(3) ์ ์ ์ ํธ๋ฆฌํฐ ํด๋์ค์ธ๋ฐ ์์ฑ์ ๋ณดํธ๊ฐ ๋์ด์์ง ์์์.
public class RandomUtil {
private static final int MIN_VALUE = 0;
private static final int MAX_VALUE = 10;
public static int getRandomNumber() {
return Randoms.pickNumberInRange(MIN_VALUE, MAX_VALUE);
}
}
์์ ํ ๋์น ๋ถ๋ถ โงโบโ( แตฬดฬถฬทฬฅฬ ยทฬซ แตฬดฬถฬทฬฃฬฅฬ ) ๋ฆฌํฉํ ๋ง ๊ณผ์ ์์ RandomUtil ํด๋์ค๋ ์ ์ ์ ํธ๋ฆฌํฐ ํด๋์ค์์ ๋ฒ์ด๋ RandomNumberUtil์ด๋ผ๋ ๊ตฌํ์ฒด๊ฐ ๋์์ง๋ง ์๋ฏธ์๋ ํผ๋๋ฐฑ์ด์๋ค... ๋ค์์๋ ๊น๋จน์ง ๋ง์.
(4) ๋๋ฉ์ธ ๊ฐ์ฒด ํด๋์ค์ ์ฑ ์์ด ๋๋ฌด ๋ง์์. ๊ฒ์ฆ์ ๋ณ๋ ํด๋์ค๋ก ๋ถ๋ฆฌํ๋ ๊ฒ ์ข์๋ณด์ฌ์.
public class InputHandler {
private static final String DELIMITER = ",";
public List<String> getCarNames() {
System.out.println(CAR_NAME_INPUT_MESSAGE.getMessage());
String input = Console.readLine();
List<String> names = Arrays.stream(input.split(DELIMITER)).toList();
CarsValidator.validateCars(names);
names.stream().forEach(CarNameValidator::validateCarNames);
return names.stream()
.map(String::strip)
.toList();
}
}
๋ฏธ์ ์ ์ํํ๋ฉฐ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ๊ณผ ์ด์ด์ง๋ ํผ๋๋ฐฑ์ด์๋ค. ๋ค๋ฅธ ๋ถ๋ค ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํ๋ค ๋ณด๋ ๋๋ฉ์ธ ๊ฐ์ฒด๋ณ๋ก Validator ํด๋์ค๋ฅผ ๋ง๋์ ๋ถ๋ค์ด ๊ณ์ ์ ๋๋ ๊ฐ ๋๋ฉ์ธ๋ณ๋ก ๊ฒ์ฆ ํด๋์ค๋ฅผ ์์ฑํ์ฌ ๋ฉ์๋๋ฅผ ์ด๋์์ผฐ๋ค. ์ด๋ ๊ฒ ํ๋ ๊ฐ ํด๋์ค๋ณ๋ก ์ฑ ์์ด ๋ช ํํด์ ๋ง์กฑ์ค๐
5. ๋ฐ์ํ์ง ์์ ์ฝ๋๋ฆฌ๋ทฐ
InputHandler์ OutputHandler๋ฅผ staticํ ํ์ง ์๊ณ ์ธ์คํด์คํํ ์ด์ ๊ฐ ์๋์?
์ด ๋ถ๋ถ์ ๋๋ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ธ๋ฐ ๋๋ง์นจ ์ฝ๋๋ฆฌ๋ทฐ์ ๋น์ทํ ์ง๋ฌธ์ด ๋ฌ๋ ค์ ๋ด ์๊ฐ์ ์ ๋ฆฌํด๋ดค๋ค. ๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด ๋๋ static์ ๊ฐ์ฒด์งํฅ๊ณผ ๋ฉ๋ฆฌ ์๋ ๊ฐ๋ ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
static ํจ์๋ ํด๋์ค ๋ ๋ฒจ์ ์ ์ธ๋๋ค. ์ด ๋ง์ธ ์ฆ์จ ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ธฐ ์ ๋ถํฐ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ณ์ ์กด์ฌํ๊ณ , ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ์์ ๋ฒ์ด๋ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ทธ๋์ ์ธ์คํด์ค ์์ฑ ์์ด ํธ์ถํ ์ ์๊ณ , ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค. (์ค๋ฒ๋ผ์ด๋ฉ์ ์ฌ์ฉํ๋ฉด ํธ์ถํ ๋ฉ์๋๊ฐ ๋ฐํ์ ์์ ์ ๊ฒฐ์ ๋๋๋ฐ, static ํจ์๋ ์ปดํ์ผ ์์ ์ ํธ์ถ์ด ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ด๋ค.)
์ด๋ฌํ ์ด์ ๋ก ๋๋ ์๋์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํน๋ณํ ๊ฒฝ์ฐ์๋ง static์ ์ฌ์ฉํ๋ค.
- ๊ฐ์ฒด์ ์ํ๊ฐ๊ณผ ๋ฌด๊ดํ๊ฒ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฉฐ
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์ ์ผ๋ก ํธ์ถ๋์ด ๋ฉ๋ชจ๋ฆฌ ์์ ๊ณ์ ์กด์ฌํ ํ์๊ฐ ์์ผ๋ฉฐ
- ์ค๋ฒ๋ผ์ด๋ฉ์ ํตํ ํ์ฅ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋ฎ์ ๋
์ ์ถ๋ ฅ๊ฐ ํธ๋ค๋ฌ์ ๊ฒฝ์ฐ (1)์ ์กฐ๊ฑด์ ๋ง์กฑํ์ง๋ง (2) ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์ด ์๋ Game์์๋ง ํธ์ถ๋๋ค. (3)์ ๊ฒฝ์ฐ๋ ์ง๊ธ์ ์ฝ์์์ ์ ๋ ฅ์ ๋ฐ๊ณ ์์ง๋ง, ์๊ตฌ์ฌํญ์ด ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋ ์ง ๋ชจ๋ฅธ๋ค๋ ์ ์ ๊ฐ์ํ์๋ ์กฐ๊ฑด์ ์ถฉ์กฑ์ํค์ง ์๋๋ค๊ณ ํ๋จํ์ฌ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ์ฃผ์ ํด์ฃผ์๋ค. ๋ฐ์ํ์ง๋ ์์์ง๋ง ์๊ฐํด ๋ณผ ๊ฑฐ๋ฆฌ๊ฐ ๋ง์, ์ข์ ํผ๋๋ฐฑ์ด์๋ค๐
6. ๋ฌด์์ ๋ฐฐ์ ๋์?
(1) ํ ์คํธ ์ฝ๋ ์์ฑ๋ฒ
์๋๋ ์กฐ๊ธ์ ์๊ณ ์์์ง๋ง @ParameterizedTest์ @ValueSource๋ฅผ ํตํด ํ๋์ ๋ฉ์๋๋ก ์ฌ๋ฌ ์
๋ ฅ๊ฐ์ ํ
์คํธํ๋ ๋ฐฉ๋ฒ์ ์ด๋ฒ์ ์ฒ์ ์๊ฒ ๋์๋ค. ์ง๋ ์ฃผ์ฐจ์๋ ํ
์คํธ ์ฝ๋๋ฅผ ๋์ค์ ์์ฑํ๋๋ฐ, ํ
์คํธ ๊ฒฐ๊ณผ์ ๋ง์ถฐ ์๊ตฌ์ฌํญ์ ๋ณ๊ฒฝํ๊ณ ์ถ์ด์ง๊ธธ๋ ์ด๋ฒ์๋ ์๊ตฌ์ฌํญ์ ๋ช
ํํ๊ฒ ์ ์ํ๊ณ ๋น์ฆ๋์ค ๋ก์ง ์์ฑ๊ณผ ๋์์ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
ํ
์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๊ณ ๋๋ ์ฅ์ ์ ์ฝ๋ ๋ฆฌํฉํ ๋ง ์์๋ ํ
์คํธ๋ฅผ ์คํํ์ฌ ๋ณ๊ฒฝ๋ ์ฝ๋๊ฐ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ๋์ง ํ์ธํ ์ ์๋ค๋ ์ ์ด์๋ค. ๋จ์ ์ ๋ฆฌํฉํ ๋ง ๋ ํ
์คํธ ์ฝ๋๋ ์๋ณธ ํด๋์ค๋ฅผ ๋ฐ๋ผ ํจ๊ป ๋ณ๊ฒฝํด์ผ ํด์ ์ข ๋ฒ๊ฑฐ๋ก์ ๋ค๋๊ฑฐ...๐ ๊ทธ์น๋ง ๋จ์ ์ ๋นํด ์ฅ์ ์ด ํฐ ๊ฒ ๊ฐ์์ ์์ผ๋ก๋ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ฑฐ์ ๋์์ ์์ฑํด๋ณผ ์๊ฐ์ด๋ค ๐
(2) ์ผ๊ธ ์ปฌ๋ ์ ์ฌ์ฉ๋ฒ
์๋์ฐจ ๋ชฉ๋ก์ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ๊น..! ํ๋ค๊ฐ ์ผ๊ธ ์ปฌ๋ ์ ์ ์ฌ์ฉํด๋ดค๋ค. ์ฌ์ฉ ์๊ฐ์ ๋๋ง์กฑ~! Game์์ ์ง์ ์๋์ฐจ ๋ฆฌ์คํธ๋ฅผ ๊ด๋ฆฌํ ๋๋ ์ฐ์น์๋ Game์์ ๋ฝ์์ผ ํ๋ค. ํ์ง๋ง ์ผ๊ธ ์ปฌ๋ ์ ๊ฐ์ฒด๋ก ๋ถ๋ฆฌํ๊ณ ๋๋, ์๋์ฐจ ๋ชฉ๋ก๊ณผ ๊ด๋ จ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ ๋ถ Cars์์ ์ฒ๋ฆฌํ ์ ์์ด์ Game ํด๋์ค๊ฐ ํ๊ฒฐ ๊ฐ๋ฒผ์์ก๋ค. ๋ ๋ฐํ ์์๋ ๋ถ๋ณ ๋ฆฌ์คํธ๋ก ๋ฐํํด์ ์ธ๋ถ์์ ๋ฆฌ์คํธ์ ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฑธ ๋ฐฉ์งํ ์๋ ์์ด์ ์์ฃผ ์ ์ฉํ๋ค. unmodifiableList์ ๋ํด์๋ ์กฐ๊ธ ๋ ์๊ฐํด๋ด์ผ ํ ๊ฒ ๊ฐ์ง๋ง...๐ฅน
(3) ์ธ์ static์ผ๋ก ์ ์ธํด์ผ ํ ๊น?
์ฌ์ค ์ง๊ธ๊น์ง๋ static์ ๋๋์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์๋๋ฐ ์ด๋ฒ ๊ธฐํ์ static ์ฌ์ฉ์ ๋ํด ๋ช ํํ ๊ธฐ์ค์ ์ ๋ฆฌํ ์ ์์๋ค. ์ด ๊ธฐ์ค์ด ์ณ์์ง ๊ทธ๋ฅธ์ง์๋ ๋ณ๊ฐ๋ก ๋์ ์๊ฐ๊ณผ ๊ธฐ์ค์ด ์๊ฒผ๋ค๋ ์ ์ ๊ธ์ ์ ์ธ ๋ณํ๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๐ static์ ๊ฐ๋ ์ ๋ํด์๋ ๋์๋ณผ ์ ์์๋ ์ข์ ๊ธฐํ๋ผ๊ณ ์๊ฐํ๋ค.
์ด์งธ ์ ์ ํ๊ณ ๊ฐ ๊ธธ์ด์ง๋ ๊ฒ ๊ฐ์๋ฐ... ์ด์ฐจํผ ์๊ฐ์ด ์ง๋๋ฉด ๋จ๋ ๊ฑด ๊ธฐ๋ก๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ์ต๋ํ ๋ง์ ๊ฒ์ ๋ด์ผ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
์๋ฌด๋ฆฌ ์๊ฐํด๋ ์ฐํ ์ฝ ๋ฏธ์ ์ ์ ์ถ์ด ์์์ด๊ณ ๋ฆฌํฉํ ๋ง๊ณผ ํ๊ณ ์์ฑ๊น์ง๊ฐ ์ง์ง ๋์ธ๊ฒ๊ฐ๋ค๐ ํ๋ค์ง๋ง ์ด์ ์ ๋ฐ ์ง๋ฌ์ผ๋๊น ๋ค์์ฃผ ๋ฏธ์ ๋ ํ์ดํ ...๐ซ
'๐๐๐ฏ๐ข๐๐ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ฆฌ์ฝ์ค 3์ฃผ์ฐจ ํ๊ธฐ: getter ์ง์ํด์ผ ํ๋๊ฑฐ ์์ง๋ง ๋๋ฌด ํธ๋ฆฌํด์ (0) | 2024.11.11 |
---|---|
ํ๋ฆฌ์ฝ์ค 1์ฃผ์ฐจ ํ๊ธฐ: ์์กด์ฑ ์ฃผ์ ํด์ฃผ์ค ์คํ๋ง ๊ตฌํจ (1) | 2024.10.25 |
์์ธ ์คํฐ๋ ํฌ๋ฃจ ๋ฐํํ ํ๊ธฐ (3) | 2024.09.21 |
[์ฑ ] ๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด ๋ฆฌ๋ทฐ (2) | 2024.09.14 |
[์ฑ ] Clean Code(ํด๋ฆฐ ์ฝ๋) ๋ฆฌ๋ทฐ (0) | 2024.07.10 |