ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,14 @@
+package christmas.controller;
+
+import christmas.domain.date.Date;
+import christmas.domain.reward.Reward;
+import christmas.domain.order.Bill;
+import christmas.factory.ServiceFactory;
+import christmas.service.EventService;
+
+public class EventController {
+    private final EventService eventService = ServiceFactory.getEventService();
+    public Reward confirmReward(Date date, Bill bill){
+        return eventService.createReward(date,bill);
+    }
+}

리뷰: 한줄 공백 삽입이 빠진 것 같아요
@@ -0,0 +1,28 @@
+package christmas.domain.event.discount;
+
+import java.util.List;
+
+import christmas.domain.date.Date;
+import christmas.domain.reward.DiscountEventReward;
+import christmas.lib.event.DiscountEvent;
+
+import static christmas.constant.EventConstant.SPECIAL_DAY_MESSAGE;
+import static christmas.constant.EventConstant.SPECIAL_DAY_PRICE;
+
+public class SpecialDiscountEvent extends DiscountEvent<Void> {
+    private final List<Integer> SPECIAL_DAY = List.of(3, 10, 17, 24, 25, 31);
+    private final String EVENT_NAME = SPECIAL_DAY_MESSAGE;
+
+    @Override
+    public boolean checkCondition(Date date) {
+        if (SPECIAL_DAY.contains(date.day())) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public DiscountEventReward provideReward(Void object) {
+        return new DiscountEventReward(EVENT_NAME, SPECIAL_DAY_PRICE);
+    }
+}

리뷰: 특별 할인이 적용되는 날이 매주 일요일, 크리스마스 날이라는 점을 DayOfWeek를 활용해서 표현하는 것도 좋은 방법일거 같아요!
@@ -0,0 +1,27 @@
+package christmas.domain.category;
+
+import christmas.domain.menu.Menu;
+import christmas.domain.menu.MenuItem;
+
+public enum Dessert implements MenuItem {
+    CHOCO_CAKE("초코케이크", 15000),
+    ICE_CREAM("아이스크림", 5000);
+
+    private Menu menu;
+
+    Dessert(String name, int price) {
+        this.menu = new Menu(name, price);
+    }
+
+    @Override
+    public Menu get() {
+        return menu;
+    }
+
+    @Override
+    public String getName() {
+        return menu.name();
+    }
+
+
+}

리뷰: 메뉴 카테고리마다 enum 클래스를 나눌 생각은 못했는데 이렇게 하면 유지보수가 더 쉽겠네요!
좋은 아이디어인거 같아요!
@@ -0,0 +1,6 @@
+package christmas.constant;
+
+public interface DateConstant {
+    public static int START_DAY = 1;
+    public static int END_DAY = 31;
+}

리뷰: 이 부분도 월 수가 바뀐다면?
12월에서 1월로 바뀔 때, 2월로 바뀔 때 일수에 대한 제약조건을 수동으로 수정해주어야 할 것으로 예견됩니다.
전역에서 설정하는 연/월 설정을 바탕으로 StartDay와 EndDay를 동적으로 판단하면 좋을 것 같아요!
@@ -0,0 +1,9 @@
+package christmas.constant;
+
+public interface OrderConstant {
+    public static final String ORDER_SEPARATOR = ",";
+    public static final String REQUEST_SEPARATOR = "-";
+
+    public static final int MIN_AMOUNT = 1;
+    public static final int MAX_TOTAL_ORDER_COUNT = 20;
+}

리뷰: 이 부분도 제약조건으로 분리해서 설정한 부분 너무 좋습니다 👍
@@ -0,0 +1,26 @@
+package christmas.domain.category;
+
+import christmas.domain.menu.Menu;
+import christmas.domain.menu.MenuItem;
+
+public enum Drink implements MenuItem {
+    ZERO_COKE("제로콜라", 3000),
+    RED_WINE("레드와인", 60000),
+    CHAMPAGNE("샴페인", 25000);
+    private Menu menu;
+
+    Drink(String name, int price) {
+        this.menu = new Menu(name, price);
+    }
+
+    @Override
+    public Menu get() {
+        return menu;
+    }
+
+    @Override
+    public String getName() {
+        return menu.name();
+    }
+
+}

리뷰: 이 부분도 25_000과 같이 일관적인 형태로 사용하면 좋을 것 같아요!
@@ -0,0 +1,28 @@
+package christmas.domain.event.discount;
+
+import java.util.List;
+
+import christmas.domain.date.Date;
+import christmas.domain.reward.DiscountEventReward;
+import christmas.lib.event.DiscountEvent;
+
+import static christmas.constant.EventConstant.SPECIAL_DAY_MESSAGE;
+import static christmas.constant.EventConstant.SPECIAL_DAY_PRICE;
+
+public class SpecialDiscountEvent extends DiscountEvent<Void> {
+    private final List<Integer> SPECIAL_DAY = List.of(3, 10, 17, 24, 25, 31);
+    private final String EVENT_NAME = SPECIAL_DAY_MESSAGE;
+
+    @Override
+    public boolean checkCondition(Date date) {
+        if (SPECIAL_DAY.contains(date.day())) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public DiscountEventReward provideReward(Void object) {
+        return new DiscountEventReward(EVENT_NAME, SPECIAL_DAY_PRICE);
+    }
+}

리뷰: 저는 이 부분에 대해서는 다른 의견입니다!
`별` 이 달려있는 날이 이벤트 날로 적용한다는 조건이었기 때문에,
이 부분은 List로 정적으로 할당해주는게 오히려 더 적절한 설계였다고 생각해요!
@@ -0,0 +1,9 @@
+package christmas.constant;
+
+public interface BadgeConstant {
+    public static final int SANTA_THRESHOLD = 20000;
+    public static final int TREE_THRESHOLD = 10000;
+    public static final int STAR_THRESHOLD = 5000;
+    public static final int NON_THRESHOLD = 0;
+
+}

리뷰: 현재 구현하신 코드에서 `BadgeConstant` 는 `Badge` enum 에서  상수로 밖에 사용되지 않은 것으로 조금 불필요한 인터페이스지 않나 생각이듭니다. `Badge` enum 에서 이 부분은 함께 구현할 수 있다고 생각하는데 어떻게 생각하시나요?
@@ -0,0 +1,27 @@
+package christmas.constant;
+
+import christmas.domain.category.Drink;
+import christmas.domain.menu.Menu;
+
+public interface EventConstant {
+    public static final Integer EVENT_THRESHOLD_PRICE = 10000;
+
+    public static final Integer WEEKEND_DISCOUNT_PRICE = 2023;
+    public static final String WEEKEND_DISCOUNT_EVENT_MESSAGE = "주말 할인";
+
+    public static final Integer WEEKDAY_DISCOUNT_PRICE = 2023;
+    public static final String WEEKDAY_DISCOUNT_EVENT_MESSAGE = "평일 할인";
+
+
+    public static final Integer D_DAY_DISCOUNT_UNIT = 100;
+    public static final Integer D_DAY_START_PRICE = 1000;
+    public static final Integer CHRISTMAS_DAY = 25;
+    public static final String CHRISTMAS_EVENT_MESSAGE = "크리스마스 디데이 할인";
+
+    public static final Integer SPECIAL_DAY_PRICE = 1000;
+    public static final String SPECIAL_DAY_MESSAGE = "특별 할인";
+
+
+    public static final Integer CHAMPAGNE_LIMIT_PRICE = 120000;
+    public static final Menu CHAMPAGNE_PRESENT = Drink.CHAMPAGNE.get();
+}

리뷰: 이벤트 관련 상수를 저는 enum 으로 구현했습니다. 인터페이스로 상수들을 정의하신 이유가 궁금합니다!
@@ -0,0 +1,32 @@
+package christmas.domain.date;
+
+import christmas.exception.DateException;
+import christmas.exception.message.DateExceptionMessage;
+import christmas.util.Calendar;
+
+import static christmas.constant.DateConstant.START_DAY;
+import static christmas.constant.DateConstant.END_DAY;
+
+public record Date(int day, DayOfWeek dayOfWeek) {
+    public static Date of(int day) {
+        validate(day);
+
+        DayOfWeek dayOfWeek = getDayOfWeek(day);
+        return new Date(day, dayOfWeek);
+    }
+
+    private static void validate(int day) {
+        validateDayRange(day);
+    }
+
+    private static void validateDayRange(int day) {
+        if (day < START_DAY || day > END_DAY) {
+            throw new DateException(DateExceptionMessage.INVALID_DAY);
+        }
+    }
+
+    private static DayOfWeek getDayOfWeek(int day) {
+        return Calendar.calculateDayOfWeek(day);
+    }
+
+}

리뷰: 날짜 정보를 담은 불변객체를 이용하셨군요 👍 다만 현재 `Date` 객체는 날짜 정보와 요일 정보만 가지고 있는것으로 보이는데 그렇다면 이미 자바에서 제공하는 `LocalDate` 를 사용하는게 어떨까 하는 생각이 듭니다! 1주차 피드백에도 나오는 내용이니까 고려해보시면 좋을것 같습니다 😁
@@ -0,0 +1,25 @@
+package christmas.domain.event;
+
+import christmas.lib.event.DiscountEvent;
+import christmas.lib.event.Event;
+import christmas.lib.event.PresentEvent;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public record InProgressEventList(List<DiscountEvent> discountEventList,
+                                  List<PresentEvent> presentEventList) {
+    public static InProgressEventList of(List<Event> eventList) {
+        List<DiscountEvent> discountEventList = new ArrayList<>();
+        List<PresentEvent> presentEventList = new ArrayList<>();
+        for (Event event : eventList) {
+            if (event instanceof DiscountEvent) {
+                discountEventList.add((DiscountEvent) event);
+            }
+            if (event instanceof PresentEvent) {
+                presentEventList.add((PresentEvent) event);
+            }
+        }
+        return new InProgressEventList(discountEventList, presentEventList);
+    }
+}

리뷰: 이 부분은 약간 개선할 수도 있을것 같습니다!  이 클래스의 `of` 메소드는 `EventSercice` 에서 `EventFactory` 의 static 변수인 `EVENT_LIST` 를 파라미터로 넣어서 생성하는 부분에서만 쓰이는데 `EVENT_LIST` 는 항상 같은 값을 가지는 변수로 예상됩니다. 그렇다면 처음부터 할인 이벤트와 증정 이벤트를 따로 관리하는 방법은 어떨까요?
@@ -0,0 +1,45 @@
+package christmas.domain.event.discount;
+
+import java.util.List;
+
+import christmas.domain.date.Date;
+import christmas.domain.date.DayOfWeek;
+
+import christmas.domain.reward.DiscountEventReward;
+import christmas.domain.menu.Category;
+
+import christmas.domain.order.Bill;
+import christmas.domain.order.OrderInfo;
+import christmas.lib.event.DiscountEvent;
+
+import static christmas.constant.EventConstant.WEEKDAY_DISCOUNT_EVENT_MESSAGE;
+import static christmas.constant.EventConstant.WEEKDAY_DISCOUNT_PRICE;
+
+public class WeekdayDiscountEvent extends DiscountEvent<Bill> {
+    private final Integer DISCOUNT_PRICE = WEEKDAY_DISCOUNT_PRICE;
+    private final String EVENT_NAME = WEEKDAY_DISCOUNT_EVENT_MESSAGE;
+
+    @Override
+    public boolean checkCondition(Date date) {
+        DayOfWeek dayOfWeek = date.dayOfWeek();
+        if (dayOfWeek.isWeekday()) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public DiscountEventReward provideReward(Bill bill) {
+        List<OrderInfo> orderInfos = bill.orderDetail().get(Category.DESERT);
+        Integer count = countOrderMenu(orderInfos);
+        return new DiscountEventReward(EVENT_NAME, count * DISCOUNT_PRICE);
+    }
+
+    private int countOrderMenu(List<OrderInfo> orderInfos) {
+        int count = 0;
+        for (OrderInfo orderInfo : orderInfos) {
+            count += orderInfo.amount();
+        }
+        return count;
+    }
+}

리뷰: 이 부분은 stream 을 사용해 이렇게 구현할 수도 있습니다 😁
```java
public class WeekdayDiscountEvent extends DiscountEvent<Bill> {
    //...
    private int countOrderMenu(List<OrderInfo> orderInfos) {
        return orderInfos.stream()
             .mapToInt.(OrderInfo::amount)
             .sum();
    }
    //...
}
```
@@ -0,0 +1,55 @@
+package christmas.controller;
+
+import christmas.domain.date.Date;
+import christmas.domain.badge.Badge;
+import christmas.domain.reward.Reward;
+import christmas.domain.order.Bill;
+import christmas.dto.RewardDto;
+import christmas.factory.ControllerFactory;
+import christmas.view.OutputView;
+
+public class GameController {
+    private final DateController dateController = ControllerFactory.getDateController();
+    private final OrderController orderController = ControllerFactory.getOrderController();
+    private final EventController eventController = ControllerFactory.getEventController();
+    private final BadgeController badgeController = ControllerFactory.getBadgeController();
+
+    public void run() {
+        printWelcomeMessage();
+
+        Date date = dateController.acceptVisitDate();
+        Bill bill = orderController.acceptOrder();
+        printOrderResult(date, bill);
+
+        Reward reward = eventController.confirmReward(date, bill);
+        RewardDto rewardDto = reward.toDto();
+
+        printRewardResult(rewardDto);
+        printFinalCheckoutPrice(bill, rewardDto);
+
+        printBadgeResult(badgeController.grantBadge(rewardDto));
+    }
+
+    public void printWelcomeMessage() {
+        OutputView.printWelcomeMessage();
+    }
+
+    public void printOrderResult(Date date, Bill bill) {
+        OutputView.printPreviewMessage(date);
+        OutputView.printOrderMessage(bill);
+    }
+
+    public void printFinalCheckoutPrice(Bill bill, RewardDto rewardDto) {
+
+        int checkoutPrice = bill.totalPrice() - rewardDto.getTotalDiscountReward();
+        OutputView.printFinalCheckoutPriceMessage(checkoutPrice);
+    }
+
+    public void printRewardResult(RewardDto rewardDto) {
+        OutputView.printRewardsMessage(rewardDto);
+    }
+
+    public void printBadgeResult(Badge badge) {
+        OutputView.printBadgeMessage(badge);
+    }
+}

리뷰: 요구사항을 생각해서 , 
생성하고 같이 출력하는 식으로 생각했는데 , 
이렇게 print 구문 모아놓은거도 괜찮네요!!
@@ -0,0 +1,32 @@
+package christmas.domain.date;
+
+import christmas.exception.DateException;
+import christmas.exception.message.DateExceptionMessage;
+import christmas.util.Calendar;
+
+import static christmas.constant.DateConstant.START_DAY;
+import static christmas.constant.DateConstant.END_DAY;
+
+public record Date(int day, DayOfWeek dayOfWeek) {
+    public static Date of(int day) {
+        validate(day);
+
+        DayOfWeek dayOfWeek = getDayOfWeek(day);
+        return new Date(day, dayOfWeek);
+    }
+
+    private static void validate(int day) {
+        validateDayRange(day);
+    }
+
+    private static void validateDayRange(int day) {
+        if (day < START_DAY || day > END_DAY) {
+            throw new DateException(DateExceptionMessage.INVALID_DAY);
+        }
+    }
+
+    private static DayOfWeek getDayOfWeek(int day) {
+        return Calendar.calculateDayOfWeek(day);
+    }
+
+}

리뷰: 저도 보고 신기해서 놀랬습니다..
@@ -0,0 +1,37 @@
+package christmas.domain.event.discount;
+
+import christmas.domain.date.Date;
+import christmas.domain.reward.DiscountEventReward;
+import christmas.lib.event.DiscountEvent;
+
+import static christmas.constant.EventConstant.CHRISTMAS_DAY;
+import static christmas.constant.EventConstant.D_DAY_DISCOUNT_UNIT;
+import static christmas.constant.EventConstant.CHRISTMAS_EVENT_MESSAGE;
+import static christmas.constant.EventConstant.D_DAY_START_PRICE;
+
+
+public class ChristmasDiscountEvent extends DiscountEvent<Date> {
+    private final Integer D_DAY = CHRISTMAS_DAY;
+    private final Integer START_PRICE = D_DAY_START_PRICE;
+    private final Integer DISCOUNT_UNIT = D_DAY_DISCOUNT_UNIT;
+    private final String EVENT_NAME = CHRISTMAS_EVENT_MESSAGE;
+
+    @Override
+    public boolean checkCondition(Date date) {
+        if (date.day() <= D_DAY) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public DiscountEventReward provideReward(Date date) {
+        int currentDay = date.day();
+        int discountPrice = calculateDiscountPrice(currentDay);
+        return new DiscountEventReward(EVENT_NAME, discountPrice);
+    }
+
+    private Integer calculateDiscountPrice(int currentDay) {
+        return START_PRICE + (currentDay - 1) * DISCOUNT_UNIT;
+    }
+}

리뷰: 자동 정렬이 , 밑으로 내려가서 변경한다고 신경썼는데
해당 부분은 놓쳤네요 ㅠㅠ
@@ -0,0 +1,14 @@
+package christmas.controller;
+
+import christmas.domain.badge.Badge;
+import christmas.dto.RewardDto;
+import christmas.factory.ServiceFactory;
+import christmas.service.BadgeService;
+
+public class BadgeController {
+    private BadgeService badgeService = ServiceFactory.getBadgeService();
+
+    public Badge grantBadge(RewardDto rewardDto) {
+        return this.badgeService.createBadge(rewardDto.totalRewardPrice());
+    }
+}

리뷰: grantBadge! 클래스명에서 센스가 넘치네요 ㅋㅋ 그런데 혹시 get 대신에 grant를 메소드명으로 선언한 이유가 있을까요?
@@ -0,0 +1,25 @@
+package com.example.chatgptcodereviewtest.controller;
+
+import com.example.chatgptcodereviewtest.dto.InputDto;
+import com.example.chatgptcodereviewtest.service.TestService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 설명:
+ *
+ * @author 최현범(Jayce) / hb.choi@dreamus.io
+ * @since 2023/03/23
+ */
+@RestController
+@RequestMapping("/test")
+@RequiredArgsConstructor
+public class TestController {
+
+    private final TestService testService;
+
+    @PostMapping
+    public int convertText(@RequestBody InputDto inputDto) {
+        return testService.addAgeAndNameLength(inputDto);
+    }
+}

리뷰: 위 코드 조각에서는 `TestController` 클래스를 정의하고 있으며, 해당 컨트롤러의 `convertText` 메소드는 `InputDto` 객체를 받아들여 `testService`에서 `addAgeAndNameLength` 메소드를 호출한 결과를 반환합니다.

이 코드 조각에 대한 주요 개선 제안은 다음과 같습니다:

1. 컨트롤러와 서비스 클래스의 이름을 더 명확하게 나타낼 수 있도록 변경하는 것이 좋습니다.
2. 컨트롤러에서 사용된 경로명(`"/test"`) 및 HTTP 메소드(`@PostMapping`)에 대해 충분한 설명이 없으므로 API의 의도를 더 잘 설명할 필요가 있습니다.
3. `InputDto` 클래스의 필드 유효성 검사를 위한 검증 어노테이션 등의 추가적인 벨리데이션 로직이 필요합니다.

문제점으로는 현재 코드 상태에 문법적인 오류나 기능상의 큰 위험은 보이지 않습니다.
@@ -0,0 +1,22 @@
+package com.example.chatgptcodereviewtest.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+/**
+ * 설명:
+ *
+ * @author 최현범(Jayce) / hb.choi@dreamus.io
+ * @since 2023/03/23
+ */
+@Getter
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+public class InputDto {
+
+    private String name;
+    private int age;
+}

리뷰: 위 코드는 lombok 라이브러리를 이용해 InputDto 클래스를 생성하고 있는 것으로 보입니다. 

개선점:
1. 클래스와 변수 이름을 더 명확하게 적어주면 좋겠습니다.
2. Setter가 없기 때문에 name과 age에 대한 일부 정보 변경이 불가능합니다. 따라서, 해당 DTO를 사용하는 클래스에서 제어할 수 있도록 Setter 메소드 추가를 고려해볼 필요성이 있습니다.

버그 가능성:
현재 해당 코드에서 버그는 보이지 않습니다.
@@ -0,0 +1,20 @@
+package com.example.chatgptcodereviewtest.service;
+
+import com.example.chatgptcodereviewtest.dto.InputDto;
+import org.springframework.stereotype.Service;
+
+/**
+ * 설명:
+ *
+ * @author 최현범(Jayce) / hb.choi@dreamus.io
+ * @since 2023/03/23
+ */
+@Service
+public class TestService {
+
+    public int addAgeAndNameLength(InputDto inputDto) {
+        int age = inputDto.getAge();
+        int nameLength = inputDto.getName().length();
+        return age + nameLength;
+    }
+}

리뷰: 위의 코드 리뷰에 대한 제 생각입니다.

기능적으로 문제가 없어 보이며, 추가 개선 사항은 없습니다. 그러나 몇 가지 작은 수정 사항을 제안해 드리겠습니다:

- 주석이 상세하지 않아 변경 된 프로젝트에 대해 충분한 설명을 제공하지 않습니다. 메소드 이름 'addAgeAndNameLength' 자체가 기능을 설명하는 데 매우 포괄적입니다. 좀 더 구체적인 메소드 및 클래스 설명과 함께 주석을 추가하는 것이 좋습니다.
- 모든 예외를 처리 할 수 있도록 try-catch 블록을 추가할 수 있습니다.

예측할 수없는 값을 전달하여 출력 값이 음수가되는 경우 등 위험성이 있는 기능은 없으며, 기본 유닛 테스트를 작성하여 코드의 정확성을 검증하는 것이 좋습니다.
@@ -0,0 +1,49 @@
+package lotto.domain;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class LottoGame {
+    private static final int TICKET_PRICE = 1000;
+
+    List<LottoTicket> lottoTickets;
+    LottoMatch lottoMatch;
+
+    public LottoGame() {
+        this.lottoTickets = new ArrayList<>();
+    }
+
+    public List<LottoTicket> buyLottoTicket(int money) {
+        int ticketNum = money / TICKET_PRICE;
+
+        for (int i = 0; i < ticketNum; i++) {
+            this.lottoTickets.add(new LottoTicket());
+        }
+
+        return this.lottoTickets;
+    }
+
+    public HashMap<LottoMatchNumber, Integer> winLotto() {
+        return this.lottoMatch.matchResult(lottoTickets);
+    }
+
+    public void inputTargetNumbers(String input) {
+        lottoMatch = new LottoMatch(input);
+    }
+
+
+    public double checkIncome(HashMap<LottoMatchNumber, Integer> results, int money){
+        double income = 0;
+
+        int totalIncome = 0;
+        for (LottoMatchNumber lottoMatchNumber : LottoMatchNumber.values()) {
+            totalIncome += lottoMatchNumber.totalPrizeMoney(results.get(lottoMatchNumber));
+        }
+
+        income = (double) totalIncome/money;
+
+        return income;
+    }
+
+}

리뷰: 접근 제한자를 붙이는게 좋을 것 같네요.
@@ -0,0 +1,28 @@
+package lotto.domain;
+
+import stringcalculator.Operation;
+
+public enum LottoMatchNumber {
+    MATCH3(3, 5000) {int totalPrizeMoney(int count) {return prizeMoney * count;}},
+    MATCH4(4, 50000) {int totalPrizeMoney(int count) {return prizeMoney * count;}},
+    MATCH5(5, 1500000) {int totalPrizeMoney(int count) {return prizeMoney * count;}},
+    MATCH6(6, 2000000000) {int totalPrizeMoney(int count) {return prizeMoney * count;}};
+
+    private final int matchNumber;
+    protected final int prizeMoney;
+    abstract int totalPrizeMoney(int count);
+
+    LottoMatchNumber(int matchNumber, int prizeMoney) {
+        this.matchNumber = matchNumber;
+        this.prizeMoney = prizeMoney;
+    }
+
+    public int getMatchNumber() {
+        return matchNumber;
+    }
+
+    @Override
+    public String toString() {
+        return matchNumber + "개 일치 (" + prizeMoney + "원)";
+    }
+}

리뷰: enum도 비즈니스 로직의 일부이므로 view 부분의 구현을 enum에 두는건 좋지 않을 것 같아요.
@@ -0,0 +1,28 @@
+package lotto.domain;
+
+import stringcalculator.Operation;
+
+public enum LottoMatchNumber {
+    MATCH3(3, 5000) {int totalPrizeMoney(int count) {return prizeMoney * count;}},
+    MATCH4(4, 50000) {int totalPrizeMoney(int count) {return prizeMoney * count;}},
+    MATCH5(5, 1500000) {int totalPrizeMoney(int count) {return prizeMoney * count;}},
+    MATCH6(6, 2000000000) {int totalPrizeMoney(int count) {return prizeMoney * count;}};
+
+    private final int matchNumber;
+    protected final int prizeMoney;
+    abstract int totalPrizeMoney(int count);
+
+    LottoMatchNumber(int matchNumber, int prizeMoney) {
+        this.matchNumber = matchNumber;
+        this.prizeMoney = prizeMoney;
+    }
+
+    public int getMatchNumber() {
+        return matchNumber;
+    }
+
+    @Override
+    public String toString() {
+        return matchNumber + "개 일치 (" + prizeMoney + "원)";
+    }
+}

리뷰: 등수별로 모두 동일한 구현체를 가진 것 같은데요. 추상 메서드로 정의될 필요가 있는지 고민이 필요해보여요.

그리고 현재 로또 도메인에서 enum이 로또의 등수별 개수 및 당첨 금액을 나타내는 역할을 하고 있습니다. 고정된 상수들만 가지는게 아니라 받은 개수만큼 곱해서 계산해주는 역할을 가지는게 적절할지도 고민해보시면 좋겠네요.
@@ -0,0 +1,49 @@
+package lotto.domain;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class LottoGame {
+    private static final int TICKET_PRICE = 1000;
+
+    List<LottoTicket> lottoTickets;
+    LottoMatch lottoMatch;
+
+    public LottoGame() {
+        this.lottoTickets = new ArrayList<>();
+    }
+
+    public List<LottoTicket> buyLottoTicket(int money) {
+        int ticketNum = money / TICKET_PRICE;
+
+        for (int i = 0; i < ticketNum; i++) {
+            this.lottoTickets.add(new LottoTicket());
+        }
+
+        return this.lottoTickets;
+    }
+
+    public HashMap<LottoMatchNumber, Integer> winLotto() {
+        return this.lottoMatch.matchResult(lottoTickets);
+    }
+
+    public void inputTargetNumbers(String input) {
+        lottoMatch = new LottoMatch(input);
+    }
+
+
+    public double checkIncome(HashMap<LottoMatchNumber, Integer> results, int money){
+        double income = 0;
+
+        int totalIncome = 0;
+        for (LottoMatchNumber lottoMatchNumber : LottoMatchNumber.values()) {
+            totalIncome += lottoMatchNumber.totalPrizeMoney(results.get(lottoMatchNumber));
+        }
+
+        income = (double) totalIncome/money;
+
+        return income;
+    }
+
+}

리뷰: 중요한 부분은 아니지만 Stream.generate를 통해 불변 형태로 표현할 수 있을 것 같네요. 가변보다는 불변 형태로 표현하는게 사이드 이펙트도 적고 가독성 측면에서도 좋을 것 같아요.
@@ -0,0 +1,49 @@
+package lotto.domain;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class LottoGame {
+    private static final int TICKET_PRICE = 1000;
+
+    List<LottoTicket> lottoTickets;
+    LottoMatch lottoMatch;
+
+    public LottoGame() {
+        this.lottoTickets = new ArrayList<>();
+    }
+
+    public List<LottoTicket> buyLottoTicket(int money) {
+        int ticketNum = money / TICKET_PRICE;
+
+        for (int i = 0; i < ticketNum; i++) {
+            this.lottoTickets.add(new LottoTicket());
+        }
+
+        return this.lottoTickets;
+    }
+
+    public HashMap<LottoMatchNumber, Integer> winLotto() {
+        return this.lottoMatch.matchResult(lottoTickets);
+    }
+
+    public void inputTargetNumbers(String input) {
+        lottoMatch = new LottoMatch(input);
+    }
+
+
+    public double checkIncome(HashMap<LottoMatchNumber, Integer> results, int money){
+        double income = 0;
+
+        int totalIncome = 0;
+        for (LottoMatchNumber lottoMatchNumber : LottoMatchNumber.values()) {
+            totalIncome += lottoMatchNumber.totalPrizeMoney(results.get(lottoMatchNumber));
+        }
+
+        income = (double) totalIncome/money;
+
+        return income;
+    }
+
+}

리뷰: 일반적으로 메서드 리턴 타입이나 파라미터 등은 다형성 측면에서 이점이 없기 때문에 구체 타입(HashMap)을 사용하지 않습니다. 이유가 있는게 아니라면 인터페이스인 Map을 리턴 타입으로 쓰시는게 어떨까요?