FireDrago
숫자야구게임 후기 본문
자바 플레이그라운드 첫번째 미션 숫자야구 게임을 마무리했다. 모든것을 스스로 해결하는 미션구현은 처음이었다.
남들이 만든 코드를 익히는것이 아니라, 내가 처음부터 코드를 짜는 경험도 처음이었다. 모든것이 막막하고 도저히 어떻게 시작해야 할지 몰랐다. 그래서 미션을 100% 나의 힘으로 완수하지 못했다. 하지만 앞으로 개발자가 되기위해서 어떻게 공부해야하는지 조금 감을 잡을 수 있었고, 이때까지 경험한 어떤 공부보다도 내가 성장했다는 느낌을 받을 수 있었다. 다음 미션은 훨씬 재밌게 공부할 수 있을 것 같다.
1. 객체는 기능중심으로 분리하자
- "클래스를 어떻게 분리해야 하지?" 가장 처음 마주친 벽이었다. 이때까지는 모든 기능을 하나의 클래스 메인함수에 때려넣었다. 요구사항에서 직접 말하지는 않았지만, 가독성 좋은 코드를 짜기위해서는 클래스 분리가 필수적이었다.
그래서 클래스 분리에관한 여러 정보들을 찾아보기 시작했고 유튜브 "널널한 개발자" 님의 클래스 책임 원칙 영상을 보게되었다.
https://www.youtube.com/playlist?list=PLXvgR_grOs1CTu1t6_0C40SEF61Vv08s5
객체지향 프로그래밍과 디자인 패턴
www.youtube.com
정보처리기사에서 외우기만 했던 객체설꼐의 5원칙이 객체설계를 할 때 도움이 된다는 것을 느낄 수 있었다.
역시 내가 머리싸매고 고생을 해본뒤에 영상을 보거나, 책을보면 흡수정도가 차원이 다르다.
객체는 여러가지 책임을 가지면 안되고, 이를 구현하는 좋은 방법이 처음에는 '기능'을 중심으로 구현하는 것이다
read.me에서 작성한 기능 구현을 중심으로 클래스를 구분했다.

그리고 기능중심으로 클래스를 구성하게 되면 그 클래스들을 실행할 클래스가 필요하다. 는 것도 알게되었다. 문제의 요구사항에 맞게 동작하기위해서 정의된 클래스의 메서드 (기능)들을 적절한 조건에 따라 실행하는 Application 클래스를 만들어서 프로그램을 완성할 수 있었다.
기능을 중심으로 클래스를 구분하게 되니까, 확실히 전보다 코드가 전체적으로 구조를 가지게되었다는 느낌이 있었다.
객체를 기능중심으로 구분하는 연습이 더 많이 필요하다는 것을 느꼈다.
Application 클래스에서는 그때그때 필요한 객체들을 생성해서 사용했다.
더 깔끔한 방식으로 객체를 생성, 관리하는 방법은 없는지 알고싶다.
2. 메서드의 분리는 어떻게 해야할까? (메서드의 이름)
- 사실 이 부분은 아직 완벽히 머릿속에서 정리하지 못했다. depth가 2인 상태로 구현된 메서드도 많이 남았고....
유효성 검사 코드는 메서드 분리를 조금 시도해 보았는데, 이렇게 하는 것이 정확하게 하는 것인지도 의문이 남는다.
하지만 메서드의 이름이 명확해야 하는 이유는 이해할 수 있었다. 한가지 기능을 구현하기 위해 여러 메서드가 힘을 합치는 경우에는 메서드의 이름이 명확하지 못하면, 어떤 일을 하는지 이해하기 힘들었기 때문이다. 그래서 이름이 길어지더라도 어떤 기능을 하는지 정확한 이름짓기가 필요하다는 것을 느꼈다.
public class InputNumber {
public String inputUserNum() {
System.out.println("1~9 중복없는 세자리 숫자를 입력해주세요");
return new Scanner(System.in).nextLine();
}
public static ArrayList validNum(String number) {
if(isSingleDigitNum(number) && isUnique(number) && isThreeDigits(number)) {
return addList(parsing(number));
}
return null;
}
private static String[] parsing(String number) {
return number.split("");
}
private static ArrayList addList (String [] numbers) {
ArrayList list = new ArrayList();
for (int i = 0; i < 3; i++) {
list.add(Integer.parseInt(numbers[i]));
}
return list;
}
public static boolean isSingleDigitNum (String number) {
if (isNum(number)) {
return isOneDigit(number);
}
return false;
}
private static boolean isNum (String number) {
try{
Integer.parseInt(number);
return true;
} catch (Exception e){
return false;
}
}
private static boolean isOneDigit(String number) {
for (int i=0; i<number.length(); i++) {
char num = number.charAt(i);
if(!isOneToNine(num)) {
return false;
}
}
return true;
}
private static boolean isOneToNine (char num) {
if ('1'<=num && num<='9') {
return true;
}
return false;
}
public static boolean isUnique(String number) {
HashSet<Character> uniqueChars = new HashSet<>();
for (char ch : number.toCharArray()) {
if (!uniqueChars.add(ch)) {
return false;
}
}
return true;
}
public static boolean isThreeDigits (String number) {
if (number.length() == 3) {
return true;
}
return false;
}
}
입력받은 값의 유효성을 검사하고 맞으면 ArrayList 로 담아서 리턴하는 메서드를 구현하고, 분리했다.
근데 이렇게 하는 게 맞는건지 궁금하다...... 더 고민해봐야 할 문제인것같다...
'자바 플레이그라운드' 카테고리의 다른 글
| 치지직 api (0) | 2025.12.29 |
|---|---|
| [좌표계산기] 사용자 입력에 관한 생각정리 (0) | 2023.10.12 |
| [java] null 유효성 검사는 제일 먼저 (0) | 2023.08.27 |
| [좌표 계산기] 정규표현식의 강력함 (0) | 2023.08.16 |
