
public static void main(String[] args)Product 클래스 생성하기상품명, 가격, 설명, 재고수량 필드를 갖습니다.main 함수에서 Product 클래스를 생성하여 상품 목록을 추가합니다.Product 객체 생성을 통해 상품명, 가격, 설명, 재고수량을 세팅합니다.newList를 선언하여 여러 Product을 추가합니다.List<Product> products = new ArrayList<>();products를 탐색하면서 하나씩 접근합니다.Step1 요구사항을 읽어보니 이번 단계의 핵심은 새로운 기능을 많이 추가하는 것이 아니라
Step1에서는 전자제품 카테고리만 다루기 때문에, 상품 데이터는 main에서 직접 생성해도 된다고 판단했다.
(이후 Step3에서 변경할 예정)
Step1에서는 Main이 다음 역할을 모두 담당한다
상품은 상품명/가격/설명/재고 처럼 항상 함께 움직이는 정보 묶음이기 때문에 각각 따로 변수로 관리하기 보다 Product 객체로 묶어 관리하는 편이 확장에 유리하다고 판단했다.
필드 구성
name, price, description은 바뀔 일이 없으므로 final로 두고, stock은 이후 주문에서 감소할 수 있으므로 변경 가능하게 두었다.
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; }
}
List<Product>를 사용한 이유상품은 여러 개가 누적되어 관리되어야 하기 때문에 List를 선택했다.
List<Product> products = new ArrayList<>();
리스트에 담긴 상품들을 순회하면서 "번호 + 상품 정보" 형태로 출력했다.
이때 리스트 인덱스는 0부터 시작하지만 메뉴 번호는 1부터가 자연스럽기 때문에 i + 1로 출력했다.
또한 가격은 %, d 포멧을 사용해 1,200,000처럼 보이게 처리했다.
사용자가 입력한 값이 1~products.size() 범위 안일 때만 상품을 선택하도록 했고, 그 외 입력은 "잘못된 입력" 메시지를 출력하도록 했다.
선택된 상품은 products.get(input-1)로 가져오는데, 이는 사용자 입력(1~)을 리스트 인덱스(0~)로 변환하기 위해서이다.
0은 프로그램 종료 역할이므로 가장 먼저 체크하고 break로 반복문을 종료했다.
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 입력 시 종료된다.