우테코 3주차 과제를 진행하면서 고민했던 내용을 정리한다. 참고 없이 진행한 내용으로 다소 주관적인 내용이 포함되어 있다.
과제
3주차 과제는 로또 프로그램을 구현하는 것이다. 요구사항은 다음과 같다.
- 로또 번호의 숫자 범위는 1~45까지이다.
- 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다.
- 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다.
- 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다.
- 1등: 6개 번호 일치 / 2,000,000,000원
- 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원
- 3등: 5개 번호 일치 / 1,500,000원
- 4등: 4개 번호 일치 / 50,000원
- 5등: 3개 번호 일치 / 5,000원
- 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다.
- 로또 1장의 가격은 1,000원이다.
- 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다.
//중락
기능 목록
역시 기능 목록 작성으로 구현을 시작하였다. 지난주 피드백에 있었던 작은 단위의 task부터 기능목록을 작성하였다. 기능목록을 작성하면서 클래스 분리를 생각하면서 설계하였다
- 로또 번호를 생성할 수 있다.로또 번호를 랜덤, 사용자 지정으로 생성할 수 도 있다..
- 로또는 당첨 번호와 주어진 번호를 통해 당첨을 판정하고, 당첨 금액을 반환한다당첨에 여러 종류가 있고, 가장 금액이 높은 당첨을 적용한다.
- 당첨 금액을 통해 수익률을 계산할 수 있다.
- 금액에 따라 로또를 구매할 수 있다.
- 금액에 따라 로또 번호를 자동적으로 구매한다.
- 옳지 않은 금액 형식은 예외로 정의한다.
설계의 목적
과제를 진행하면서 설계에 시간을 과투자하여, 나중에 시간에 급급하게 구현하였다. 설계를 하는 것은 결국 좋은 코드, 알아보기 쉬운 코드를 만드는 것이다. 책임 분리를 하다보니, 클래스를 쪼개고, 쪼개서 클래스가 순식간에 10개이상 늘어나는 현상을 목격했다. 객체지향적으로 클래스를 쪼개는 것은 맞을 수도 있지만, 클래스가 쪼개질수록 코드가 필요이상으로 커지고 있었다. 나중에는 새로운 변경사항이 생기면 오히려 유연하게 대처하기 힘들 수도 있겠다는 생각이 들었다. 특히 과제의 특성상 정말 짧은 코드로도 대처가 가능한 기능이 많은데, 이렇게 하는게 맞는가? 라는 의구심이 들었다.
객체 주입의 종단점
객체가 다른 객체를 상태를 가지고 있을때, 객체를 생성자로 주입하면 객체의 의존성을 명시할 수 있다. 마치 회사에서 부서마다 직원을 뽑는 것과 비슷하다.(이 부서의 업무를 너가 해줘!) 그러면 무조건 주입을 해야할까? 그건 아니라고 생각한다. OOP에서는 모두 객체로 존재하는데, 그러면 단순한 객체에 대해서도 생성자로 주입하게 되면서 오히려 명확하게 의존성을 나타내기 어렵다고 생각한다. 프리코스를 진행하면서 내가 만든 나만의 규칙은 생성자 주입은 만약 의존성을 명시해야하는 경우(추상화, 인터페이스) 사용하거나, 그 이외의 경우에는 생성자 내부에서 생성하거나 해당 객체 생성쟈 호출자까지만 객체를 주입하기로 결정하였다