중급컬렉션 프레임워크

HashMap 상품 관리

HashMap을 사용하여 상품 ID를 키로 하는 상품 관리 시스템을 구현합니다. Key-Value 자료구조의 활용법을 학습합니다.

HashMapKey-Value컬렉션 순회

HashMap 상품 관리 시스템

📋 문제 설명

HashMap을 사용하여 상품 ID를 키로 하는 상품 관리 시스템을 구현하세요.

Key-Value 자료구조의 활용법과 빠른 검색 방법을 학습합니다.


🎯 학습 목표

  • HashMap의 기본 사용법
  • Key-Value 쌍으로 데이터 저장 및 관리
  • 상품 ID를 Key로 활용한 빠른 검색
  • HashMap 순회 방법

💻 코드 구조

Product 클래스

Java
import java.util.HashMap;
import java.util.Map;

class Product {
    private String id;
    private String name;
    private double price;

    // TODO: Product 클래스의 디폴트 생성자를 만드세요.

    // TODO: Product 클래스의 다음 생성자를 구현하세요.
    // 힌트: id, name, price를 매개변수로 받아 초기화합니다.
    public Product(String id, String name, double price) {
        // this.id = id;
        // this.name = name;
        // this.price = price;
    }

    // TODO: getter 메소드들을 구현하세요.
    // public String getId() { return id; }
    // public String getName() { return name; }
    // public double getPrice() { return price; }

    // TODO: print 함수
    // 힌트: "ID: [id], 상품명: [name], 가격: [price]원" 형식 출력
}

필드

  • private String id - 상품 ID (Key로 사용)
  • private String name - 상품명
  • private double price - 가격

구현해야 할 것

  • 디폴트 생성자
  • 매개변수가 있는 생성자
  • 모든 필드에 대한 getter
  • print() 메서드

OnlineStore 클래스

Java
class OnlineStore {
    private HashMap<String, Product> products;

    public OnlineStore() {
        // TODO: products HashMap을 초기화하세요.
        // 힌트: products = new HashMap<>();
    }

    public void addProduct(Product product) {
        // TODO: 상품을 HashMap에 추가하세요.
        // 힌트: 상품 ID를 키로 사용합니다.
        // products.put(product.getId(), product);
    }

    public Product findProduct(String id) {
        // TODO: 주어진 ID로 상품을 찾아 반환하세요.
        // 힌트: products.get(id)를 사용
        // 찾지 못하면 null이 반환됩니다.
        return null;
    }

    public void removeProduct(String id) {
        // TODO: 주어진 ID의 상품을 HashMap에서 제거하세요.
        // 힌트: products.remove(id)를 사용
    }

    public void displayAllProducts() {
        // TODO: 모든 상품의 정보를 출력하세요.
        // 힌트:
        // 1. entrySet()을 사용하여 HashMap을 순회
        // 2. for (Map.Entry<String, Product> entry : products.entrySet())
        // 3. entry.getValue()로 Product 객체를 가져와서 print() 호출
        // 4. 상품이 없으면 "등록된 상품이 없습니다." 출력
    }
}

필드

  • private HashMap<String, Product> products - 상품 맵 (Key: 상품ID, Value: Product 객체)

메서드

  • addProduct() - 상품 추가 (Create)
  • findProduct() - ID로 상품 검색 (Read) - O(1) 시간 복잡도!
  • removeProduct() - ID로 상품 삭제 (Delete)
  • displayAllProducts() - 전체 상품 출력 (Read)

📝 Main 클래스 테스트

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

        OnlineStore store = new OnlineStore();

        // TODO: 최소 3개의 상품을 생성하고 store에 추가하세요.
        // 힌트:
        // Product product1 = new Product("P001", "스마트폰", 899000.0);
        // store.addProduct(product1);
        // ... (나머지 상품도 동일하게)

        // 상품 정보:
        // - ID: "P001", 이름: "스마트폰", 가격: 899000
        // - ID: "P002", 이름: "노트북", 가격: 1299000
        // - ID: "P003", 이름: "무선이어폰", 가격: 199000

        // TODO: 모든 상품 정보를 출력하세요.
        System.out.println("=== 전체 상품 목록 ===");
        // store.displayAllProducts();

        // TODO: ID가 "P002"인 상품을 검색하고 그 정보를 출력하세요.
        System.out.println("\n=== P002 상품 검색 ===");
        // Product found = store.findProduct("P002");
        // if (found != null) {
        //     found.print();
        // } else {
        //     System.out.println("상품을 찾을 수 없습니다.");
        // }

        // TODO: ID가 "P001"인 상품을 삭제하세요.
        System.out.println("\n=== P001 상품 삭제 ===");
        // store.removeProduct("P001");
        // System.out.println("상품이 삭제되었습니다.");

        // TODO: 삭제 후 모든 상품 정보를 다시 출력하세요.
        System.out.println("\n=== 삭제 후 전체 상품 목록 ===");
        // store.displayAllProducts();
    }
}

예상 출력:

Java
=== 전체 상품 목록 ===
ID: P001, 상품명: 스마트폰, 가격: 899000원
ID: P002, 상품명: 노트북, 가격: 1299000원
ID: P003, 상품명: 무선이어폰, 가격: 199000원

=== P002 상품 검색 ===
ID: P002, 상품명: 노트북, 가격: 1299000원

=== P001 상품 삭제 ===
상품이 삭제되었습니다.

=== 삭제 후 전체 상품 목록 ===
ID: P002, 상품명: 노트북, 가격: 1299000원
ID: P003, 상품명: 무선이어폰, 가격: 199000원

💡 학습 포인트

1. HashMap 기본 사용법

Java
// 생성
HashMap<String, Product> products = new HashMap<>();

// 추가 (Key, Value)
products.put("P001", product);

// 조회 (Key로 검색)
Product p = products.get("P001");

// 삭제 (Key로 삭제)
products.remove("P001");

// 크기
int size = products.size();

// Key 존재 확인
boolean exists = products.containsKey("P001");

2. HashMap 순회 방법

entrySet() 사용 (Key와 Value 모두 필요한 경우):

Java
for (Map.Entry<String, Product> entry : products.entrySet()) {
    String key = entry.getKey();
    Product value = entry.getValue();
    // ...
}

keySet() 사용 (Key만 필요한 경우):

Java
for (String key : products.keySet()) {
    Product value = products.get(key);
    // ...
}

values() 사용 (Value만 필요한 경우):

Java
for (Product product : products.values()) {
    // ...
}

3. ArrayList vs HashMap

구분ArrayListHashMap
저장 방식순차적 (인덱스)Key-Value 쌍
검색 속도O(n) - 순차 탐색O(1) - 해시 검색
순서 보장O (입력 순서)X (순서 없음)
중복허용Key 중복 불가
사용 예학생 목록상품 ID로 조회

4. HashMap의 장점

  • 빠른 검색: Key로 바로 접근 (O(1))
  • 유일 Key: 중복 Key 자동 방지
  • 실무 활용: 사용자 ID, 상품 코드, 주문 번호 등

5. 제네릭 (Generics)

  • HashMap<String, Product>: Key는 String, Value는 Product
  • 타입 안전성 보장
  • 형변환 불필요

6. 실무 활용

  • 재고 관리: 상품 코드로 빠른 재고 조회
  • 사용자 관리: 사용자 ID로 프로필 조회
  • 캐시 시스템: 자주 사용하는 데이터 저장