[내일배움캠프 Spring_3기] CH2 커머스 과제 Step2

jiiim_ni·2026년 1월 22일

생각해보기

Step2 요구사항을 읽어보니, 새로운 기능을 추가하는 것이 아니라 기존 Step1 구조를 개선하는 데 있다고 느꼈다.

Main 클래스가 너무 많은 역할을 담당하고 있었고, 입력, 출력, 반복, 종료 흐름이 모두 main 메서드에 몰려 있었다.

그래서 Step2에서는 클래스를 분리하는 것이 목표였다.


설계

Step2에서는 역할과 책임을 다음과 같이 나누었다.

Main 클래스

  • 프로그램 시작 지점
  • 상품 데이터 생성
  • CommerceSystem 객체 생성 및 start() 호출

CommerceSystem 클래스

  • 메뉴 출력
  • 사용자 입력 처리
  • 반복 및 종료 제어
  • 상품 선택 로직 처리

CommerceSystem 클래스

Step1에서는 main 메서드 안에 while문과 scanner, 메뉴 출력과 입력 분기 로직이 모두 들어 있었다.
Step2에서는 이 흐름을 하나의 클래스로 묶어 프로그램 실행 흐름을 책임지는 객체로 분리했다.

필드 설계

  • List<Product>: Main에서 만든 상품 리스트를 전달받아 관리
  • Scanner: 사용자 입력 처리

생성자

public CommerceSystem(List<Product> products) {
    this.products = products;
}

Main에서 만든 상품 리스트를 생성자를 통해 CommerceSystem에 전달하도록 설계했다.
이를 통해 CommerceSystem은 상품이 어디서 만들어졌는지는 알 필요가 없고 그저 전달받은 상품 목록을 사용하는 역할만 한다.

start() 메서드

start() 메서드는 프로그램의 시작점 역할을 한다.

  • 메뉴 출력
  • 입력 처리
  • 종료 조건 판단
    을 반복하며 0이 입력되면 반복문을 종료하도록 구현했다.

CommerceSystem.java 전체코드

package kr.spartaclub.com.example.commerce.step2;

import kr.spartaclub.com.example.commerce.Product;

import java.util.List;
import java.util.Scanner;

public class CommerceSystem {

    private final List<Product> products;
    private final Scanner sc = new Scanner(System.in);

    // 생성자: Main에서 만든 상품 리스트를 전달받음
    public CommerceSystem(List<Product> products) {
        this.products = products;
    }

    // 프로그램 시작 메서드
    public void start() {
        while (true) {
            printMenu();
            int input = sc.nextInt();

            if (input == 0) {
                System.out.println();
                System.out.println("커머스 플랫폼을 종료합니다.");
                break;
            }

            handleInput(input);
        }
    }

    // 메뉴 출력
    private void printMenu() {
        System.out.println("[ 실시간 커머스 플랫폼 - 전자제품 ]");

        for (int i = 0; i < products.size(); i++) {
            Product p = products.get(i);
            System.out.printf("%d. %-12s | %,d원 | %s%n",
                    i + 1, p.getName(), p.getPrice(), p.getDescription());
        }

        System.out.println("0. 종료           | 프로그램 종료");
        System.out.print("> ");
    }

    // 입력값 처리
    private void handleInput(int input) {
        if (input >= 1 && input <= products.size()) {
            Product selected = products.get(input - 1);

            System.out.println();
            System.out.printf(
                    "선택한 상품: %s | %,d원 | %s | 재고: %d개%n%n",
                    selected.getName(),
                    selected.getPrice(),
                    selected.getDescription(),
                    selected.getStock()
            );
        } else {
            System.out.println();
            System.out.println("잘못된 입력입니다. 다시 선택해주세요.\n");
        }
    }
}

Main 클래스 변화

step2 이후 Main 클래스는 훨씬 단순해졌다.
while문, scanner, 입출력 로직이 다 제거되었다.
Main은 이제 프로그램을 실행시키는 역할만 담당한다.

CommerceSystem system = new CommerceSystem(products);
system.start();

Main.java 전체코드

package kr.spartaclub.com.example.commerce.step2;

import kr.spartaclub.com.example.commerce.Product;

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {

        List<Product> products = new ArrayList<>();

        products.add(new Product("Galaxy S25", 1200000, "최신 안드로이드 스마트폰", 50));
        products.add(new Product("iPhone 16", 1350000, "Apple의 최신 스마트폰", 30));
        products.add(new Product("MacBook Pro", 2400000, "M3 칩셋이 탑재된 노트북", 15));
        products.add(new Product("AirPods Pro", 350000, "노이즈 캔슬링 무선 이어폰", 50));

        // Step2 핵심
        CommerceSystem system = new CommerceSystem(products);
        system.start();
    }
}

결과

Step1과 동일한 결과가 출력되며,
내부 구조만 개선되었음을 확인할 수 있었다.

0개의 댓글