์ถ์ฒ
https://inf.run/XKQg
ํด๋ฆฐ์ฝ๋์ ๊ฐ๋ ๊ณผ ์ฒซ ๋ฆฌํฉํ ๋ง ๊ฐ์๋ฅผ ์๊ฐํ๊ณ ๊ณผ์ ์์ ์ ์๋ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ค.
์๋๋ฅผ ํํํ๋ผ
์ฝ๋ ์์ฑ์๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ๋ด๋ ๋ช
ํํ๊ฒ ์ดํดํ ์ ์์ด์ผ ํ๋ฉฐ, ์ฝ๋์ ๋ชฉ์ ๊ณผ ๊ธฐ๋ฅ์ด ๋ช
ํํ ๋๋ฌ๋๋๋ก ๋ฉ์๋๋ช
์ด๋ ๋ณ์๋ช
์ ์ง์ด์ผ ๋๋ค.
์๊ฒ ๋ง๋ค์ด๋ผ
ํด๋์ค๋ ํจ์๋ ํ๋์ ์ฑ
์๋ง์ ๊ฐ์ ธ์ผ ํ๋ค. ์์ ๋จ์์ ์ฝ๋๋ ๊ฐ๋
์ฑ์ด ํฅ์๋๋ฉฐ, ์ฌ์ฌ์ฉ์ฑ๋ ์ฆ๊ฐํ๋ค.
์ค๋ณต ํผํ๊ธฐ
์ฝ๋ ์ค๋ณต์ ๋ฒ๊ทธ ๋ฐ์์ ์ฃผ์ ์์ธ ์ค ํ๋์ด๋ค. ์ค๋ณต ์ฝ๋๋ฅผ ํผํ๊ณ ์ค๋ณต๋ ๋ก์ง์ ํจ์๋ ํด๋์ค๋ก ์ถ์ํํ์ฌ ์ฌ์ฌ์ฉ์ฑ์ ๋์ธ๋ค.
ํด๋ฆฐ ์ฝ๋์ ์์น์ ์ ์ฉํ์ฌ ์ฝ๋๋ฅผ ์
๋ ฅ - ์คํ - ์ถ๋ ฅ
์ผ๋ก ๋๋๊ณ , ๊ฐ ๋ถ๋ถ์ ๋ด๋นํ๋ ํด๋์ค๋ค์ ๋ง๋ค์๋ค.
public class Main {
public static void main(String[] args) {
// ์
๋ ฅ
View view = new View();
int count = view.inputNumber();
// ์คํ
ResultDto resultDto = playGame(count);
// ์ถ๋ ฅ
view.printResult(resultDto);
}
private static ResultDto playGame(int count) {
Dice dice = new Dice(6);
dice.increaseBy(count);
return dice.toResultDto();
}
}
import com.group.libraryapp.study.day5.dto.DiceDto;
import com.group.libraryapp.study.day5.dto.ResultDto;
import java.util.List;
import java.util.Scanner;
public class View {
private static final String GAME_INPUT_MESSAGE = "์ซ์๋ฅผ ์
๋ ฅํ์ธ์ : ";
private static final String GAME_RESULT_MESSAGE = "%d์(๋) %d๋ฒ ๋์์ต๋๋ค.\n";
// ์ฌ์ฉ์๋ก๋ถํฐ ์ซ์๋ฅผ ์
๋ ฅ ๋ฐ๋ ๋ฉ์๋
public int inputNumber() {
System.out.print(GAME_INPUT_MESSAGE);
Scanner sc = new java.util.Scanner(System.in);
return sc.nextInt();
}
// ์ฃผ์ฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๋ฉ์๋
public void printResult(ResultDto resultDto) {
List<DiceDto> result = resultDto.result();
for (int i = 0; i < result.size(); i++) {
System.out.printf(GAME_RESULT_MESSAGE, i + 1, result.get(i).result());
}
}
}
์ด ๋ฉ์๋๋ ์ฌ์ฉ์์๊ฒ ์ซ์๋ฅผ ์
๋ ฅํ๋ผ๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ , ์ฌ์ฉ์๋ก๋ถํฐ ์
๋ ฅ๊ฐ์ ๋ฐ์์ ์ ์๋ก ๋ฐํํ๋ค.
์ซ์๋ฅผ ์
๋ ฅํ์ธ์ :
๋ผ๋ ๋ฉ์์ง๋ฅผ ์์๋ก ๋ง๋ค์ด์ ์ฝ๋์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ , ์คํ๋ฅผ ๋ฐฉ์งํ๋ค.
์ด ๋ฉ์๋๋ ์ฃผ์ฌ์๋ฅผ ๋์ ธ์ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ Dto
๋ฅผ ๋ฐ์์์ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ฌ ์ค๋ณต๋๋ ์ถ๋ ฅ ๋ถ๋ถ์ ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฆฌํ๊ณ , ์ถ๋ ฅ ๋ฉ์์ง๋ ์์๋ฅผ ํ์ฉํ์ฌ ์ฝ๋์ ๊ฐ๋
์ฑ์ ํฅ์ํ๋ค.
import com.group.libraryapp.study.day5.dto.DiceDto;
import com.group.libraryapp.study.day5.dto.ResultDto;
import java.util.ArrayList;
import java.util.List;
public class Dice {
private final int limit;
private List<Integer> numbers;
// ์์ฑ์: ์ฃผ์ฌ์์ ๊ฐ์๋ฅผ ๋ฐ์ ์ด๊ธฐํ
public Dice(int limit) {
this.limit = limit;
this.numbers = initialize(limit);
}
// ์ฃผ์ฌ์๋ฅผ ๋์ง๋ฉด, ๊ฐ ์ซ์๊ฐ ๋์จ ํ์๋ฅผ 1์ฉ ์ฆ๊ฐ
public void increaseBy(int count) {
for (int i = 0; i < count; i++) {
int num = (int) (Math.random() * 6);
int currentValue = numbers.get(num);
numbers.set(num, currentValue + 1);
}
}
// ๊ฒฐ๊ณผ๋ฅผ ResultDto๋ก ๋ณํํ๋ ๋ฉ์๋
public ResultDto toResultDto() {
return ResultDto.of(numbers);
}
private List<Integer> initialize(int limit) {
List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < limit; i++) {
numbers.add(0);
}
return numbers;
}
}
Dice ํด๋์ค์ ์์ฑ์๋ฅผ ๋ณด๋ฉด, ์ฃผ์ฌ์์ ๋ฒ์๋ฅผ ์ค์ ํ๋ ์์
์ ํ๋ค.
ํ์ฌ ์ฝ๋๋ ์ฃผ์ฌ์๊ฐ 1 ~ 6๊น์ง๋ง ์์ง๋ง, ๋์ค์ ์ฃผ์ฌ์๊ฐ 1 ~ 12 ๋๋ 1 ~ 20 ์ด๋ผ๋ limit
๊ฐ๋ง ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋๋ฏ๋ก ๋ณ๊ฒฝ ์ง์ ์ ํ๋๋ก ์ค์ผ ์ ์๊ฒ ๋์๋ค.
์ด ๋ฉ์๋๋ ์
๋ ฅ๋ ํ์(count
)๋งํผ ์ฃผ์ฌ์๋ฅผ ๋์ ธ์ ๋์จ ๊ฐ์ ๊ธฐ๋กํ๋ค.
์ฃผ์ฌ์ ๋์ง๊ธฐ๋ ๋์๋ฅผ ์ฌ์ฉํ๊ณ , ํด๋น ๋์๊ฐ ์ธ๋ฑ์ค์ธ ๋ฆฌ์คํธ์ ๊ฐ์ ๊ฐ์ ธ์์ 1์ฉ ์ฆ๊ฐ์ํค๋๋ก ํ๋ค.
์ด ๋ฉ์๋๋ numbers
๋ฅผ Dto
๋ก ๋ณํํ๋ฉฐ, View์์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ๋๋ ๋ฐ์ดํฐ๋ง ํ์ํ๋ฏ๋ก Dice ์ธ์คํด์ค๊ฐ ์๋ Dto ์ธ์คํด์ค๋ฅผ ์ถ๋ ฅํ ๋ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ๊ธฐ ์ํด ๋ง๋ค์๋ค.
ResultDto
๋ ์ฃผ์ฌ์์ ๊ฐ ์ซ์๊ฐ ๋ช ๋ฒ ๋ํ๋ฌ๋์ง์ ๋ํ ํ์๋ฅผ ๋ด์ Dto์ด๋ฉฐ, Dto๋ก ๋ณํํ๋ ๋ก์ง์ ResultDto ํด๋์ค์ ์์ฑํ๋ค.
โญ๏ธ ์ค์
View๋ ๋๋ฉ์ธ ๊ฐ์ฒด์ ์ฝ๋์ ์ง์ ์์กดํ๋ฉด ์ ๋๋ค.
์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ด๋นํ๋ View์์๋ ๋๋ฉ์ธ ๊ฐ์ฒด์ ๋ด๋ถ ์ฝ๋๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์ ๋ฌ์ Dto(Data Transfer Object)๋ฅผ ์ฌ์ฉํ๋๋ก ํ์.์๋ฅผ ๋ค์ด, ํ๋ก ํธ๋จ์์ ๋ฐฑ์๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ํ๋ฉด์ ๋ ๋๋งํ๋๋ฐ,
์ด๋ ๋ฐฑ์๋ ์๋ฒ๋ ํ์ํ ๋ฐ์ดํฐ๋ง์ ์ ๊ณตํ๊ณ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด Dto๋ฅผ ์ฌ์ฉํ๋ค.
(์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ ์ ์ก์ ๋จ์ํํ๊ณ , ๋๋ฉ์ธ ๊ฐ์ฒด์ ๋ด๋ถ๋ฅผ ์จ๊ธฐ๋ฉฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ๋ฐ์ ๋์์ด ๋๋ค.)
์ด ๋ฉ์๋๋ ๋ฆฌ์คํธ๋ฅผ ์ฃผ์ด์ง ํฌ๊ธฐ๋ก ์ด๊ธฐํํ๊ณ , ๊ฐ ์์๋ฅผ 0์ผ๋ก ์ค์ ํ๋ค.
์ฃผ์ฌ์ ๋ฒ์๋งํผ ๋ณ์๋ฅผ ๋ง๋ค ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์๋ค.
// ๊ฐ ์ฃผ์ฌ์ ์ซ์์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ Dto
public record DiceDto(int result) {}
// ์ฌ๋ฌ DiceDto๋ฅผ ํฌํจํ๋ Dto
import java.util.List;
public record ResultDto(List<DiceDto> result) {
// ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋: List<Integer>๋ฅผ ๋ฐ์ ResultDto ์์ฑ
public static ResultDto of(List<Integer> numbers) {
List<DiceDto> result = numbers.stream()
.map(DiceDto::new)
.toList();
return new ResultDto(result);
}
}
List<Integer> numbers)
์ด ๋ฉ์๋๋ ์ฃผ์ด์ง ์ ์ ๋ฆฌ์คํธ(numbers)๋ฅผ ๋ฐ์์ ๊ฐ ์ซ์๋ฅผ DiceDto๋ก ๋ณํํ ํ, ์ด๋ฅผ ๋ฆฌ์คํธ๋ก ๋ฌถ์ด ResultDto๋ฅผ ์์ฑํ๋ค.
์ฌ๋ฌ DiceDto๋ฅผ ์์ฑํ๊ณ ๋ฆฌ์คํธ๋ก ๋ฌถ๋ ๋ฐ๋ณต์ ์ธ ์์
์ ํ ๊ณณ์์ ์ฒ๋ฆฌํจ์ผ๋ก์จ ์ฃผ์ฌ์ ๋ฒ์๊ฐ ํ์ฅ๋์ด๋ ์ฝ๋์ ๋ฐ๋ณต์ ์ต์ํํ ์ ์๋ค.
ํด๋ฆฐ ์ฝ๋์ ๋ํ ๊ฐ๋
์ ์ฐพ์๋ณด๊ณ ์ฝ๋ ๋ฆฌํฉํ ๋ง์ ์งํํ๋ฉด์, ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ดํดํ๋ ๋ฐ๋ ๋
ธ๋ ฅ์ ๊ธฐ์ธ์ฌ์ผ ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
์ฝ๋ ์์ฑ๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋ด๋ ํ๋์ ์ด๋ค ๋์์ธ์ง ๊ทธ ๋์์ผ๋ก ๋ฌด์์ ํ๋์ง๋ฅผ ๋ฐ๋ก ์ ์ ์๋๋ก ๋ฉ์๋๋ช
์ด๋ ๋ณ์๋ช
์ ์ ์ง์ด์ผ ๋๊ณ , ํด๋์ค๋ ํจ์๋ 1๊ฐ์ ์ฑ
์๋ง์ ๊ฐ๊ณ ์๊ฒ ๋ง๋ค์ด์ผ ๊ฐ๋
์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ด ํฅ์๋๋ค๋ ๊ฒ๋ ์๊ฒ ๋์๋ค.
๊ฒฐ๊ตญ์ ๊ฐ๋
์ฑ์ด ๋๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์ด ์ฝ๋๋ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ ์ํ ํต์ฌ์ธ ๊ฒ ๊ฐ๋ค.
๐ ์ฐธ๊ณ ์๋ฃ
https://medium.com/@lifthus531/%ED%81%B4%EB%A6%B0-%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-%EB%A7%90%ED%95%98%EB%8A%94-%EA%B2%83%EB%93%A4-4717f8ea2229
https://www.nextree.io/basic-of-clean-code/