1. ๐ ๋ฏธ์ ์ค๋ช
2์ฃผ ์ฐจ์ ๋ฏธ์ ์ '์ซ์ ์ผ๊ตฌ ๊ฒ์'์ ๊ตฌํํ๋ ๊ฒ์ด๋ค. ์ซ์ ์ผ๊ตฌ ๊ฒ์์ ๊ธฐ๋ณธ์ ์ธ ๊ท์น์ ์๋์ ๊ฐ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก 1๋ถํฐ 9๊น์ง ์๋ก ๋ค๋ฅธ ์๋ก ์ด๋ฃจ์ด์ง 3์๋ฆฌ์ ์๋ฅผ ๋ง์ถ๋ ๊ฒ์์ด๋ค. ๊ฐ์ ์๊ฐ ๊ฐ์ ์๋ฆฌ์ ์์ผ๋ฉด ์คํธ๋ผ์ดํฌ, ๋ค๋ฅธ ์๋ฆฌ์ ์์ผ๋ฉด ๋ณผ, ๊ฐ์ ์๊ฐ ์ ํ ์์ผ๋ฉด ๋ซ์ฑ์ด ๋๊ฒ ๋๋ค.
์ ๋ต์ด 425์ธ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์. 123์ ์ ์ํ๋ฉด '1 ์คํธ๋ผ์ดํฌ', 456์ ์ ์ํ๋ฉด '1 ๋ณผ 1 ์คํธ๋ผ์ดํฌ', 789๋ฅผ ์ ์ํ๋ฉด '๋ซ์ฑ'์ ์ป๊ฒ ๋๋ค. ์ด ๊ฐ์ ๊ณผ์ ์ ๋ฐ๋ณตํด 3๊ฐ์ ์ซ์๋ฅผ ๋ชจ๋ ๋งํ ๊ฒฝ์ฐ(3 ์คํธ๋ผ์ดํฌ)์ ๊ฒ์์ด ์ข ๋ฃ๋๋ค.
์ถ๊ฐ๋ ์๊ตฌ ์ฌํญ์ ์๋์ ๊ฐ๋ค.
- indent(์ธ๋ดํธ, ๋ค์ฌ ์ฐ๊ธฐ) depth๋ฅผ 3์ด ๋์ง ์๋๋ก ๊ตฌํํ๋ค. (์๋ฅผ ๋ค์ด while๋ฌธ ์์ if๋ฌธ์ด ์์ผ๋ฉด ๋ค์ฌ ์ฐ๊ธฐ๋ 2์ด๋ค.)
- 3ํญ ์ฐ์ฐ์๋ฅผ ์ฐ์ง ์๋๋ค. (์ผํญ ์ฐ์ฐ์ → ๋ณ์ ? ๊ฐ 1 : ๊ฐ 2)
- JUnit 5์ AssertJ๋ฅผ ์ด์ฉํ์ฌ ๋ณธ์ธ์ด ์ ๋ฆฌํ ๊ธฐ๋ฅ ๋ชฉ๋ก์ด ์ ์ ๋์ํจ์ ํ ์คํธ ์ฝ๋๋ก ํ์ธํ๋ค.
2. ๐ข ๊ณตํต ํผ๋๋ฐฑ
1) README.md๋ฅผ ์์ธํ ์์ฑํ๋ค.
ํด๋น ํ๋ก์ ํธ๊ฐ ์ด๋ ํ ํ๋ก์ ํธ์ด๋ฉฐ, ์ด๋ค ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋์ง ๊ธฐ์ ํ๋ค.
2) ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ฌ๊ฒํ ํ๋ค.
๊ธฐ๋ฅ ๋ชฉ๋ก์ ํด๋์ค ์ค๊ณ์ ๊ตฌํ, ํจ์(๋ฉ์๋) ์ค๊ณ์ ๊ตฌํ๊ณผ ๊ฐ์ด ๋๋ฌด ์์ธํ๊ฒ ์์ฑํ์ง ์๋๋ค. ํด๋์ค ์ด๋ฆ, ํจ์(๋ฉ์๋) ์๊ทธ๋์ฒ์ ๋ฐํ ๊ฐ์ ์ธ์ ๋ ์ง ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ฌด ์ธ์ธํ ๋ถ๋ถ๊น์ง ์ ๋ฆฌํ๊ธฐ๋ณด๋ค ๊ตฌํํด์ผ ํ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ ๋ฆฌํ๋ ๋ฐ ์ง์คํ๋ค. ์ ์์ ์ธ ๊ฒฝ์ฐ๋ ์ค์ํ์ง๋ง, ์์ธ์ ์ธ ์ํฉ๋ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ ๋ฆฌํ๋ค. ํนํ ์์ธ ์ํฉ์ ์์ ๋จ๊ณ์์ ๋ชจ๋ ์ฐพ๊ธฐ ํ๋ค๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด์ ๊ณ์ํด์ ์ถ๊ฐํด ๋๊ฐ๋ค.
3) ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ ๋ฐ์ดํธํ๋ค.
์์ํ ๋ ๋ชจ๋ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์๋ฒฝํ๊ฒ ์ ๋ฆฌํด์ผ ํ๋ค๋ ๋ถ๋ด์ ๊ฐ์ง๊ธฐ๋ณด๋ค ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด์ ๋ฌธ์๋ฅผ ๊ณ์ ์ ๋ฐ์ดํธํ๋ค. ์ฃฝ์ ๋ฌธ์๊ฐ ์๋๋ผ ์ด์์๋ ๋ฌธ์๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ ธ๋ ฅํ๋ค.
4) ๊ฐ์ ํ๋ ์ฝ๋ฉํ์ง ์๋๋ค.
๋ฌธ์์ด, ์ซ์ ๋ฑ์ ๊ฐ์ ํ๋ ์ฝ๋ฉํ์ง ๋ง๋ผ. ์์(static final)๋ฅผ ๋ง๋ค๊ณ ์ด๋ฆ์ ๋ถ์ฌํด ์ด ๋ณ์์ ์ญํ ์ด ๋ฌด์์ธ์ง ์๋๋ฅผ ๋๋ฌ๋ด๋ผ.
private static final String STRIKE = "์คํธ๋ผ์ดํฌ";
private static final String BALL = "๋ณผ";
private static final String NOTHING = "๋ซ์ฑ";
5) ๊ตฌํ ์์๋ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ด๋ค.
ํด๋์ค๋ ์์, ๋ฉค๋ฒ ๋ณ์, ์์ฑ์, ๋ฉ์๋ ์์ผ๋ก ์์ฑํ๋ค.
class Game{
private static final STRING STRIKE = "์คํธ๋ผ์ดํฌ";
private final Player;
public void Game(Player player){
this.player = player;
}
public void play(){
}
}
6) ๋ณ์ ์ด๋ฆ์ ์๋ฃํ์ ์ฌ์ฉํ์ง ์๋๋ค.
๋ณ์ ์ด๋ฆ์ ์๋ฃํ, ์๋ฃ ๊ตฌ์กฐ ๋ฑ์ ์ฌ์ฉํ์ง ์๋๋ค.
String carNameList = Console.readLine(); // X
String[] arrayString = carNameList.split(","); // X
7) ํ ํจ์๊ฐ ํ ๊ฐ์ง ๊ธฐ๋ฅ๋ง ๋ด๋นํ๊ฒ ํ๋ค
ํจ์ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง๋ค๋ฉด ํ ํจ์๊ฐ ์ฌ๋ฌ ์ผ์ ํ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ์๋์ ๊ฐ์ด ํ ํจ์์์ ์๋ด ๋ฌธ๊ตฌ ์ถ๋ ฅ, ์ฌ์ฉ์ ์ ๋ ฅ, ์ ํป๊ฐ ๊ฒ์ฆ ๋ฑ ์ฌ๋ฌ ์ผ์ ํ๊ณ ์๋ค๋ฉด ์ด๋ฅผ ์ ์ ํ๊ฒ ๋ถ๋ฆฌํ๋ค. (์ด๊ฒ ๋ง์ฒ๋ผ ์ฝ์ง ์์...๐ฅ)
private List<Integer> userInput(){
System.out.println("์ซ์๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์: ");
String userInput = Console.readLine().trim();
List<Integer> user = new ArrayList<>();
for(char c : userInput.toCharArray()){
user.add(Character.getNumericValue(c));
}
if(user.size() != 3){
throw new IllegalArgumentException("[ERROR] ์ซ์๊ฐ ์๋ชป๋ ํ์์
๋๋ค.");
}
return user;
}
8) ์ฒ์๋ถํฐ ํฐ ๋จ์์ ํ ์คํธ๋ฅผ ๋ง๋ค์ง ์๋๋ค.
ํ ์คํธ์ ์ค์ํ ๋ชฉ์ ์ค ํ๋๋ ๋ด๊ฐ ์์ฑํ๋ ์ฝ๋์ ๋ํด ๋น ๋ฅด๊ฒ ํผ๋๋ฐฑ์ ๋ฐ๋ ๊ฒ์ด๋ค. ์์๋ถํฐ ํฐ ๋จ์์ ํ ์คํธ๋ฅผ ๋ง๋ค๊ฒ ๋๋ค๋ฉด ์์ฑํ ์ฝ๋์ ๋ํ ํผ๋๋ฐฑ์ ๋ฐ๊ธฐ๊น์ง ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. ๊ทธ๋์ ๋ฌธ์ ๋ฅผ ์๊ฒ ๋๋๊ณ , ๊ทธ์ค ํต์ฌ ๊ธฐ๋ฅ์ ๊ฐ๊น์ด ๋ถ๋ถ๋ถํฐ ์๊ฒ ํ ์คํธ๋ฅผ ๋ง๋ค์ด ๋๊ฐ๋ค.
- ํฐ ๋จ์์ ํ
์คํธ
์ซ์ ์ผ๊ตฌ ๊ฒ์์ ์์ํด์ ์ฌ์ฉ์๊ฐ ์ซ์๋ฅผ ์ ๋ ฅํ๋ฉด, ์ปดํจํฐ ์ซ์์ ๋น๊ตํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์๋ ค์ค๋ค. - ์์ ๋จ์์ ํ
์คํธ
์ฌ์ฉ์์ ์ซ์๊ฐ ์ปดํจํฐ์ ์ซ์์ ํ๋๋ ์ผ์นํ์ง ์์ผ๋ฉด ๋ซ์ฑ์ ์ถ๋ ฅํ๋ค.
์ฌ์ฉ์์ ์ซ์๊ฐ ์ปดํจํฐ์ ์ซ์์ 1๊ฐ๋ ์ผ์นํ๊ณ , ์์น๊ฐ ๋ค๋ฅด๋ฉด 1 ๋ณผ์ ์ถ๋ ฅํ๋ค.
3. ๐ ๋ฐฐ์ด ์ & ๋๋ ์
1) ๊ธฐ๋ฅ ๋ชฉ๋ก ์์ฑ
๊ธฐ๋ฅ ๋ชฉ๋ก์ ์์ฑํ๋ฉด์ ์๊ฐ๋ณด๋ค ์๊ฐ์ด ๋๋ฌด ๋ง์ด ๊ฑธ๋ ธ๋ค. ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฐ ์ด์ ๋ก๋ '๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ฒ์ ์์ฑํด๋ด์'์ '๋๋ฌด ์์ธํ๊ฒ ์์ฑํด์' ์ผ ๊ฒ์ด๋ค.
๊ธฐ๋ฅ ๋ชฉ๋ก์ ๋ฐ๋ผ์ ๊ฐ๋ฐ์ ์งํํ๋ ์ ๊ธฐํ๊ฒ๋ ๋ค๋ก back(?)ํ๋ ์ผ์ด ์ ์์๋ค. ์๋ง ํฐ ๊ทธ๋ฆผ์ ์๊ณ ์๋ ์ํ์์ ๊ฐ๋ฐ์ ์งํํ๊ณ ๊ทธ๋ฆฌ๊ณ '๊ธฐ๋ฅ ๋ชฉ๋ก'์ ์์ฑํ๋ฉด์ ์ด๋ฏธ ์๋ชป๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๋๋ถ์ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์์ฑํ๋ฉด์ ๋ณด๋ธ ์๊ฐ๋ณด๋ค ๋ ๋ง์ ์๊ฐ์ ๋ค์์ ์๋ ์ ์์๋ค.๐
๋ํ, ๊ธฐ๋ฅ ๋ชฉ๋ก ๋จ์๋ก commit์ ์งํํ๋ ๋ ๊น๋ํ๊ฒ git์ ๊ด๋ฆฌํ ์ ์์๋ค.
2) ํจ์๊ฐ ํ ๊ฐ์ง ๊ธฐ๋ฅ์ ํ๋๋ก ์ค๊ณ
์ด๊ฒ ์๊ฐ๋ณด๋ค ์ด๋ ต๋ค... ์๊ฐ๋ณด๋ค ๋ ๋ง์ด ๋ถ๋ฆฌํด์ผ ํ๋ค. ์ฐ์ต์ด ํ์ํ๋ค!
ํจ์๊ฐ ํ ๊ฐ์ง ๊ธฐ๋ฅ์ ํ๋์ง ํ์ธํ๋ ๊ธฐ์ค์ผ๋ก ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๊ฒ ์ง๋ง, ์ผ๋จ์ ํจ์์ ๊ธธ์ด๋ฅผ 15๋ผ์ธ์ ๋์ด๊ฐ์ง ์๋๋ก ๊ตฌํํ๋ฉด์ ํจ์๋ฅผ ๋ถ๋ฆฌํ๋ ์์์ ์ธ ์ฐ์ต์ ์งํํ ๊ฒ์ด๋ค.
3) ํ ์คํธ ์ผ์ด์ค ์์ฑ
์ฌ๊ธฐ์ ์ด์ง ๋ฉํ์ด ๋๊ฐ๋ค...
'๊ตฌํ์ ๋ค ์์ฑํ ๋ค ์ด์ ํ ์คํธ ์ผ์ด์ค๋ง ์์ฑํด์ ์ ์ถํ๋ฉด ๋๊ฒ ๊ตฌ๋!'๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๋ฐ๋ฐ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ค๋ฉด์ '๋ค์ ๋ง๋ค์ด์ผ๊ฒ ๋ค...'๋ผ๊ณ ์๊ฐํ๋ค. ๊ตฌํํ๋๋ฐ ์๊ฐ์ ๋๋ฌด ๋ง์ด ์ฌ์ฉํ์ฌ ์์ฝ๊ฒ๋ ๋ค์ ๋ง๋ค์ง๋ ๋ชปํ์ง๋ง, ํ๋ฆฌ์ฝ์ค๊ฐ ๋๋ ๋ค ๋ค์ ๋ง๋ค ๊ฒ์ด๋ค.
๊ทธ ๋น์ ๊ฒช์๋ ๋ฌธ์ ๋ ์๋์ ๊ฐ๋ค.
- ์์ ๋จ์์ ํ ์คํธ๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ค. ํ์ง๋ง ์๊ฐ๋ณด๋ค ๊ธฐ๋ฅ์ ํฌ๊ธฐ๊ฐ ์ปธ๊ณ ๋ด๊ฐ ์ํ๋ ํ๋์ ๋จ์ ํ ์คํธ๋ฅผ ์งํํ์ง ๋ชปํ๋ค. → ์ด๊ฒ์ด 'ํจ์๊ฐ ํ ๊ฐ์ง ๊ธฐ๋ฅ๋ง์ ๋ด๋นํ์ง ์๊ณ ์๋ค.'๋ผ๋ ๊ฒ์ ๋ณด์ฌ์ค๋ค.
- ์ ๊ทผ ์ ์ด์(private ๋ฑ)๋ก ์ธํ์ฌ ์ ๊ทผ์ ํ ์ ์์๋ค. ๋ฌผ๋ก ์ ๊ทผ์ ์ด์๊ฐ ์์ด๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๊ธด ํ๋ค.(๋ฒ ์คํธ์ ๋ฐฉ๋ฒ์ ์๋ ๊ฒ์ด๋ค.) ์์ฑ์์์ ์ฌ๋ฌ ๊ฐ์ง ํ ์คํธ๋ฅผ ํ ์ ์๋๋ก ํ๋ ๋ฑ์ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
class Number{
private final List<Integer> answer;
public Number(List<Integer> answer){
if(!isValidSize()){
throw new IllegalArgumentException("[ERROR] ํฌ๊ธฐ๊ฐ ์ ์ ํ์ง ์์ต๋๋ค.");
}
if(!isDuplicatedNumber){
throw new IllegalArgumentException("[ERROR] ์ค๋ณต๋ ์ซ์๊ฐ ์กด์ฌํฉ๋๋ค.");
}
this.answer = answer;
}
}