P2-9.1 자료구조(data structure)는 왜 필요한가¶
Section ID:
P2-9.1Version:v2026.07.20
P2-8에서는 Python의 값(value), 리스트(list), 딕셔너리(dictionary), 반복(loop), 함수(function), 클래스(class)를 봤습니다. 이제 한 걸음 물러서서 질문을 바꿉니다.
데이터를 어떤 모양으로 담아야 할까요?
이 질문이 자료구조(data structure)의 출발점입니다. 자료구조는 단순히 문법 이름이 아닙니다. 데이터를 어떻게 조직하고, 어떤 연산을 자주 할 것인지에 따라 코드의 모양과 계산 방식이 달라집니다.
여기서는 자료구조(data structure), 추상 자료형(abstract data type), 선형 구조(linear structure), 비선형 구조(non-linear structure)의 기본 구분을 설명합니다. 뒤 절에서 배열, 표, 트리, 그래프를 나누어 다시 보더라도, 자료구조를 왜 먼저 질문으로 읽어야 하는지는 여기 기준으로 다시 연결합니다. 이후 구조 이름이 반복될 때는 개념사전도 함께 확인합니다.
이 절은 새 Python 문법을 더하는 대신, 앞 절에서 배운 문법을 데이터 조직 관점으로 다시 묶습니다. Chapter 8이 값, 묶음, 반복, 함수라는 실행 문장을 익히는 구간이었다면, 여기서는 그 문장들이 어떤 데이터 모양을 전제하고 있었는지 다시 봅니다. 이렇게 읽으면 리스트와 딕셔너리를 문법 항목이 아니라 서로 다른 자료구조 선택으로 연결하기 쉬워집니다.
| 지금 이 절에서 잡을 것 | 바로 다음에 이어질 질문 | 이후 다시 쓰이는 위치 |
|---|---|---|
| 자료구조가 데이터를 담는 모양과 연산 방식을 함께 보는 관점이라는 점 | P2-9.2에서 배열, 표, 트리, 그래프를 어떤 질문으로 구분할지로 이어집니다. | 이후 NumPy, Pandas, 그래프 표현, 프로젝트 데이터 설계에서 반복됩니다. |
| 같은 데이터도 목적에 따라 리스트, 딕셔너리, 그래프처럼 다르게 담길 수 있다는 점 | 어떤 구조가 더 자연스러운지 판단하는 기준으로 이어집니다. | 이후 전처리, 라벨 맵, 관계 데이터, 문서 구조 표현에서 다시 쓰입니다. |
| Chapter 8의 문법 절과 Chapter 9의 자료구조 절이 같은 내용이 아니라는 점 | 문법 복습에서 자료구조 직관으로 질문이 바뀌었다는 점이 분명해집니다. | 이후 Python 기초와 데이터 구조 학습을 섞지 않고 읽는 기준이 됩니다. |
| 용어 | 이 절에서 먼저 잡을 뜻 |
|---|---|
| 자료구조(data structure) | 데이터를 어떤 모양으로 조직하고 다룰지 정하는 방식입니다. |
| 연산(operation) | 검색, 추가, 삭제, 순회처럼 구조 위에서 자주 하는 작업입니다. |
| 추상 자료형(abstract data type) | 무엇을 할 수 있는지를 규정하는 동작 관점의 틀입니다. |
| 선형 구조(linear structure) | 데이터가 한 줄의 순서로 이어진다고 보는 구조입니다. |
| 비선형 구조(non-linear structure) | 계층이나 관계처럼 한 줄로만 읽히지 않는 구조입니다. |
예를 들어 같은 학생 점수 데이터라도 목적에 따라 구조가 달라질 수 있습니다.
문제 상황: 점수만 순서대로 처리하고 싶을 때 가장 단순한 구조를 먼저 보고 싶습니다. 입력(input): 학생 점수 세 개 82, 75, 91. 기대 출력(output): 점수 목록 scores. 확인할 개념: 리스트는 순서대로 값을 다루기 좋은 기본 자료구조입니다.
이 구조는 점수를 순서대로 처리하기 좋습니다.
문제 상황: 학생 이름으로 점수를 바로 찾고 싶을 때는 다른 구조가 필요함을 보고 싶습니다. 입력(input): 이름을 키로, 점수를 값으로 둔 score_by_name. 기대 출력(output): 이름 기반 점수 맵 딕셔너리. 확인할 개념: 같은 데이터라도 이름 검색이 중요하면 딕셔너리가 더 자연스럽습니다.
이 구조는 이름으로 점수를 찾기 좋습니다.
같은 데이터라도 “순서대로 볼 것인가”, “이름으로 찾을 것인가”, “관계를 따라갈 것인가”에 따라 적합한 구조가 달라집니다.
핵심 기준: 자료구조(data structure)는 왜 필요한가¶
- 자료구조(data structure)를 데이터를 조직하는 방식으로 설명할 수 있습니다.
- 선형(linear) 구조와 비선형(non-linear) 구조의 차이를 입문 수준에서 설명할 수 있습니다.
- 자료구조가 검색(search), 추가(insert), 삭제(delete), 순회(traversal) 같은 연산과 연결됨을 설명할 수 있습니다.
- 같은 데이터도 목적에 따라 리스트, 딕셔너리, 표, 그래프처럼 다르게 표현될 수 있음을 설명할 수 있습니다.
- 추상 자료형(abstract data type)과 구체적인 구현(implementation)을 입문 수준에서 구분할 수 있습니다.
- AI 실습에서 데이터셋, 토큰 목록, 라벨 맵, 관계 데이터가 서로 다른 구조를 요구할 수 있음을 설명할 수 있습니다.
세 가지 기준¶
이 절은 자료구조 이름을 외우는 절이 아니라, 데이터를 어떤 모양으로 담을 것인가를 묻는 절입니다. 아래 세 가지 기준이 뒤 절의 배열, 표, 트리, 그래프 설명을 읽는 바탕이 됩니다.
| 기준 | 왜 중요한가 | 이 절에서 필요한 이해 수준 |
|---|---|---|
자료구조(data structure)는 데이터를 조직하는 방식이라는 점 | 문법 이름 암기보다 목적 중심으로 읽게 해 줍니다. | 순서, 이름표, 계층, 관계 중 무엇이 중요한지 묻는 절입니다. |
같은 데이터도 자주 하는 연산에 따라 다른 구조가 필요하다는 점 | 리스트와 딕셔너리 이후에 왜 더 많은 구조를 배우는지 이해하게 해 줍니다. | 순서대로 볼지, 이름으로 찾을지에 따라 구조가 달라집니다. |
추상 자료형과 구현은 같은 것이 아니라는 점 | 뒤에서 스택, 큐, 그래프를 더 안전하게 읽게 해 줍니다. | 동작 규칙과 실제 저장 방식은 구분해야 합니다. |
자료구조는 정보를 조직하는 방식이다¶
NIST의 Dictionary of Algorithms and Data Structures는 자료구조를 알고리즘 효율성을 위해 정보를 조직하는 방식으로 설명합니다. 여기서는 자료구조를 다음처럼 이해합니다.
자료구조는 데이터를 담는 모양과 그 데이터를 다루는 방법을 함께 생각하는 개념입니다.
리스트는 순서가 있는 값을 담습니다.
딕셔너리는 키로 값을 찾습니다.
집합(set)은 중복 없는 포함 여부를 봅니다.
트리(tree)는 계층 구조를 표현합니다.
그래프(graph)는 대상 사이의 관계를 표현합니다.
| 자료구조 감각 | 중심 질문 | 예시 |
|---|---|---|
| 순서 | 몇 번째 값인가? | 리스트(list) |
| 이름표 | 어떤 키로 찾는가? | 딕셔너리(dictionary) |
| 포함 여부 | 들어 있는가? | 집합(set) |
| 계층 | 상위와 하위가 있는가? | 트리(tree) |
| 관계 | 무엇과 무엇이 연결되는가? | 그래프(graph) |
자료구조를 고른다는 것은 “어떤 문법이 익숙한가”를 고르는 일이 아닙니다. 더 자주 하는 작업이 무엇인지 고르는 일입니다.
전통적인 자료구조 개론은 무엇을 먼저 보여 주는가¶
전통적인 자료구조 개론에서는 보통 데이터를 담는 모양을 몇 가지 큰 흐름으로 나누어 소개합니다. 모든 교재가 같은 순서를 따르지는 않지만, 초반에는 배열(array), 연결 리스트(linked list), 스택(stack), 큐(queue), 트리(tree), 그래프(graph), 해시 테이블(hash table) 같은 구조를 자주 만납니다.
이 이름들은 외울 목록이 아니라, 데이터를 다루는 문제 유형을 대표합니다.
| 전통적 자료구조 | 입문용 질문 | 직관 |
|---|---|---|
| 배열(array) | 같은 종류의 값을 연속된 위치로 다룰 것인가? | 번호가 붙은 칸 |
| 연결 리스트(linked list) | 값들이 다음 값을 가리키게 할 것인가? | 고리로 이어진 항목 |
| 스택(stack) | 마지막에 넣은 것을 먼저 꺼낼 것인가? | 접시 쌓기 |
| 큐(queue) | 먼저 들어온 것을 먼저 꺼낼 것인가? | 줄 서기 |
| 트리(tree) | 부모와 자식 관계가 있는가? | 폴더 구조 |
| 그래프(graph) | 여러 대상이 서로 연결되는가? | 관계망 |
| 해시 테이블(hash table) | 키로 값을 빠르게 찾을 것인가? | 이름표로 찾는 보관함 |
이 구조들은 다시 크게 선형(linear) 구조와 비선형(non-linear) 구조로 나누어 볼 수 있습니다.
선형 구조(linear structure)는 데이터가 한 줄의 순서로 이어지는 구조입니다. 배열, 리스트, 스택, 큐가 여기에 가깝습니다.
비선형 구조(non-linear structure)는 데이터가 한 줄로만 이어지지 않는 구조입니다. 트리와 그래프가 대표적입니다. 트리는 계층을 표현하고, 그래프는 여러 방향의 관계를 표현합니다.
| 구분 | 특징 | 예시 |
|---|---|---|
| 선형 구조(linear structure) | 앞뒤 순서가 중요함 | 배열, 연결 리스트, 스택, 큐 |
| 비선형 구조(non-linear structure) | 계층이나 관계가 중요함 | 트리, 그래프 |
| 키 기반 구조(key-based structure) | 키로 값을 찾는 일이 중요함 | 딕셔너리, 해시 테이블 |
이 분류는 엄밀한 학술 분류라기보다 입문자가 방향을 잡기 위한 지도입니다. 실제 구조는 겹쳐 보일 수 있습니다. 예를 들어 Python 딕셔너리는 사용 관점에서는 키 기반 매핑(mapping)이고, 구현 관점에서는 해시와 연결됩니다. 그래프도 딕셔너리와 리스트를 조합해 간단히 표현할 수 있습니다.
따라서 이 절에서는 전통적 자료구조 이름을 다음처럼 받아들입니다.
- 배열과 리스트는 순서와 위치를 생각하게 합니다.
- 스택과 큐는 넣고 꺼내는 규칙을 생각하게 합니다.
- 트리는 계층을 생각하게 합니다.
- 그래프는 관계를 생각하게 합니다.
- 해시 테이블과 딕셔너리는 키로 찾는 방식을 생각하게 합니다.
이 지도는 P2-9.2, P2-9.3, P2-9.4로 이어집니다. P2-9.2에서는 배열, 표, 트리, 그래프를 넓게 비교하고, P2-9.3에서는 그래프를 관계 표현 관점에서 따로 봅니다. P2-9.4에서는 전통적인 자료구조 이름을 보충학습으로 천천히 읽습니다.
자료구조는 연산과 함께 생각한다¶
데이터를 담는 모양은 그 데이터를 다루는 연산(operation)과 연결됩니다.
예를 들어 점수 목록에서 모든 값을 차례로 보려면 리스트가 자연스럽습니다.
문제 상황: 점수 전체를 처음부터 끝까지 순서대로 확인하는 연산을 보고 싶습니다. 입력(input): 점수 리스트 scores. 기대 출력(output): 각 점수가 한 줄씩 출력됩니다. 확인할 개념: 순회가 중심인 작업은 리스트 구조와 잘 맞습니다.
하지만 특정 학생의 점수를 이름으로 찾아야 한다면 딕셔너리가 더 직접적입니다.
문제 상황: 특정 학생 한 명의 점수를 이름으로 바로 찾는 연산을 보고 싶습니다. 입력(input): 이름을 키로 가진 딕셔너리 score_by_name. 기대 출력(output): "Kim"의 점수 82. 확인할 개념: 검색 중심 작업은 키 기반 구조가 의도를 더 직접적으로 드러냅니다.
두 구조는 모두 점수를 담지만, 자주 하는 연산이 다릅니다.
| 자주 하는 일 | 먼저 떠올릴 구조 |
|---|---|
| 전체를 순서대로 처리한다 | 리스트(list) |
| 이름이나 ID로 찾는다 | 딕셔너리(dictionary) |
| 중복을 제거하거나 포함 여부를 본다 | 집합(set) |
| 부모-자식 관계를 표현한다 | 트리(tree) |
| 여러 대상 사이의 연결을 표현한다 | 그래프(graph) |
자료구조를 배울 때는 “이 구조의 이름이 무엇인가”보다 “어떤 연산을 쉽게 하려고 만든 구조인가”를 먼저 묻는 편이 좋습니다.
추상 자료형과 구현을 구분한다¶
자료구조를 배우다 보면 스택(stack), 큐(queue), 딕셔너리(dictionary), 집합(set) 같은 이름을 만납니다. 이때 헷갈리기 쉬운 구분이 있습니다.
추상 자료형(abstract data type, ADT)은 어떤 값과 연산이 가능한지를 설명하는 개념입니다.
구현(implementation)은 그 개념을 실제 메모리와 코드에서 어떻게 만들었는지를 말합니다.
예를 들어 스택(stack)은 마지막에 넣은 것을 먼저 꺼내는 구조로 설명할 수 있습니다. 이것은 동작 규칙입니다.
push: 값을 넣는다.pop: 가장 나중에 넣은 값을 꺼낸다.- 마지막에 넣은 값이 먼저 나온다.
하지만 이 스택은 내부적으로 리스트로 만들 수도 있고, 연결 리스트(linked list)로 만들 수도 있습니다. 같은 추상 자료형을 여러 방식으로 구현할 수 있습니다.
이 구분은 Python을 읽을 때도 중요합니다.
| 관점 | 질문 | 예시 |
|---|---|---|
| 추상 자료형(ADT) | 어떤 동작을 약속하는가? | 스택은 마지막에 넣은 값을 먼저 꺼낸다 |
| 구현(implementation) | 실제로 어떻게 저장하는가? | 리스트로 구현할 수도 있고 연결 구조로 구현할 수도 있다 |
| Python 사용 관점 | 어떤 객체와 메서드로 제공되는가? | list.append(), list.pop() |
이 절에서는 구현 세부보다 사용 관점을 먼저 봅니다. 이후 성능이나 알고리즘을 다룰 때 구현 방식이 왜 중요한지 다시 보게 됩니다.
같은 데이터도 목적에 따라 구조가 달라진다¶
다음은 같은 학생 데이터를 세 가지 방식으로 표현한 예입니다.
순서대로 처리하고 싶을 때¶
문제 상황: 학생 전체를 한 명씩 순서대로 처리하는 구조를 보고 싶습니다. 입력(input): 학생 딕셔너리들이 들어 있는 리스트 students. 기대 출력(output): 학생 이름과 점수가 차례대로 출력됩니다. 확인할 개념: 같은 유형의 레코드를 순차 처리할 때는 리스트 안의 딕셔너리 구조가 자연스럽습니다.
이 구조는 모든 학생을 하나씩 처리하기 좋습니다.
이름으로 바로 찾고 싶을 때¶
문제 상황: 학생 이름 하나로 점수를 바로 찾는 구조를 보고 싶습니다. 입력(input): 이름별 학생 점수 딕셔너리 student_by_name. 기대 출력(output): "Kim"의 점수 82. 확인할 개념: 이름 조회가 중심이면 바깥 구조를 딕셔너리로 두는 편이 읽기 쉽습니다.
이 구조는 이름으로 특정 학생을 찾기 좋습니다.
관계를 표현하고 싶을 때¶
문제 상황: 학생 사이 친구 관계처럼 연결을 표현하는 구조를 보고 싶습니다. 입력(input): 학생 이름을 키로, 친구 목록을 값으로 둔 friends. 기대 출력(output): "Kim"과 연결된 친구 목록. 확인할 개념: 관계 표현이 중심이면 그래프 감각이 먼저 필요합니다.
이 구조는 누가 누구와 연결되어 있는지 표현합니다. 아직 그래프(graph)를 깊게 배우지 않았지만, 이미 “대상과 대상의 연결”이라는 감각이 들어 있습니다.
같은 사람 데이터라도 목적이 다르면 구조가 달라집니다. 이것이 자료구조가 필요한 이유입니다.
AI 실습에서 자료구조 감각이 필요한 이유¶
AI 실습에서는 자료구조를 노골적으로 배우지 않아도 여러 구조를 계속 만납니다.
| AI 실습 상황 | 자주 보이는 구조 | 읽는 관점 |
|---|---|---|
| 여러 문장 입력 | 리스트(list) | 문장을 하나씩 처리 |
| 라벨 번호와 이름 연결 | 딕셔너리(dictionary) | 키로 라벨 이름 찾기 |
| 중복 토큰 확인 | 집합(set) | 들어 있는지 확인 |
| 표 형식 데이터 | 테이블(table), DataFrame | 행과 열로 접근 |
| 문장 안의 토큰 흐름 | 시퀀스(sequence) | 순서대로 처리 |
| 문서와 문서의 연결 | 그래프(graph) | 관계를 따라 이동 |
이 절에서 중요한 것은 모든 구조를 외우는 것이 아닙니다. 데이터가 어떤 질문을 요구하는지 보는 것입니다.
- 순서가 중요한가?
- 이름으로 찾아야 하는가?
- 중복을 제거해야 하는가?
- 계층이 있는가?
- 관계를 따라가야 하는가?
- 빠르게 검색해야 하는가?
질문이 달라지면 자료구조도 달라집니다.
자료구조 선택은 성능만의 문제가 아니다¶
자료구조를 배우면 성능 이야기가 따라옵니다. 검색이 빠른가, 추가가 빠른가, 메모리를 얼마나 쓰는가 같은 질문입니다. 이것은 중요합니다.
하지만 여기서는 성능만 보지 않습니다. 읽기 쉬움, 실수 가능성, 데이터의 의미도 함께 봅니다.
예를 들어 작은 데이터에서는 리스트를 훑어도 충분할 수 있습니다.
문제 상황: 데이터가 작을 때는 리스트를 순회해 필요한 학생을 찾는 방식도 가능함을 보고 싶습니다. 입력(input): 학생 딕셔너리 리스트 students. 기대 출력(output): 이름이 "Kim"인 학생의 점수. 확인할 개념: 자료구조 선택은 성능뿐 아니라 데이터 크기와 읽기 쉬움도 함께 봐야 합니다.
데이터가 커지고 이름으로 자주 찾아야 한다면 딕셔너리가 더 자연스럽습니다.
문제 상황: 같은 조회를 이름 기반 구조에서 더 직접적으로 수행하는 예를 보고 싶습니다. 입력(input): 학생 이름을 키로 가진 student_by_name. 기대 출력(output): "Kim"의 점수 82. 확인할 개념: 구조 자체가 자주 하는 연산을 드러내면 코드 의도도 더 선명해집니다.
이 차이는 단지 빠르고 느린 문제가 아닙니다. 두 번째 코드는 “이름으로 찾는다”는 목적을 구조 자체가 드러냅니다.
좋은 자료구조는 코드의 의도도 드러냅니다.
사례 및 예시¶
사례 1. 같은 학생 데이터인데 왜 구조를 다시 골라야 하는가¶
한 학습자가 학생 점수 데이터를 가지고 세 가지 일을 하려 한다고 하겠습니다. 전체 평균을 내고 싶고, 특정 이름의 점수를 바로 찾고 싶고, 친구 관계까지 함께 보고 싶습니다.
사람은 처음에 어차피 같은 데이터니까 한 구조에 다 넣으면 되지 않을까라고 생각할 수 있습니다. 하지만 평균 계산은 순서대로 숫자를 보는 쪽이 편하고, 이름 검색은 키로 찾는 쪽이 편하며, 친구 관계는 연결을 따라가는 쪽이 더 자연스럽습니다.
이 절이 자료구조를 데이터를 조직하는 방식으로 설명하는 이유가 여기에 있습니다. 구조를 고른다는 것은 문법 취향을 고르는 일이 아니라, 어떤 질문에 더 쉽게 답할지 정하는 일입니다.
확인 가능한 결과는 같은 원천 데이터에서도 작업이 달라지면 표현이 달라진다는 점입니다. 평균 계산용 점수 목록, 이름별 점수 딕셔너리, 친구 관계 그래프가 각각 더 읽기 쉬워진다면, 이미 자료구조 선택이 계산 방식에 영향을 준 것입니다.
체크리스트¶
- 자료구조(data structure)를 데이터를 조직하는 방식으로 설명할 수 있다.
- 전통적 자료구조 개론에서 배열, 연결 리스트, 스택, 큐, 트리, 그래프, 해시 테이블이 어떤 질문을 대표하는지 설명할 수 있다.
- 선형 구조와 비선형 구조의 차이를 입문 수준에서 설명할 수 있다.
- 자료구조가 검색, 추가, 삭제, 순회 같은 연산과 연결됨을 설명할 수 있다.
- 같은 데이터도 순서, 키, 관계에 따라 다른 구조로 표현될 수 있음을 설명할 수 있다.
- 추상 자료형(ADT)과 구현(implementation)을 입문 수준에서 구분할 수 있다.
- AI 실습에서 리스트, 딕셔너리, 집합, 표, 그래프가 서로 다른 질문에 답하기 위한 구조임을 설명할 수 있다.
- 데이터를 그냥 모아 두는 것이 아니라 어떤 질문에 답하게 만들 것인지와 자료구조 선택을 연결할 수 있다.
출처와 참고 자료¶
- Paul E. Black, data structure, Dictionary of Algorithms and Data Structures, NIST, 확인 날짜: 2026-07-20. 자료구조를 데이터를 조직하는 방식으로 설명하는 정의 확인에 사용했다.
- Paul E. Black, abstract data type, Dictionary of Algorithms and Data Structures, NIST, 확인 날짜: 2026-07-20. 추상 자료형을 구현보다 동작 관점의 틀로 구분하는 근거로 사용했다.
- Python Software Foundation, Data Structures, Python 3.14.6 documentation, 확인 날짜: 2026-07-20. Python 리스트와 딕셔너리 예시를 자료구조 선택 설명에 연결하는 근거로 사용했다.