IMCAT.DEV
로그인 가입
C++ 중급 자료구조

C++ 컬렉션 클래스 (벡터, 리스트 등)

C++ 컬렉션 클래스 (벡터, 리스트 등) — 중급

컬렉션 클래스 (벡터, 리스트 등)

1. 도입 (왜 배워야 하는가)

컬렉션 클래스는 데이터 구조를 효율적으로 관리하는 데 필수적입니다. 실무에서 데이터를 저장하고 처리해야 할 때, 배열과 같은 기본 구조보다는 벡터(vector), 리스트(list), 맵(map) 등의 컬렉션 클래스를 활용하는 것이 일반적입니다. 이러한 클래스들은 데이터의 삽입, 삭제, 검색 등을 더 쉽게 하고, 코드의 가독성을 높여주며, 유지보수를 용이하게 합니다.

만약 이 토픽을 모른다면, 다음과 같은 문제가 발생할 수 있습니다:

  • 데이터의 크기가 변경될 때마다 배열을 새로 만들어야 하며, 이는 비효율적입니다.
  • 복잡한 데이터 구조를 손쉽게 관리하지 못해 코드가 복잡해지고, 디버깅이 어려워집니다.
  • 2. 핵심 개념 설명

    벡터 (Vector)

    벡터는 동적 배열로, 데이터의 크기가 가변적입니다. 필요한 만큼 메모리를 자동으로 할당하거나 해제합니다. 예를 들어, 쇼핑몰에서 장바구니에 물건을 담을 때, 물건의 수가 변할 수 있기 때문에 벡터를 사용하면 유용합니다.

    리스트 (List)

    리스트는 비순차적인 데이터 구조로, 각 요소가 이전 및 다음 요소를 가리킵니다. 물건을 삽입하거나 삭제할 때, 리스트는 빠른 속도로 작업을 수행할 수 있습니다. 이는 마치 사람의 친구 관계처럼, 각 친구가 서로의 정보를 알고 있는 것과 비슷합니다.

    용어설명
    벡터동적 크기의 배열. 필요한 만큼 자동 확장.
    리스트요소가 서로 연결된 형태. 삽입/삭제가 용이.

    3. 기본 코드 예제

    벡터 사용 예제

    #include <iostream>
    #include <vector>
    
    int main() {
        std::vector<int> numbers; // 빈 벡터 생성
        numbers.push_back(10);     // 10 추가
        numbers.push_back(20);     // 20 추가
        numbers.push_back(30);     // 30 추가
    
        for (int number : numbers) {
            std::cout << number << " "; // 각 요소 출력
        }
        return 0;
    }
    // 실행 결과: 10 20 30
  • std::vector<int> numbers;: 빈 정수형 벡터를 생성합니다.
  • numbers.push_back(10);: 벡터의 끝에 10을 추가합니다.
  • for (int number : numbers): 벡터의 각 요소를 반복하여 출력합니다.
  • 리스트 사용 예제

    #include <iostream>
    #include <list>
    
    int main() {
        std::list<int> numbers;    // 빈 리스트 생성
        numbers.push_back(10);      // 10 추가
        numbers.push_back(20);      // 20 추가
        numbers.push_back(30);      // 30 추가
    
        for (int number : numbers) {
            std::cout << number << " "; // 각 요소 출력
        }
        return 0;
    }
    // 실행 결과: 10 20 30
  • std::list<int> numbers;: 빈 정수형 리스트를 생성합니다.
  • numbers.push_back(10);: 리스트의 끝에 10을 추가합니다.
  • for (int number : numbers): 리스트의 각 요소를 반복하여 출력합니다.
  • 4. 실전 활용 예제

    쇼핑몰 장바구니 구현

    #include <iostream>
    #include <vector>
    
    class ShoppingCart {
    public:
        void addItem(int item) {
            items.push_back(item); // 물건 추가
        }
    
        void showItems() {
            for (int item : items) {
                std::cout << "장바구니에 있는 물건: " << item << std::endl;
            }
        }
    
    private:
        std::vector<int> items; // 물건 목록을 저장하는 벡터
    };
    
    int main() {
        ShoppingCart cart;
        cart.addItem(101); // 물건 101 추가
        cart.addItem(202); // 물건 202 추가
        cart.showItems();  // 장바구니 내용 출력
        return 0;
    }
    // 실행 결과:
    // 장바구니에 있는 물건: 101
    // 장바구니에 있는 물건: 202
  • ShoppingCart 클래스는 벡터를 사용하여 장바구니의 물건을 관리합니다.
  • 물건을 추가하거나 현재 장바구니의 내용을 쉽게 출력할 수 있습니다.
  • 고객 리스트 관리

    #include <iostream>
    #include <list>
    #include <string>
    
    class CustomerList {
    public:
        void addCustomer(std::string name) {
            customers.push_back(name); // 고객 추가
        }
    
        void showCustomers() {
            for (std::string name : customers) {
                std::cout << "고객 이름: " << name << std::endl;
            }
        }
    
    private:
        std::list<std::string> customers; // 고객 이름 목록을 저장하는 리스트
    };
    
    int main() {
        CustomerList cl;
        cl.addCustomer("홍길동");
        cl.addCustomer("김철수");
        cl.showCustomers(); // 고객 목록 출력
        return 0;
    }
    // 실행 결과:
    // 고객 이름: 홍길동
    // 고객 이름: 김철수
  • CustomerList 클래스는 리스트를 사용하여 고객의 이름을 관리합니다.
  • 고객을 추가하고, 현재 고객 목록을 출력하는 기능을 제공합니다.
  • 5. 흔한 실수와 주의사항

    실수 1: 벡터의 크기 초과

    std::vector<int> vec;
    for (int i = 0; i <= 10; i++) {
        vec.at(i) = i; // 이곳에서 예외 발생
    }
  • at()는 벡터의 범위를 벗어날 경우 예외를 발생시킵니다. 이를 방지하기 위해 벡터의 크기를 미리 확인해야 합니다.
  • 실수 2: 리스트의 반복자 사용

    std::list<int> myList;
    myList.push_back(1);
    myList.push_back(2);
    for (auto it = myList.begin(); it != myList.end(); ++it) {
        myList.erase(it); // 잘못된 접근
    }
  • 리스트를 순회하며 요소를 삭제할 때, 반복자 사용에 유의해야 합니다. 삭제 후 반복자를 업데이트하지 않으면 접근 오류가 발생합니다.
  • 6. 정리

  • 벡터와 리스트는 각각의 특성과 장점을 가지고 있으며, 상황에 따라 적절하게 선택해야 합니다.
  • 벡터는 동적 배열로, 크기 조정이 용이하며, 리스트는 요소의 삽입 및 삭제가 빠릅니다.
  • 실무에서의 데이터 관리와 유지보수를 위해 컬렉션 클래스를 잘 활용할 줄 알아야 합니다.
  • 추천 학습 주제

  • 맵(Map)과 해시맵(HashMap) 사용법
  • 알고리즘: 정렬과 검색
  • STL(Standard Template Library) 깊이 있는 사용법