Jin's IT Story
[자료구조] 선형리스트와 연결리스트 차이와 구조 본문
자료구조는 모든 프로그래머가 반드시 이해하고 있어야 할 핵심 개념입니다. 특히 리스트(List)는 가장 기본적인 자료구조로, 그 중에서도 선형리스트(Sequential List)와 연결리스트(Linked List)는 서로 다른 메모리 구조와 접근 방식을 가지고 있어 상황에 맞게 선택해야 합니다.
이 글에서는 선형리스트와 연결리스트의 기본 개념, 구조적 차이, 그리고 각각이 쓰이는 실제 상황을 비교해 설명하겠습니다.
선형리스트의 구조와 특징
선형리스트는 배열(Array)을 기반으로 하는 자료구조로, 데이터를 메모리에 연속적으로 저장합니다.
예를 들어 배열 int[] arr = new int[5];
처럼 크기가 정해진 공간에 데이터를 순차적으로 저장하고, 인덱스를 통해 각 요소에 접근합니다. 이 구조는 인덱스를 통한 빠른 접근 속도(O(1))가 강점이며, 대부분의 프로그래밍 언어에서 배열을 제공하기 때문에 구현이 매우 간단합니다.
하지만 단점도 있습니다. 크기가 고정되어 있어 초기 크기를 초과하는 데이터를 저장하려면 새 배열을 만들어 복사해야 하며, 삽입이나 삭제 시에는 연속된 요소들의 이동이 필요합니다. 이런 이유로 삽입/삭제 연산의 시간 복잡도는 O(n)입니다.
실제 사용 예로는 정해진 크기의 캐시 배열, 고정 크기 버퍼, 인덱스 기반 접근이 많은 알고리즘 문제 등이 있습니다.
특히 코딩테스트에서는 배열 기반 리스트로 구현되는 문제가 많기 때문에, 선형리스트의 구조적 장점은 빠른 구현과 디버깅에 유리하게 작용합니다.
연결리스트의 구조와 유연성
연결리스트는 각 노드(Node)가 데이터와 다음 노드를 가리키는 포인터를 포함한 구조입니다. 이 방식은 메모리에 불연속적으로 저장되며, 다음 노드를 연결하는 방식으로 데이터를 이어갑니다.
자바나 C언어에서는 클래스를 이용하여 노드를 구현하며, 대표적인 구조는 다음과 같습니다:
class Node {
int data;
Node next;
}
연결리스트의 가장 큰 특징은 동적 메모리 할당이 가능하다는 점입니다. 즉, 리스트의 크기를 미리 정할 필요가 없고, 필요에 따라 노드를 추가하거나 삭제할 수 있습니다. 이로 인해 삽입/삭제 연산이 빠르며 시간 복잡도는 O(1) 또는 O(n)으로 유지됩니다.
단점으로는 인덱스 기반의 접근이 불가능하다는 점이 있습니다. 특정 데이터를 찾기 위해서는 처음부터 차례로 순회해야 하며, 이는 O(n)의 시간 복잡도를 발생시킵니다. 또한 포인터를 많이 사용하므로 메모리 사용량이 증가하고, 잘못된 포인터로 인한 오류 가능성도 존재합니다.
실무에서는 Queue, Stack, HashMap의 내부 구현, 메모리 사용 최적화가 필요한 상황, 빈번한 삽입/삭제가 발생하는 서비스 등에서 연결리스트를 사용합니다.
선형리스트 vs 연결리스트 실제 비교
선형리스트와 연결리스트는 각각의 장단점이 분명하며, 사용하는 목적과 상황에 따라 선택이 달라져야 합니다. 선형리스트는 정적인 크기, 빠른 접근, 간단한 구조가 필요한 경우에 적합하고, 연결리스트는 빈번한 데이터 추가/삭제, 유동적인 메모리 사용이 필요한 경우에 적합합니다.
항목 | 선형리스트 | 연결리스트 |
메모리배치 | 연속적 (배열) | 불연속적 (노드 포인터) |
크기 설정 | 고정 | 동적 |
삽입/삭제 성능 | O(n) | O(1) ~ O(n) |
인덱스 접근 | 빠름 (O(1)) | 느림 (O(n)) |
구현 난이도 | 낮음 | 높음 |
사용 예 | 정적 배열, 캐시 | 큐, 스택, 데이터 흐름 제어 |
한국 개발자들이 실무에서 리스트 구조를 선택할 때도 이런 판단 기준을 적용합니다. 예를 들어 게임 서버에서 플레이어 목록을 관리할 때는 연결리스트를 활용하여 빠르게 추가/삭제를 처리할 수 있고, 통계 데이터를 관리하는 경우에는 배열 기반 리스트가 적합합니다.
선형리스트와 연결리스트는 각각의 구조적 특성과 장단점이 분명한 자료구조입니다. 하나는 빠른 접근을 위한 고정형 구조이고, 다른 하나는 유연한 삽입/삭제를 위한 포인터 기반 구조입니다.
코딩테스트 준비는 물론 실무에서도 이 두 자료구조에 대한 이해는 선택의 정확성을 높여줍니다. 이제 여러분도 프로젝트에 맞는 리스트 구조를 직접 선택하고 구현해 보시기 바랍니다.
'DevBasics: 개발 개념 기초 다지기' 카테고리의 다른 글
[자료구조] 배열 기반 리스트 vs 포인터 기반 리스트 (0) | 2025.07.31 |
---|---|
[JAVA] 생성자 private 선언 이유 비교해보기 (0) | 2025.07.30 |
[JAVA] 디자인패턴 핵심 정리 (싱글톤, 팩토리, 생성자) (0) | 2025.07.30 |
V8 메모리 구조 vs JVM 메모리 구조 (GC, 힙, 엔진 차이) (0) | 2025.07.29 |
CI/CD 용어 (Continuous Integration, Deployment, 파이프라인) (0) | 2025.07.26 |