- Controller, View를 분리하기
- 객체를 포장하여 역할 단위로 분리하기
- 객체에 따라 적절한 역할 분배하기
- LottoCount라는 객체에서, 금액과 수동 로또를 통해 자동 로또의 갯수 생성
- GameResult라는 객체에서, 통계정보를 참고하여 최종 결과를 만들어냄
- Factory method 사용하여 생성 및 퍼블릭 인터페이스 관리
- 객체의 생성을 분리
- 필요한 형태만을 퍼블릭 인터페이스를 통해 제공(of, from 등등 적절한 네이밍 전략 파악)
- Factory Method의 사용법 및 적용방법 학습
- Controller가 View를 어디까지 알아야하는가?
- 불변객체에 대한 이해 및 사용
- 원시값을 포장하면 Validation을 객체의 생성과 동시에 할 수 있다.
- 주석보단, 의도가 드러나는 프로그래밍을 생각해보자.
- IDE의 도움을 받아 컨벤션을 습관화하자.
- toString()을 통해 화면에 드러나는 정보를 표기하는게 맞을까?
- toString()은 로그성 데이터를 일반적으로 표현한다.
- 객체의 값에 접근하여(Getter)를 통해 표현하는 것이 맞다고 생각함.
- 비즈니스 로직의 실행순서를 Controller가 보장하는 것이 맞을까?
-
구입 금액을 입력 받는다.
- 1000단위가 아닌 경우는 예외처리
- 문자열이 포함되는 경우 예외처리
- 공백 및 NULL 예외처리
- 1000원 ~ 100,000원까지만 가능
- 구입 금액 또한 클래스로 분리하고
- 기능은 생성자를 통한 검증
- 장수를 계산해서 보내는 부분도
-
금액 / 1000 의 갯수만큼 로또를 자동으로 생성 및 출력한다.
- Number : 각각의 수
- 1~45 사이의 값인지
- 문자열이 포함되는 경우 예외처리
- 공백 및 NULL 예외처리
- Number를 6개 가지고 있는 로또 한 장을 지칭하는 객체(Lotto)
Lotto.size()
= 6- 중복된 수가 있으면 안된다.
- Lotto 를 금액 / 1000만큼 생성한다.
- Lotto를 구매한 만큼 가지고 있는 Lottos 객체를 생성한다.
- 금액 / 1000 == Lottos.size()
- Lotto를 구매한 만큼 가지고 있는 Lottos 객체를 생성한다.
- 이렇게 생성된 Lottos 를 출력한다.
- Number : 각각의 수
-
당첨번호(보너스 번호 제외) 6자리를
,
를 기준으로 분리한다.- 싱글톤 ?
- 당첨번호를 담당하는 WinningLotto 객체를 생성한다.
- 공백 및 NULL 예외처리
- 데이터 타입 처리
- 갯수 6개
- 번호의 범위
- 각각 다른 번호인지
-
보너스 볼 하나를 입력한다
- 보너스 볼 객체 Bonus
- Number 하나를 갖는 객체
-
당첨 통계를 출력한다
- LottoModel ← Lottos , Winning
- OutputView
- Enum 에서 맞힌 갯수, 금액, 몇장인지를 가지는 Enum에서 처리
-
참고
- 숫자를 생성할 때 그리고 보너스 넘버를 생성할 때 로직이 겹치니까 해결책으로
- Validator를 따로 둔다.
- Number를 상속받는다.
- 숫자를 생성할 때 그리고 보너스 넘버를 생성할 때 로직이 겹치니까 해결책으로
-
구입 금액 테스트
- 1000단위가 아닌 경우는 예외처리
- 문자열이 포함되는 경우 예외처리
- 공백 및 NULL 예외처리
- 1000원 ~ 100,000원까지만 가능
- 장수로 변환하는 매소드 추가
-
Utility 클래스 검증
- 공백 제거
-
,
Parsing 검증
-
Number
- 1~45 사이의 값인지
- 문자열이 포함되는 경우 예외처리
- 공백 및 NULL 예외처리
- Enum을 통해서 Number 기능을 같이 하는 방안 고려 (현재 static 부분)
-
LottoFactory
-
Lotto
-
Lotto.size()
= 6 - 중복된 수가 있으면 안된다.
-
-
Lottos
- Lotto를 구매한 만큼 가지고 있는 Lottos 객체를 생성한다
- 금액 / 1000 == Lottos.size()
-
WinningLotto
- 보너스넘버와 WinningNumbers의 값이 겹치지 않아야 한다.
- BonusNumber (상속 : Number)
- WinningNumbers
- 상속받고 있고 (Lotto) : 로직이 같고, 로또와 의미를 구분하기 위함
-
Result
- 인자 : WinningLotto, Lottos
- 기능
- 맞힌 갯수별로 장수 + 수익금 계산
- 수익률
- OutputView 보내기
-
추가 요구사항(수동)
- 수동으로 구매할 로또의 개수를 입력 받는다.
- 개수라는 클래스를 두고
- 음수 예외처리
- 금액을 초과하는 경우
- 문자열
- Null & 공백
- 금액이랑 비교
- 개수라는 클래스를 두고
- 수동으로 구매할 로또의 번호를 개수만큼 입력받는다.
- 기존의 LottoFactory 를 재활용한다.
- 수동으로 구매할 로또의 개수를 입력 받는다.
- 개수라는 클래스를 두고
- 음수 예외처리
- 금액을 초과하는 경우
- 문자열
- Null & 공백
- 금액이랑 비교
- 개수라는 클래스를 두고
- 수동으로 구매할 로또의 번호를 개수만큼 입력받는다.
- 기존의 LottoFactory 를 재활용한다.
- 수동으로 구매할 로또의 개수를 입력 받는다.
- indent(인덴트, 들여쓰기) depth를 2단계에서 1단계로 줄여라.
- depth의 경우 if문을 사용하는 경우 1단계의 depth가 증가한다. if문 안에 while문을 사용한다면 depth가 2단계가 된다.
- else를 사용하지 마라.
- 메소드의 크기가 최대 10라인을 넘지 않도록 구현한다.
- method가 한 가지 일만 하도록 최대한 작게 만들어라.
- 배열 대신 ArrayList를 사용한다.
- enum을 적용해 프로그래밍을 구현한다.
- 예외가 발생하는 부분에 대해 자바 Exception을 적용해 예외처리한다.
- 사용자가 입력한 값에 대한 예외 처리를 철저히 한다.
- 로또 자동 생성은 Collections.shuffle() 메소드 활용한다.
- Collections.sort() 메소드를 활용해 정렬 가능하다.
- ArrayList의 contains() 메소드를 활용하면 어떤 값이 존재하는지 유무를 판단할 수 있다.
- 현재 로또 생성기는 자동 생성 기능만 제공한다. 사용자가 수동으로 추첨 번호를 입력할 수 있도록 해야 한다.
- 입력한 금액, 자동 생성 숫자, 수동 생성 번호를 입력하도록 해야 한다.