코드를 작성하다보면 컨테이너형 자료 구조가 필요할 때가 있다. 크게 두 가지로, 하나는 배열이고 다른 하나는 연결 리스트다.
이 둘은 프로그래머가 어떤 목적으로 사용하느냐에 따라 선택이 나뉜다.
배열(Array)
장점 : 위치에 관계없이 연산으로 항목에 접근하므로 참조 시간이 빠르다.
단점 : 크기가 고정되고 항목 간의 위치가 연속하므로 삽입/삭제 시 불리하다.
예를 들어, 4 byte int형 배열 int ary[6]가 있다고 하자. 배열의 전체 크기는 배열 선언 시 4 byte * 6 = 24 byte로 고정된다.
배열의 시작 주소를 ary라고 할 때, 각 인덱스의 주소는 다음과 같다.
ary[0]의 주소 : ary + (4 * 0)
ary[1]의 주소 : ary + (4 * 1)
ary[2]의 주소 : ary + (4 * 2)
. . .
ary[5]의 주소 : ary + (4 * 5)
메모리상에서 배열은 연속되는 주소값을 갖는다. 여기서 항목을 추가 또는 삭제한다면 실행 후에도 연속된 메모리 주소를 유지해야하므로 기존 항목을 밀어내는 등 불필요한 이동이 발생한다.
연결 리스트(Linked List)
장점 : 항목들 간에 참조 포인터로 연결되어 있으므로 삽입/삭제 시 유리하다.
단점 : 항목의 개수가 늘어나면 접근성이 떨어지고, 참조 포인터를 이용하기 때문에 배열보다 메모리 관리 측면에서 불리하다.
연결 리스트는 data 필드와 link 필드로 나뉜다. data 필드는 항목의 값을 저장하고, link 필드는 연결된 노드의 주소를 가리킨다.
따라서 n번째 항목에 접근하려면 단방향 링크드 리스트의 경우, 처음부터 n번 만큼 이동하여야 한다.
양방향 링크드 리스트(doubly linked list)의 경우 단방향보다 접근성이 향상되지만, 추가적인 link 필드를 필요로 한다.
종합해보면 빠른 접근이 필요할 때에는 배열을,
삽입/삭제 연산이 많은 경우엔 연결 리스트를 사용하면 효율적이다.
물론 이 개념은 C++뿐만 아닌 모든 프로그래밍 언어에서 동일하다고 보면 된다.