🧺 컬렉션이란?
- 데이터를 효율적으로 저장하고 처리하기 위한 자료구조의 집합
- 컬렉션을 다루기 위해 java.util 패키지에 다양한 클래스와 인터페이스가 정의되어 있음
📚 주요 구현 클래스

List 계열 ⇢ 순서 유지, 중복 허용
→ ArrayList: 배열 기반, 인덱스 접근 빠름, 중간 삽입/삭제 느림
→ LinkedList: 연결 리스트 기반, 삽입/삭제 빠름, 인덱스 접근 느림
Set 계열 ⇢ 순서 없음, 중복 불가
→ HashSet: 해시 기반, 순서 없음, 중복 제거
→ LinkedHashSet: 입력 순서 유지
→ TreeSet: 정렬된 상태로 저장(Comparable 또는 Comparator 기반)
Map 계열 ⇢ 키-값 구조, 키 중복 불가
→ HashMap: 해시 기반, 순서 없음
→ LinkedHashMap: 입력 순서 유지
→ TreeMap: 키 기준 정렬
🔧 배열의 한계
| 배열의 한계 | 설명 |
|---|---|
| 고정된 크기 | 배열은 선언 시 크기를 정해야 함 → 크기 조절 불가능 |
| 삽입/삭제가 불편함 | 중간에 데이터를 넣거나 빼면 일일이 이동해야 함 |
| 타입만 저장 가능 | 동일 타입의 데이터만 저장 가능 (Object 배열로 해결 가능하지만 번거로움) |
| 기능 부족 | 정렬, 검색, 중복 제거 같은 기능은 직접 구현해야 함 |
| 비효율적인 메모리 사용 | 예상보다 큰 배열을 만들면 낭비, 작게 만들면 부족 |
✅ 컬렉션이 어떻게 이 문제를 해결할까?
| 컬렉션의 장점 | 배열의 한계 극복 방법 |
|---|---|
| 동적 크기 조절 | ArrayList, LinkedList 등은 내부적으로 크기 조절 가능 |
| 유연한 삽입/삭제 | LinkedList, Set 등은 삽입/삭제가 효율적 |
| 제네릭 지원 | 타입 안전하면서 다양한 객체 저장 가능 (List<String>, List<Integer> 등) |
| 기능 제공 | 정렬, 검색, 중복 제거, 순회 등의 유틸리티 제공 (Collections.sort, contains, removeIf 등) |
| 다양한 구조 제공 | List, Set, Map 등 다양한 자료구조 선택 가능 |
🎯 관계 요약
📋 List 인터페이스를 구현한 ArrayList 활용
ArrayList는 요소의 순서를 유지하고, 중복된 값을 저장할 수 있는 자료구조add("값")get("인덱스")remove("값")ArrayList, LinkedList 존재📄 예시 코드:
// List 를 구현한 ArrayList
ArrayList<String> names = new ArrayList<>();
names.add("Spartan"); // 1번째 요소 추가
names.add("Steve"); // 2번째 요소 추가
names.add("Isac"); // 3번째 요소 추가
names.add("1");
names.add("2");
// ✅ 순서 보장
System.out.println("names = " + names);
// ✅ 중복 데이터 허용
names.add("Spartan");
System.out.println("names = " + names);
// ✅ 단건 조회
System.out.println("1번째 요소 조회: " + names.get(0)); // 조회 Spartan
// ✅ 데이터 삭제
names.remove("Steve");
System.out.println("names = " + names);
출력 결과
names = [Spartan, Steve, Isac, 1, 2]
names = [Spartan, Steve, Isac, 1, 2, Spartan]
1 번째 요소 조회: Spartan
names = [Spartan, Isac, 1, 2, Spartan]
🚫 Set 인터페이스를 구현한 HashSet 활용
HashSet 은 순서를 유지하지 않고 중복을 허용하지 않음get() 지원을 하지 않음 - 요소 추가 → add("값")
- 요소 제거 → remove("값")
HashSet , TreeSet 존재📄 예시 코드:
// Set 을 구현한 HashSet
HashSet<String> uniqueNames = new HashSet<>();
// ✅ 추가
uniqueNames.add("Spartan");
uniqueNames.add("Steve");
uniqueNames.add("Isac");
uniqueNames.add("1");
uniqueNames.add("2");
// ⚠️ 순서를 보장 안함
System.out.println("uniqueNames = " + uniqueNames);
uniqueNames.get(0); // ❌ get 사용 불가
// ⚠️ 중복 불가
uniqueNames.add("Spartan");
System.out.println("uniqueNames = " + uniqueNames);
// ✅ 제거
uniqueNames.remove("Spartan");
System.out.println("uniqueNames = " + uniqueNames);
출력 결과
uniqueNames = [1, 2, Spartan, Steve, Isac]
uniqueNames = [1, 2, Spartan, Steve, Isac]
uniqueNames = [1, 2, Steve, Isac]
🗺️ Map 인터페이스를 구현한 HashMap 활용
HashMap 은 키(Key) - 값(Value) 구조로 데이터 저장(키: 값)키(Key) 는 중복될 수 없지만 값(Value) 은 중복 가능put(”키”, 값)get(”키”)remove("Steve")keySet()values()HashMap, TreeMap 존재📄 예시 코드:
// Map 을 구현한 HashMap
HashMap<String, Integer> memberMap = new HashMap<>();
// ✅ 추가
memberMap.put("Spartan", 15);
memberMap.put("Steve", 15); // ✅ 값은 중복 가능
memberMap.put("Isac", 1);
memberMap.put("John", 2);
memberMap.put("Alice", 3);
// ⚠️ 순서 보장 안함
System.out.println("memberMap = " + memberMap);
// ⚠️ 키 중복 불가: 값 덮어쓰기 발생
memberMap.put("Alice", 5);
System.out.println("memberMap = " + memberMap);
// ✅ 조회: 15
System.out.println(memberMap.get("Steve"));
// ✅ 삭제 가능
memberMap.remove("Spartan");
System.out.println("memberMap = " + memberMap);
// ✅ 키 확인
Set<String> keys = memberMap.keySet();
System.out.println("keys = " + keys);
// ✅ 값 확인
Collection<Integer> values = memberMap.values();
System.out.println("values = " + values);
출력 결과
memberMap = {Spartan=15, Steve=15, Alice=3, John=2, Isac=1}
memberMap = {Spartan=15, Steve=15, Alice=5, John=2, Isac=1}
15
memberMap = {Steve=15, Alice=5, John=2, Isac=1}
keys = [Steve, Alice, John, Isac]
values = [15, 5, 2, 1]
❓ 연습 문제) ArrayList로 장바구니 구현
💻 작성 코드:
Product.java
public class Product {
private String name;
private int price;
public Product(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return this.name;
}
public int getPrice() {
return this.price;
}
}
Cart.java
import java.util.ArrayList;
import java.util.List;
public class Cart {
private List<Product> cart = new ArrayList<>();
public void addProduct(Product product) {
System.out.println("장바구니에 상품 추가");
cart.add(product);
System.out.println(product.getName() + " 이(가) 추가되었습니다.");
}
public void printCart() {
System.out.println("장바구니 상품 조회");
if (cart.isEmpty()) {
System.out.println("장바구니가 비어 있습니다.");
}
else {
for (Product product : cart) {
System.out.println(product.getName());
}
}
}
public void removeProduct(Product product) {
System.out.println("장바구니에 상품 삭제");
boolean removed = false;
for (Product p : cart) {
String foundProductName = product.getName();
if (foundProductName.equals(product.getName())) {
cart.remove(product);
removed = true;
System.out.println(product.getName() + " 이(가) 삭제되었습니다.");
break;
}
}
if (!removed) {
System.out.println("해당 상품이 장바구니에 없습니다.");
}
}
public void calculateTotalPrice() {
System.out.println("장바구니 총 금액 출력");
int total = 0;
for (Product product : cart) {
total += product.getPrice();
}
System.out.println("총 금액은 " + total + " 원입니다.");
}
}
Main.java
public class Main {
public static void main(String[] args) {
Cart cart = new Cart();
Product onion = new Product("양파", 3000);
Product apple = new Product("사과", 1000);
Product fish = new Product("생선", 12000);
Product tofu = new Product("두부", 2000);
cart.addProduct(onion);
cart.addProduct(apple);
cart.addProduct(fish);
cart.addProduct(tofu);
System.out.println();
cart.printCart();
System.out.println();
cart.calculateTotalPrice();
System.out.println();
cart.removeProduct(fish);
System.out.println();
cart.printCart();
System.out.println();
cart.calculateTotalPrice();
}
}
출력 결과
장바구니에 상품 추가
양파 이(가) 추가되었습니다.
장바구니에 상품 추가
사과 이(가) 추가되었습니다.
장바구니에 상품 추가
생선 이(가) 추가되었습니다.
장바구니에 상품 추가
두부 이(가) 추가되었습니다.
장바구니 상품 조회
양파
사과
생선
두부
장바구니 총 금액 출력
총 금액은 18000 원입니다.
장바구니에 상품 삭제
생선 이(가) 삭제되었습니다.
장바구니 상품 조회
양파
사과
두부
장바구니 총 금액 출력
총 금액은 6000 원입니다.