홈 › 미니 프로젝트 › 01 / 4

1단계: 콘솔 주문 관리 (초급 기술)

섹션 6진행 0 / 4

2. 설계

2.1 클래스 구성

text
┌────────────────────────────────────────────────────────────────┐
│  Main (static)                                                 │
│  ─────────────────────────────────────────────────────────────  │
│  Member[]  members   / int memberCount    (MAX_MEMBERS  = 3)   │
│  Product[] products  / int productCount   (MAX_PRODUCTS = 4)   │
│  Order[]   orders    / int orderCount     (MAX_ORDERS   = 3)   │
│  int nextOrderId                                               │
│  ─────────────────────────────────────────────────────────────  │
│  registerMember()  registerProduct()                           │
│  findMember()      findProduct()          ← 선형 탐색           │
│  createOrder()                                                 │
│  orderTotal()  printOrders()  totalSales()                     │
│  printSalesByMember()  printStock()  format()                  │
└──────┬───────────────────┬───────────────────────┬─────────────┘
       │ 저장               │ 저장                   │ 저장
       ▼                   ▼                       ▼
┌─────────────┐   ┌──────────────────┐   ┌──────────────────────────┐
│ Member      │   │ Product          │   │ Order                    │
│ ─────────── │   │ ──────────────── │   │ ──────────────────────── │
│ id          │   │ id               │   │ id                       │
│ name        │   │ name             │   │ memberId      ──────────▶ Member.id
│ point       │   │ category         │   │ int[] productIds ───────▶ Product.id
│ ─────────── │   │ price            │   │ int[] quantities         │
│ addPoint()  │   │ stock            │   │ lineCount  (MAX_LINES=3) │
└─────────────┘   │ ──────────────── │   │ ──────────────────────── │
                  │ decreaseStock()  │   │ addLine()                │
                  └──────────────────┘   └──────────────────────────┘

2.2 각 클래스의 책임

클래스 책임 갖지 않는 것
Member 회원 데이터 보관, 포인트 증가 검증, 조회
Product 상품 데이터 보관, 재고 차감 재고 검증(호출자가 함)
Order 주문 항목을 병렬 배열 두 개로 보관 합계 계산(상품 단가를 모르므로 못 함)
Main 저장(배열), 조회(탐색), 검증, 주문 생성, 집계, 출력 — 전부 —

의도적으로 Main에 책임을 몰아 두었다. 초급 단계에서 배운 "메서드로 나누기"는 했지만, "클래스로 나누기"는 아직 데이터 클래스 수준에 머문다. Order가 자기 합계를 계산하지 못하는 이유는 Order가 상품 ID(int)만 알고 Product 객체를 모르기 때문이다 — 객체 참조 대신 ID를 저장하는 설계의 한계가 바로 드러난다.

2.3 왜 "병렬 배열"인가

주문 항목은 (상품 ID, 수량) 쌍의 목록이다. 초급 도구로는 두 가지 선택지가 있다.

방법 장점 단점
int[] productIds + int[] quantities (병렬 배열) 클래스가 하나 덜 필요 두 배열의 인덱스가 어긋나면 데이터가 깨짐. 항목 하나를 "한 덩어리"로 다룰 수 없음
OrderLine[] lines (항목 클래스) 항목이 객체 하나 클래스 하나 추가

이 단계에서는 일부러 병렬 배열을 골랐다. 2단계에서 OrderLine 클래스로 바꿀 때 "무엇이 좋아졌는가"를 대비시키기 위해서다.

2.4 저장 구조: 고정 배열 + 카운터

text
members   [ M1 ][ M2 ][ M3 ]            memberCount = 3  (가득 참)
products  [ P101 ][ P102 ][ P103 ][ P104 ]   productCount = 4
orders    [ O1 ][ O2 ][ O3 ]            orderCount = 3   (가득 참)

배열은 크기를 바꿀 수 없으므로 MAX_* 상수와 "지금까지 채운 개수" 카운터를 쌍으로 관리한다. 등록 메서드는 카운터가 최대치에 도달했는지 먼저 확인한다. 이 패턴은 ArrayList가 내부에서 하는 일과 정확히 같다 — 단, ArrayList는 꽉 차면 스스로 확장하고 우리 배열은 그냥 거부한다.