카테고리 없음

[TIL] Java 컬렉션 - HashSet과 HashMap

mooncommit 2026. 4. 2. 15:16

🕶️ HashSet

Set 인터페이스를 구현한 컬렉션이다.

 

특징

  • 순서를 보장하지 않는다
  • 중복을 허용하지 않는다
  • get() 사용 불가

주요 메서드

HashSet<String> set = new HashSet<>();

set.add("값");       // 추가
set.remove("값");    // 제거

 

이럴 때 사용!

중복 없이 데이터를 관리할 때 : 예를 들어 장바구니에 같은 상품이 중복으로 담기는 걸 방지할 때 활용할 수 있다.

 

 

⭐️ 구글에서 가져온 예시

import java.util.HashSet;

class Main {
    public static void main(String[] args) {
        HashSet<Integer> evenNumber = new HashSet<>();

        // Using add() method
        evenNumber.add(2);
        evenNumber.add(4);
        evenNumber.add(6);
        System.out.println("HashSet: " + evenNumber);

        HashSet<Integer> numbers = new HashSet<>();
        
        // Using addAll() method
        numbers.addAll(evenNumber);
        numbers.add(5);
        System.out.println("New HashSet: " + numbers);
    }
}

 

✔️ 실행 결과

HashSet: [2, 4, 6]
New HashSet: [2, 4, 5, 6]

 😎 HashMap

Map 인터페이스를 구현한 컬렉션이다.

 

특징

  • 키(Key) - 값(Value) 구조로 데이터를 저장한다
  • 키는 중복 불가, 값은 중복 가능
  • 순서를 보장하지 않는다
  • 키가 중복되면 값이 덮어씌워진다

주요 메서드

HashMap<String, Integer> map = new HashMap<>();

map.put("키", 값);      // 추가
map.get("키");          // 조회
map.remove("키");       // 제거
map.keySet();           // 키 확인
map.values();           // 값 확인

 

이럴 때 사용!

상품명과 수량처럼 짝을 이루는 데이터를 관리할 때 — 장바구니에서 상품명: 수량 형태로 저장할 때 활용할 수 있다.


⭐️ 구글에서 가져온 예시

import java.util.*;  
  
public class Scaler {  
    public static void main(String[] args)  
    {  
        HashMap<String, Integer> hashMap = new HashMap<>(); 
        
       // 해시맵 생성 (이름 -> 문자열, 셀 번호 -> 정수)
        hashMap.put("Boyd Redding", 140);  
        hashMap.put("Andy Dufresne", 142);  
        hashMap.put("Heywood", 146);  
        hashMap.put("Brooks", 145);  
        hashMap.put("Tommy", 148);

 
        // 향상된 for 루프를 사용하여 해시맵을 순회
        
        //Iterating keys
        for(String name: hashMap.keySet())  
        {  
            //Printing keys and their corresponding values
            System.out.println(name + ":" + hashMap.get(name));  
        } 
        
        //Map.Entry as a reference to the entrySet elements (key -> value)
        for(Map.Entry<String, Integer> entry: hashMap.entrySet())  
        {  
            System.out.println(entry.getKey() + ":" + entry.getValue());  
        }
        
    }
}

 

✔️ 실행 결과

Printing elements with keySet method:
Boyd Redding:140
Andy Dufresne:142
Heywood:146
Brooks:145
Tommy:148

Printing elements with entrySet method:
Boyd Redding:140
Andy Dufresne:142
Heywood:146
Brooks:145
Tommy:148

ArrayList vs HashSet vs HashMap 비교ArrayList 

ArrayList

순서 있고 중복 허용되는 목록이 필요할 때 사용

HashSet

중복 없는 목록이 필요할 때

HashMap

상품명: 수량 처럼 연결된 데이터를 관리할 때


🛒  HashMap으로 장바구니 구현하기

장바구니에 같은 상품이 중복으로 담기면 안 되고,
상품마다 수량을 관리해야 하기 때문에 `HashMap`을 활용했다.

 

CommerceSystem에 먼저 장바구니 활용을 해보고 잘 되면 그 때 메서드를 분리할 계획이다.

 

CommerceSystem 필드에 HashMap을 추가했다.

private HashMap<Product, Integer> cart = new HashMap<>();

 

- `Key` → `Product` (상품 객체)
- `Value` → `Integer` (수량)

Value 에는 int 같은 기본 자료형이 올 수 없다.
그래서 int 대신 래퍼클래스(Wrapper Class)인 Integer을 사용한다.

선택한 상품: iPhone 15 | 1,350,000원 | Apple의 최신 스마트폰 | 재고: 30개
위 상품을 장바구니에 추가하시겠습니까?
1. 확인        2. 취소
1 <-

// 1번을 누르면 나오는 메뉴입니다.
iPhone 15가 장바구니에 추가되었습니다.

이렇게 출력되게 만들어 볼 것이다.

🕶️ HashMap 메서드

메서드 역할
put(key, value) 추가
get(key) 조회
remove(key) 제거
containsKey(key) 키(key) 존재 여부 확인

 

HashMap 메서드를 사용해 만들어주었다.

System.out.print("입력 : ");
int addCart = scanner.nextInt();
// 1 선택 : 추가 / 2 선택 : 취소 continue; 그 외 : 올바른 숫자를 입력하세요
// 1이면 추가
if (addCart == 1) {
// 여기서 이미 있으면 + 1 담아주기(put 메서드)
	if (cart.containsKey(selectedProduct)) {
		cart.put(selectedProduct, cart.get(selectedProduct) + 1);
        System.out.println(cart.get(selectedProduct));
		// 없으면 그냥 한 개 담아주기
	} else {
	cart.put(selectedProduct, 1);
    }
    System.out.println(selectedProduct.getProductName() + "가 장바구니에 추가되었습니다.");
	 // 만약 2를 선택하면 취소
} else if (addCart == 2) {
continue;
// 1, 2 외 다른 것을 입력
} else {
System.out.println("올바른 번호를 입력하세요");
continue;
}

 

먼저 입력값에 따라 `if-else`로 분기 처리했다.

 

 

✔️ 1을 입력하면 장바구니에 추가된다. 이때 `containsKey()` 메서드로 이미 담긴 상품인지 확인한다.

✔️ 이미 있으면 → `get()`메서드(조회) 현재 수량을 꺼내서 +1 후 다시 `put()`메서드(추가)

✔️ 같은 상품이 없으면 수량 1로 `put()`

✔️ 2를 입력하면 취소 후 `continue`로 다시 메인으로 돌아간다.

✔️ 그 외 입력은 안내 메시지 출력 후 `continue`로 다시 돌아간다.


장바구니 추가 성공⎝⍢⎠


느낀 점

몰랐던 클래스나 메서드를 배우고 그걸 활용해 완성해 가는 과정이 너무 재밌는 것 같다.

처음에는 객체 생성도 어려웠는데 정말 많이 성장한 것 같다 ㅎㅎ 앞으로도 화이팅! 🔥🔥🔥