컨테이너 (추상 자료형)

컴퓨터 과학에서 컨테이너(container)는 다른 객체들의 클래스 또는 자료 구조Paul E. Black (ed.), entry for data structure in Dictionary of Algorithms and Data Structures. US National Institute of Standards and Technology.15 December 2004. Accessed 4 Oct 2011.Entry data structure in the Encyclopædia Britannica (2009) Online entry Accessed 4 Oct 2011.의 인스턴스이다. 즉, 특정 접근 규칙을 따르는 조직화된 방식으로 객체를 저장한다.

컨테이너의 크기는 컨테이너가 포함하는 객체(요소)의 수에 따라 달라진다. 다양한 컨테이너 유형의 하위(상속된) 구현은 크기, 복잡성 및 언어 유형에 따라 달라질 수 있지만, 많은 경우 주어진 시나리오에 맞는 올바른 구현을 선택할 수 있는 유연성을 제공한다.

컨테이너 자료 구조는 많은 종류의 프로그래밍 언어에서 흔히 사용된다.

 기능 및 속성 
컨테이너는 다음 세 가지 속성으로 특징지을 수 있다.
 접근: 컨테이너의 객체에 접근하는 방식. 배열의 경우, 배열 인덱스로 접근한다. 스택의 경우, LIFO (후입선출) 순서에 따라 접근하고 큐의 경우, FIFO (선입선출) 순서에 따라 접근한다.
 저장: 컨테이너의 객체를 저장하는 방식.
 순회: 컨테이너의 객체를 순회하는 방식.

컨테이너 클래스는 다음을 수행하기 위한 CRUD와 유사한 메서드를 구현할 것으로 예상된다.
 빈 컨테이너 생성(생성자)
 컨테이너에 객체 삽입
 컨테이너에서 객체 삭제
 컨테이너의 모든 객체 삭제(지우기)
 컨테이너의 객체 접근
 컨테이너의 객체 수 접근(개수)

컨테이너는 때때로 반복자와 함께 구현된다.

 종류 
컨테이너는 단일 값 컨테이너 또는 연관 컨테이너로 분류될 수 있다.

단일 값 컨테이너는 각 객체를 독립적으로 저장한다. 객체는 직접, 언어 루프 구조(예: For 루프) 또는 반복자로 접근할 수 있다.

연관 컨테이너는 키-값 쌍으로 구성된 연관 배열, 맵 또는 딕셔너리를 사용하며, 각 키는 컨테이너에 최대 한 번 나타난다. 키는 컨테이너에 저장되어 있는 경우 값인 객체를 찾는 데 사용된다. 연관 컨테이너는 프로그래밍 언어에서 클래스 템플릿으로 사용된다.

컨테이너 추상 자료형은 다음을 포함한다.

 FIFO 큐
 LIFO 스택
 우선순위 큐
 순람표 (LUT)
 키-연관 자료 구조
 집합: 값 또는 특정 속성으로 객체를 포함하고 인덱싱한다.
 맵: 각 키에 조회를 위한 "값"을 연관시킨다.

이러한 추상 유형을 구현하는 데 사용되는 일반적인 자료 구조는 다음을 포함한다.
 배열 및 그 파생형
 연결 리스트
 이진 탐색 트리 (BST), 특히 자가 균형 BST
 해시 테이블

 그래픽 컨테이너 
위젯 툴킷은 또한 창, 패널과 같은 다른 위젯을 그룹화하는 특수 위젯인 컨테이너를 사용한다. 그래픽 속성 외에도 컨테이너 클래스와 동일한 유형의 동작을 가지는데, 이는 자식 위젯 목록을 유지하고 자식 중에서 위젯을 추가, 제거 또는 검색할 수 있도록 하기 때문이다.

 정적 타입 언어에서 

컨테이너 추상화는 타입 시스템에 관계없이 거의 모든 프로그래밍 언어로 작성할 수 있다. 그러나 강한 타입 객체 지향 프로그래밍 언어에서는 개발자가 재사용 가능한 동종 컨테이너를 작성하는 것이 다소 복잡할 수 있다.

요소 유형의 차이로 인해 각 요소 유형에 대한 컨테이너 컬렉션을 작성하고 유지하는 지루한 과정이 발생한다.

많은 요소 유형(예: 정수 또는 부동 소수점 숫자)은 차지하는 메모리 크기와 의미론적 의미로 인해 본질적으로 서로 호환되지 않으므로 다른 컨테이너가 필요하다(물론 상호 호환되거나 변환 가능한 경우는 제외). 최신 프로그래밍 언어는 이 문제를 해결하는 데 도움이 되는 다양한 접근 방식을 제공한다.

 범용 기본 타입
 다른 어떤 타입으로든 범용적으로 할당 가능한 타입(예: 루트 객체 클래스).
다운캐스팅;
클래스 대체
 위의 세 가지 접근 방식은 약한 타입 언어에 사용되며, 일반적으로 타입 간에 공유되는 상속과 다형성을 의미한다.
공용체 (C/C++ 언어)
 다른 데이터 크기의 타입을 저장할 수 있다. 그러나 검색 시 공용체에 어떤 타입이 저장되어 있는지 확인하기 어렵고 신중하게 따라야 한다.
형 변환
 템플릿 또는 제네릭
 재사용성과 타입 안전성을 보장한다. 역상속으로 생각할 수 있다. 그러나 이 접근 방식은 템플릿 특수화를 구현해야 할 수 있는데, 타입이 메서드에서 다르다는 점을 고려할 때 시간이 많이 소요되는 과정으로 알려져 있다.

 같이 보기 
 자료 구조 목록
 표준 템플릿 라이브러리#컨테이너
 컬렉션 (추상 자료형)
 자바 동시성 맵

 각주 

 외부 링크 
 컨테이너 자료 구조 선언 및 초기화

분류:객체 지향 프로그래밍
분류:추상 자료형