Kotlin으로 숫자 야구 게임을 구현했다.
https://github.com/hellou8363/week3
첫 시작은 각자의 역할을 하는 객체를 만들기 위한 많은 클래스로 시작했다.
- 난수를 생성하는 클래스
- 힌트를 갖고 있는 enum 클래스
- 게임 이력을 저장하는 클래스
- 사용자에게 출력되는 내용들을 담은 클래스
- 입력값 검증을 위한 클래스
- 사용자의 입력값과 정답을 비교하는 클래스
클래스를 많이 생성하게 된 첫 번째 이유는 <협력에 참여하는 등장인물 정의>이다.
숫자 야구 게임 안에서 협력하는 등장인물들을 보자면 내 주관으로는 위와 같이 나누어지기 때문에 클래스가 많아질 수밖에 없었고 다시 클래스 지옥에 빠질 수밖에 없었다.
두 번째 이유는 클래스는 설계도이고 인스턴스(객체)는 제품이라는 것이다.
클래스가 설계도라면 난수를 생성하는 기계를 만들기 위해 당연히 클래스가 필요하고 힌트를 제공하는 기계를 만들기 위해 또 클래스가 필요하고 결국 다시 모든 게 클래스가 된다.
세 번째 이유는 단일 책임 원칙이라는 글에서 객체는 단 하나의 책임만을 가져야 한다는 문구를 본 것이었다.
나는 이 문구를 하나의 메서드(행위)만 가져야 된다고 이해했기 때문이다.
이렇게 객체란 무엇인가에 대해 돌고 도는 지옥에 빠져있을 때 <스프링 입문을 위한 자바 객체 지향의 원리와 이해>라는 책에서 다음과 같은 내용을 봤다.
분류(class) 안의 여러 객체(object)들이 공통으로 갖는 속성(property)과 행위(method)
class가 분류라면 위에서 정의했던 클래스들을 다음과 같이 변경할 수 있을 것 같다.
- 생성 : 난수를 생성
- 저장 : 게임 이력을 저장, 제공
- 정보 : 사용자에게 힌트, 게임 안내, 결과를 제공
- 검증 : 사용자가 유효한 값을 입력했는지 확인, 사용자의 입력값과 정답을 비교
이렇게 분류하고 보니 생성은 그저 난수를 생성하는 역할밖에 없고 정보는 여러 정보를 사용자에게 알려주지만 단순 출력문(파라미터를 받아 그대로 전달)에 불과해서 난수는 클래스에서 함수로 변경, 정보 출력들은 main 함수에 포함으로 변경했다.
Java에서는 메서드가 무조건 클래스 안에 있어야 하지만 Kotlin은 클래스 없이 함수를 정의할 수 있어서 함수만 담긴 파일로 만들었다.
이게 객체지향에 어긋나는지는 모르겠지만 둘 다 상태를 갖지 않고 그저 반환만 하기 때문에 클래스로 정의할 필요가 없다 생각했다.
위 내용들을 정리해서 숫자 야구 게임 프로젝트를 리팩터링 했다.
정리된 클래스와 함수는 다음과 같다.
- 클래스 : 저장, 검증
- 함수 : 생성
- main : 입력, 단순 출력, 입력에 의한 분기
처음보다 클래스가 많이 줄었고 단순해졌다.
여전히 어떤 것이 정답인지 확신이 서지 않지만 처음보다 나아진 현재의 결과물에 만족한다.
이후 개선할 점이 더 발견된다면 다시 리팩터링 해야겠다.
'TIL(Today I Learned)' 카테고리의 다른 글
TIL - 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.05.08 |
---|---|
Baekjoon 구간 합 구하기 4 문제를 풀면서 삽질하기 (1) | 2024.05.02 |
계산기 프로젝트 코드 수정 및 예외 처리 (0) | 2024.04.30 |
TIL - Kotlin에서 main 함수 실행 시 LinkageError 발생 (0) | 2024.04.29 |
SQL - 날짜에 관한 group by 문제 (0) | 2024.04.25 |