[JAVA] 컬렉션(Collection)

이연우·2025년 7월 9일

TIL

목록 보기
3/100

🧺 컬렉션이란?

  • 데이터를 효율적으로 저장하고 처리하기 위한 자료구조의 집합
  • 컬렉션을 다루기 위해 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로 장바구니 구현

  • 장바구니 상품: 양파, 사과, 생선, 두부
  • 기능 1: 상품 추가(addProduct)
  • 기능 2: 장바구니 목록 출력(printCart)
  • 기능 3: 상품 삭제(removeProduct)
  • 기능 4: 총 가격 계산(calculateTotalPrice)

💻 작성 코드:
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 원입니다.

0개의 댓글