-게임 만들어보기(숫자 맞히기)
package game;
import java.util.Random;
import java.util.Scanner;
public class NumBaseBall {
private static int[] getComRandom() {
Random random = new Random();
int[] c_num = new int[3];
while (true) {
for (int i = 0; i < 3; i++) {
c_num[i] = random.nextInt(10);
}
if (c_num[0] != c_num[1]
&& c_num[1] != c_num[2]
&& c_num[0] != c_num[2])
break;
}
return c_num;
}
private static int[] getHumanInput() {
int[] h_num = new int[3];
Scanner scanner = new Scanner(System.in);
String inputString = String.valueOf(scanner.nextLine());
char[] charArray = inputString.toCharArray();
for (int i = 0; i < 3; i++) {
h_num[i] = Character.getNumericValue(charArray[i]);
}
return h_num;
}
private static int[] getBallStrike(int[] c_num, int[] h_num) {
String c_num_string = "";
for (int i = 0; i < 3; i++)
c_num_string = c_num_string.concat(String.valueOf(c_num[i]));
int strikeCounter = 0;
int ballCounter = 0;
for (int i = 0; i < 3; i++) {
if (c_num[i] == h_num[i]) {
strikeCounter++;
} else if (c_num_string.contains(String.valueOf(h_num[i]))) {
ballCounter++;
}
}
return new int[]{ballCounter, strikeCounter};
}
public void gameStart() {
int[] c_num = getComRandom();
int count = 0;
while (true) {
count++;
System.out.print(count + "번째 시도 : ");
int[] h_num = getHumanInput();
int[] ballStrike = getBallStrike(c_num, h_num);
String result = String.valueOf(ballStrike[0]).concat("B")
.concat(String.valueOf(ballStrike[1]))
.concat("S");
System.out.println(result);
if (ballStrike[1] == 3) {
break;
}
}
System.out.println(count + "번만에 맞히셨습니다.");
System.out.println("게임을 종료합니다");
}
public static void main(String[] args) {
NumBaseBall baseball = new NumBaseBall();
baseball.gameStart();
}
}
간단한 게임을 만들어 보았는데, 처음에는 하나의 클래스에서 주구장창 로직은 연결하여 코드를 완성하였다. 그러나 코드가 상당히 난잡해보여, 각 코드를 액션별로 구분하여 함수로 설정하고, main()에서 실행만 하도록 수정해 보았다.
그랬더니 한눈에 파악하기 쉬웠으며, 가시적 효과로 인해 내 코드를 효과적으로 검토할 수 있었다. 코드의 가독성에서 구분화 및 체계화는 매우 중요하다. 코드의 가독성을 챙기는 것은 나를 위한 것도 있지만, 함께 일하는 동료들에 대한 배려이자 의무라 할 수 있다. 코드의 가독성을 위한 몇 가지 원칙을 찾아보았다.
1)명확한 네이밍: 변수, 함수, 클래스 등의 이름은 해당 요소의 용도를 명확하게 나타내야 한다.
2)주석 사용: 복잡한 로직이나 특정 코드 블록의 기능을 설명하는 주석을 사용하면 가독성이 높아진다. 그러나 주석도 너무 많이 사용하면 코드가 지저분해지므로 적절한 수준에서 사용해야 한다.
3)일관된 코드 스타일: 일관된 코드 스타일을 사용하면 코드를 읽는 사람이 코드를 이해하기 쉽다. 예를 들어, 들여쓰기, 괄호의 위치, 줄바꿈 등을 일관되게 사용하는 것이 좋다.
4)단순하게 유지: 코드는 가능한 한 단순하게 유지해야 한다. 복잡한 한 줄의 코드보다는 여러 줄에 걸쳐 간단하게 작성된 코드가 가독성이 더 높다.
5)적절한 코드 분할: 코드가 너무 길거나 복잡하면 가독성이 떨어진다. 함수, 클래스 등을 사용해 코드를 적절히 분할하면 각 부분의 기능을 이해하기 쉽고, 재사용하기도 편리하다.
6)DRY 원칙 지키기: Don't Repeat Yourself (DRY) 원칙은 동일한 정보를 중복하여 사용하지 말 것을 권장한다. 코드 내에서 동일한 로직이 반복되는 경우, 이를 함수로 분리하여 중복을 최소화하면 가독성이 높아진다.
7)의미있는 문서화: 코드의 동작을 설명하는 문서화도 중요하다. API, 함수 또는 클래스의 사용 방법을 명확히 설명하는 문서는 가독성을 높이고 이해를 돕는다. 이러한 문서화는 주석을 통해 직접 코드 내에 포함시킬 수도 있고, 별도의 문서로 제공할 수도 있다.
이 중 특히 중요하다고 생각되는 것 문서화이다. 문서화는 제품 설명서 정도로 이해될 수 있겠지만, 지금 내 시점에서 중요한 것은 사전 문서화(설계도)다. 프로젝트가 어떤 목적 하에 어떤 체계로 진행될 것이며, 어떠한 관리를 거치고, 어떻게 작업을 팀원들에게 할당할 것인지 등 사전에 프로젝트에 관해 포괄적으로 설계하는 것이 큰 그림을 보며 공부하게 하고, 또 그것이 학습의 깊이까지 수반하는 것을 경험적으로 확신하고 있다.