Skip to content

Commit f78b350

Browse files
committed
[Feat/next-step#1] MVC패턴 기능 구현
1 parent 8346441 commit f78b350

File tree

7 files changed

+141
-69
lines changed

7 files changed

+141
-69
lines changed

src/main/java/Application.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import controller.LottoController;
2+
import view.InputView;
3+
import view.ResultView;
24

35
public class Application {
46

57
public static void main(String[] args) {
6-
LottoController lottoController = new LottoController();
8+
InputView inputView = new InputView();
9+
ResultView resultView = new ResultView();
10+
LottoController lottoController = new LottoController(inputView, resultView);
711
lottoController.run();
812
}
913
}
Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,28 @@
11
package controller;
22

33
import model.Lotto;
4+
import model.LottoGenerator;
5+
import model.LottoTicketMachine;
46
import view.InputView;
57
import view.ResultView;
68

79
import java.util.List;
8-
import java.util.stream.Collectors;
910

1011
public class LottoController {
1112

12-
public void run() {
13-
int purchaseAmount = InputView.getPurchaseAmount();
13+
private final InputView inputView;
14+
private final ResultView resultView;
1415

15-
int ticketCount = Lotto.getTicketCount(purchaseAmount);
16-
17-
List<Lotto> tickets = Lotto.generateLottoTickets(ticketCount);
18-
19-
ResultView.printOrderTickets(ticketCount);
20-
ResultView.printTickets(ticketCount, formatTickets(tickets));
16+
public LottoController(InputView inputView, ResultView resultView) {
17+
this.inputView = inputView;
18+
this.resultView = resultView;
2119
}
2220

23-
public List<String> formatTickets(List<Lotto> tickets) {
24-
List<String> formattedTickets = tickets.stream()
25-
.map(lotto -> lotto.getNumbers()
26-
.stream()
27-
.sorted()
28-
.map(String::valueOf)
29-
.collect(Collectors.joining(",","[","]")))
30-
.toList();
31-
32-
return formattedTickets;
21+
public void run(){
22+
int purchaseAmount = inputView.getPurchaseAmount();
23+
LottoTicketMachine lottoTicketMachine = new LottoTicketMachine(purchaseAmount, new LottoGenerator());
24+
List<Lotto> lottery = lottoTicketMachine.generateLottery();
25+
resultView.printTicketCount(lottoTicketMachine.getTicketCount());
26+
resultView.printLottery(lottery);
3327
}
3428
}

src/main/java/model/Lotto.java

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,41 @@
11
package model;
22

3-
import java.util.*;
4-
import java.util.stream.Collectors;
5-
import java.util.stream.IntStream;
3+
import java.util.List;
64

75
public class Lotto {
86

9-
// 로또 번호 관련 상수 선언
10-
public static final int LOTTO_MIN_NUMBER = 1;
11-
public static final int LOTTO_MAX_NUMBER = 45;
12-
public static final int LOTTO_CREATE_SIZE = 6;
13-
public static final int LOTTO_PRICE = 1000;
14-
public static final List<Integer> LOTTO_NUMBER_POOL =
15-
IntStream
16-
.rangeClosed(LOTTO_MIN_NUMBER,LOTTO_MAX_NUMBER)
17-
.boxed()
18-
.collect(Collectors.toList());
19-
20-
private List<Integer> numbers = new ArrayList<>();
21-
22-
public static int getTicketCount(int purchaseAmount){
23-
return purchaseAmount / LOTTO_PRICE;
24-
}
25-
26-
public Lotto(){
27-
this.numbers = createLottoNumbers();
28-
}
7+
private static final int LOTTO_NUMBER_SIZE = 6;
8+
private static final int LOTTO_NUMBER_MAX = 45;
9+
private static final int LOTTO_NUMBER_MIN = 1;
2910

30-
private List<Integer> createLottoNumbers(){
31-
List<Integer> shuffledNumbers = new ArrayList<>(LOTTO_NUMBER_POOL);
32-
Collections.shuffle(shuffledNumbers);
33-
numbers = shuffledNumbers.subList(0, LOTTO_CREATE_SIZE);
11+
private final List<Integer> numbers;
3412

35-
return numbers;
13+
public Lotto(List<Integer> numbers) {
14+
if (numbers == null || numbers.isEmpty()) {
15+
throw new IllegalArgumentException("로또 번호 목록이 비어 있거나 null 입니다.");
16+
}
17+
validateNumbers(numbers);
18+
this.numbers = numbers; // numbers를 초기화
3619
}
3720

38-
public static List<Lotto> generateLottoTickets(int ticketCount){
39-
List<Lotto> tickets = new ArrayList<>();
40-
41-
for (int i = 0; i < ticketCount; i++){
42-
tickets.add(new Lotto());
21+
private void validateNumbers(List<Integer> numbers) {
22+
if (numbers.size() != LOTTO_NUMBER_SIZE) {
23+
throw new IllegalArgumentException("Number size must be equal to " + LOTTO_NUMBER_SIZE);
4324
}
4425

45-
return tickets;
26+
for (int number : numbers) {
27+
validateNumber(number);
28+
}
4629
}
4730

48-
public List<Integer> getNumbers() {
49-
List<Integer> sortedNumbers = new ArrayList<>(numbers);
50-
Collections.sort(sortedNumbers);
31+
private void validateNumber(int number) {
32+
if (number < LOTTO_NUMBER_MIN || number > LOTTO_NUMBER_MAX) {
33+
throw new IllegalArgumentException("Number must be between " + LOTTO_NUMBER_MIN + " and " + LOTTO_NUMBER_MAX);
34+
}
35+
}
5136

52-
return sortedNumbers;
37+
@Override
38+
public String toString() {
39+
return numbers.toString();
5340
}
5441
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package model;
2+
3+
import java.util.*;
4+
5+
public class LottoGenerator {
6+
7+
private static final int LOTTO_NUMBER_SIZE = 6;
8+
private static final int LOTTO_NUMBER_MAX = 45;
9+
private static final int LOTTO_NUMBER_MIN = 1;
10+
11+
public Lotto generateLottoNumbers() {
12+
List<Integer> shuffledNumbers = shuffleNumbers(initializeNumbers());
13+
List<Integer> cutOffNumbers = cutNumbersSize(shuffledNumbers);
14+
List<Integer> sortedNumbers = sortNumbersByAscending(cutOffNumbers);
15+
16+
return new Lotto(sortedNumbers);
17+
}
18+
19+
private List<Integer> initializeNumbers() {
20+
List<Integer> numbers = new ArrayList<>();
21+
22+
for (int i = LOTTO_NUMBER_MIN; i <= LOTTO_NUMBER_MAX; i++) {
23+
numbers.add(i);
24+
}
25+
26+
return numbers;
27+
}
28+
29+
private List<Integer> shuffleNumbers(List<Integer> numbers) {
30+
Collections.shuffle(numbers);
31+
32+
return numbers;
33+
}
34+
35+
private List<Integer> cutNumbersSize(List<Integer> numbers) {
36+
return numbers.subList(0, LOTTO_NUMBER_SIZE);
37+
}
38+
39+
private List<Integer> sortNumbersByAscending(List<Integer> numbers) {
40+
Collections.sort(numbers);
41+
42+
return numbers;
43+
}
44+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package model;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class LottoTicketMachine {
7+
8+
private static final int LOTTO_TICKET_PRICE = 1000;
9+
private final int ticketCount;
10+
private final LottoGenerator lottoGenerator;
11+
private final List<Lotto> lottery = new ArrayList<>();
12+
13+
public LottoTicketMachine(int purchaseAmount, LottoGenerator lottoGenerator) {
14+
this.ticketCount = purchaseAmount / LOTTO_TICKET_PRICE;
15+
this.lottoGenerator = lottoGenerator;
16+
}
17+
18+
public List<Lotto> generateLottery() {
19+
for (int i = 0; i < this.ticketCount; i++) {
20+
lottery.add(lottoGenerator.generateLottoNumbers());
21+
}
22+
23+
return lottery;
24+
}
25+
26+
public int getTicketCount() {
27+
return ticketCount;
28+
}
29+
}

src/main/java/view/InputView.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
11
package view;
22

3+
import java.util.InputMismatchException;
34
import java.util.Scanner;
45

56
public class InputView {
67

7-
private static final Scanner scanner = new Scanner(System.in);
8+
public int getPurchaseAmount() {
9+
try (Scanner scanner = new Scanner(System.in)) {
10+
System.out.println("구입금액을 입력해 주세요.");
11+
int purchaseAmount = scanner.nextInt();
12+
validatePositive(purchaseAmount);
813

9-
public static int getPurchaseAmount(){
10-
System.out.println("구입금액을 입력해 주세요.");
11-
int purchaseAmount = scanner.nextInt();
12-
scanner.close();
14+
return purchaseAmount;
15+
} catch (InputMismatchException e) {
16+
System.out.println("올바른 숫자를 입력하세요.");
1317

14-
return purchaseAmount;
18+
return -1;
19+
}
20+
}
21+
22+
private void validatePositive(int number) {
23+
if (number < 0) {
24+
throw new IllegalArgumentException("양수가 아닌 음수가 입력되어 예외가 발생되었습니다.");
25+
}
1526
}
1627
}

src/main/java/view/ResultView.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
package view;
2+
3+
import model.Lotto;
4+
25
import java.util.List;
36

47
public class ResultView {
58

6-
public static void printOrderTickets(int ticketCount){
7-
System.out.println();
9+
public void printTicketCount(int ticketCount) {
810
System.out.println(ticketCount + "개를 구매했습니다.");
11+
System.out.println();
912
}
1013

11-
public static void printTickets(int ticketCount ,List<String> formattedTickets){
12-
for (String ticket : formattedTickets) {
13-
System.out.println(ticket);
14+
public void printLottery(List<Lotto> lottery) {
15+
for (Lotto lotto : lottery) {
16+
System.out.println(lotto);
1417
}
1518
}
1619
}

0 commit comments

Comments
 (0)