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

jiiim_ni·2026년 1월 22일
post-thumbnail

필수 기능 가이드

  • 기초적인 흐름 제어 및 객체 지향 설계 개념을 복습합니다.
  • 커머스 플랫폼의 특성(상품/카테고리/고객/주문/재고)을 고려하여 요구사항을 반영한 클래스 설계
  • 단순 기능 구현에 그치지 않고, Product, Category, Customer, CommerceSystem 등 각 객체의 역할과 책임(R&R)을 어떻게 나누고 협력시킬지 고민하며 구현

클래스 정의

  • Main: 시작 지점이 되는 클래스, public static void main(String[] args)
  • Product: 개별 상품 정보를 가지는 클래스
    - 상품명, 가격, 설명, 재고수량
    • 예시: Galaxy S24, 1200000, 최신 스마트폰, 50
    • `new Product("Galaxy S24", 1200000, "최신 스마트폰", 50)
  • CommerceSystem: 프로그램 비즈니스 로직 클래스
  • Category: Product 클래스를 관리하는 클래스
    • 예시: 전자제품, 의류, 식품 등 각 카테고리 내에 여러 Product를 포함합니다.

Step1: 객체 지향 설계를 적용해 상품 관리 시스템 프로그래밍

  • 상품 목록 출력
    • JAVA 프로그램을 실행하면 여러 전자제품을 출력합니다.
    • 제시된 상품 중 입력받은 숫자에 따라 다른 로직을 실행하는 코드를 작성합니다.
  • Product 클래스 생성하기
    • 설명 : 개별 상품을 관리하는 클래스입니다. 현재는 전자제품만 관리합니다.
    • 클래스는 상품명, 가격, 설명, 재고수량 필드를 갖습니다.
  • main 함수에서 Product 클래스를 생성하여 상품 목록을 추가합니다.
    • Product 객체 생성을 통해 상품명, 가격, 설명, 재고수량을 세팅합니다.
      • 키워드: new
    • List를 선언하여 여러 Product을 추가합니다.
      • List<Product> products = new ArrayList<>();
    • 반복문을 활용해 products를 탐색하면서 하나씩 접근합니다.

생각해보기

Step1 요구사항을 읽어보니 이번 단계의 핵심은 새로운 기능을 많이 추가하는 것이 아니라

  • Product 클래스로 상품 정보를 객체로 관리하기
  • List< Product>로 여러 상품을 한번에 다루기
  • 콘솔 메뉴(출력 -> 입력 -> 분기 -> 반복) 기본 흐름 만들기
    라고 정리했다.

Step1에서는 전자제품 카테고리만 다루기 때문에, 상품 데이터는 main에서 직접 생성해도 된다고 판단했다.
(이후 Step3에서 변경할 예정)


설계

Step1에서는 Main이 다음 역할을 모두 담당한다

  • 상품 데이터 준비(상품 객체 생성 및 리스트에 저장)
  • 메뉴 출력
  • 사용자 입력 처리
  • 입력값에 따른 분기(상품 선택/오류/종료)
  • 반복/종료 제어

Product 클래스 구현

Product 클래스를 만든 이유

상품은 상품명/가격/설명/재고 처럼 항상 함께 움직이는 정보 묶음이기 때문에 각각 따로 변수로 관리하기 보다 Product 객체로 묶어 관리하는 편이 확장에 유리하다고 판단했다.

필드 구성

  • name: 상품명
  • price: 가격
  • description: 설명
  • stock: 재고수량

name, price, description은 바뀔 일이 없으므로 final로 두고, stock은 이후 주문에서 감소할 수 있으므로 변경 가능하게 두었다.

Product.java 전체코드

package kr.spartaclub.com.example.commerce;

public class Product {

    // 상품의 기본 정보 (생성 후 바뀌지 않는 값이므로 final로 둠)
    private final String name;        // 상품명
    private final int price;          // 가격
    private final String description; // 설명

    // 재고는 주문/장바구니 구현 시 감소할 수 있으므로 final X
    private int stock;                // 재고수량

    
    public Product(String name, int price, String description, int stock) {
        this.name = name;
        this.price = price;
        this.description = description;
        this.stock = stock;
    }

    // 캡슐화: 필드에 직접 접근하지 않고 getter로만 꺼내도록 설계
    public String getName() { return name; }

    public int getPrice() { return price; }

    public String getDescription() { return description; }

    public int getStock() { return stock; }
}

Main 클래스 구현

List<Product>를 사용한 이유

상품은 여러 개가 누적되어 관리되어야 하기 때문에 List를 선택했다.

  • List: 순서대로 저장하고 반복문으로 출력하기 편함
  • ArrayList: 가장 기본적인 List 구현체
List<Product> products = new ArrayList<>();

메뉴 출력: 반복문으로 상품 목록 보여주기

리스트에 담긴 상품들을 순회하면서 "번호 + 상품 정보" 형태로 출력했다.
이때 리스트 인덱스는 0부터 시작하지만 메뉴 번호는 1부터가 자연스럽기 때문에 i + 1로 출력했다.
또한 가격은 %, d 포멧을 사용해 1,200,000처럼 보이게 처리했다.

입력처리: 정상 범위 체크

사용자가 입력한 값이 1~products.size() 범위 안일 때만 상품을 선택하도록 했고, 그 외 입력은 "잘못된 입력" 메시지를 출력하도록 했다.
선택된 상품은 products.get(input-1)로 가져오는데, 이는 사용자 입력(1~)을 리스트 인덱스(0~)로 변환하기 위해서이다.

종료 조건: 0 입력 시 종료

0은 프로그램 종료 역할이므로 가장 먼저 체크하고 break로 반복문을 종료했다.

Main.java 전체코드

package kr.spartaclub.com.example.commerce;

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


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

        // 1) 여러 상품을 담기 위한 리스트 생성
        //    List 인터페이스로 선언하면 나중에 구현체(ArrayList 등)를 바꿔도 코드 변경이 적음
        List<Product> products = new ArrayList<>();

        // 2) Product 객체 생성(new) 후 리스트에 추가
        //    -> "데이터(상품)"를 객체로 만들고, 여러 개를 List로 관리하는 것이 Step1 핵심
        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));

        // 3) 사용자 입력을 받기 위한 Scanner 준비
        Scanner sc = new Scanner(System.in);

        // 4) 프로그램은 사용자가 "0(종료)"를 입력할 때까지 반복 실행
        while (true) {

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

            // 4-2) 리스트에 들어있는 Product들을 순회하면서 번호 + 정보 출력
            for (int i = 0; i < products.size(); i++) {
                Product p = products.get(i);

                // 번호는 사람이 보기 좋게 1부터 시작하게 출력 (인덱스는 0부터지만)
                // %,d -> 숫자에 콤마(,)
                // %-12s -> 문자열 왼쪽 정렬(출력 정렬 예쁘게)
                System.out.printf("%d. %-12s | %,d원 | %s%n",
                        i + 1, p.getName(), p.getPrice(), p.getDescription());
            }

            // 4-3) 종료 메뉴
            System.out.println("0. 종료           | 프로그램 종료");

            // 5) 사용자 입력 받기
            System.out.print("> ");
            int input = sc.nextInt();

            // 6) 입력값에 따라 분기 처리
            if (input == 0) {
                System.out.println();
                System.out.println("커머스 플랫폼을 종료합니다.");
                break; // while 탈출(프로그램 종료)
            }

            // 7) 정상 범위(1~상품개수) 체크
            if (input >= 1 && input <= products.size()) {
                Product selected = products.get(input - 1); // 번호(1~) -> 인덱스(0~) 변환

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

        // 9) 자원 정리
        sc.close();
    }
}

결과

프로그램 실행 시 전자제품 목록이 출력되고,
번호를 입력하면 해당 상품 정보가 출력된다.
또한 0 입력 시 종료된다.

0개의 댓글