-
[자료구조] List, Dict, Set - 자료구조를 선택한다는 것IT 2026. 1. 22. 17:57
코드를 처음 배울 때 우리는 리스트, 딕셔너리, 셋을 나란히 외웁니다. 문법은 금방 익숙해지지만, 막상 코드를 짜다 보면 이런 순간이 옵니다.
“이 상황에서는 리스트가 맞을까, 딕셔너리가 맞을까?”
이 글은 각 자료구조의 메서드를 나열하는 글이 아닙니다. 대신 파이썬이 왜 이 세 가지를 기본 자료구조로 제공하는지, 그리고 언제 무엇을 선택해야 자연스러운지를 하나의 이야기로 정리해보려 합니다.
리스트는 ‘순서가 있는 모음’이다
리스트를 떠올릴 때 가장 중요한 키워드는 순서입니다.
numbers = [10, 20, 30]이 안에서 10이 첫 번째라는 사실은 의미를 가집니다. 리스트는 값 그 자체보다도 배열된 위치가 중요한 자료구조입니다. 그래서 리스트는 다음과 같은 상황에 잘 어울립니다.
- 데이터의 나열 순서가 중요할 때
- 인덱스로 접근해야 할 때
- 동일한 값이 여러 번 등장해도 괜찮을 때
리스트는 파이썬에서 가장 직관적인 자료구조이지만, 그만큼 의미를 스스로 설명해주지는 않습니다. 값이 무엇을 뜻하는지는 항상 코드 밖의 맥락에 달려 있습니다.
딕셔너리는 ‘의미를 가진 값의 집합’이다
딕셔너리는 리스트와 완전히 다른 관점에서 출발합니다.
user = { "name": "Alice", "age": 30 }여기서 중요한 것은 순서가 아니라 키와 값의 관계입니다. 30이라는 숫자는 그 자체로 의미가 없지만, "age"라는 키와 함께 있을 때 비로소 의미를 얻습니다.
딕셔너리는 다음과 같은 상황에서 자연스럽습니다.
- 값마다 명확한 이름(의미)이 있을 때
- 인덱스 대신 키로 접근하고 싶을 때
- 데이터 구조가 명시적으로 드러나야 할 때
그래서 딕셔너리는 설정 값, 객체의 상태 표현, JSON 구조 등에서 압도적으로 많이 사용됩니다.
리스트 vs 딕셔너리의 본질적인 차이
리스트와 딕셔너리의 차이는 성능 이전에 모델링 방식의 차이입니다.
- 리스트 → “이 값은 몇 번째인가?”
- 딕셔너리 → “이 값은 무엇인가?”
만약 어떤 코드에서 data[0], data[1] 같은 접근이 많아진다면, 그것은 종종 딕셔너리로 바꿀 신호이기도 합니다.
셋은 ‘존재 여부만 중요한 집합’이다
셋은 리스트와 비슷해 보이지만, 관점이 완전히 다릅니다.
ids = {1, 2, 3}셋에서 중요한 것은 오직 하나입니다.
“이 값이 있느냐, 없느냐”
그래서 셋은 다음과 같은 특징을 가집니다.
- 중복을 허용하지 않음
- 순서를 보장하지 않음
- 매우 빠른 포함 여부 검사
셋은 데이터의 존재성 자체가 의미일 때 가장 강력한 선택입니다.
셋과 딕셔너리는 사실 같은 뿌리다
조금 더 깊이 들어가면, 셋과 딕셔너리는 내부적으로 매우 닮아 있습니다. 둘 다 해시 기반 구조이며, 딕셔너리는 말하자면 값이 붙은 셋에 가깝습니다.
- 셋 → 값만 있음
- 딕셔너리 → 키 + 값
그래서 “값의 집합”이 필요하면 셋, “키-값의 대응”이 필요하면 딕셔너리를 고르면 됩니다.
튜플은 왜 따로 존재할까
튜플은 리스트와 거의 비슷해 보이지만, 결정적인 차이가 있습니다.
point = (10, 20)튜플은 **불변(immutable)**입니다. 이 불변성 덕분에 튜플은 다음과 같은 역할을 합니다.
- 변하면 안 되는 데이터 표현
- 딕셔너리의 키로 사용
- 함수의 반환값 구조화
즉, 튜플은 “바뀌지 않는 리스트”라기보다는 의미가 고정된 값 묶음에 가깝습니다.
어떤 자료구조를 선택해야 할까
정답은 항상 하나입니다.
- 순서와 반복 → 리스트
- 의미와 이름 → 딕셔너리
- 존재 여부 → 셋
- 고정된 구조 → 튜플
이 기준만으로도 자료구조 선택의 80%는 해결됩니다.
마무리하며
파이썬의 기본 자료구조들은 단순한 컨테이너가 아닙니다. 각각은 데이터를 바라보는 관점을 담고 있습니다.
어떤 자료구조를 쓰느냐는 성능 이전에, 생각을 어떻게 구조화하느냐의 문제입니다. 이 차이를 의식하기 시작하면, 코드의 가독성과 설계가 눈에 띄게 달라집니다.
'IT' 카테고리의 다른 글
[Python] 커링(currying)을 이해한다는 것 (0) 2026.01.23 [DB] DB에서 인덱스란 무엇인가 — 인덱스 스캔과 시퀀스 스캔 (1) 2026.01.22 [Python] 메타클래스를 이해한다는 것 (0) 2026.01.22 [Python] dataclass는 내부적으로 무엇을 하는가 (0) 2026.01.22 [Python] __getattribute__와 getattr — 속성 접근의 마지막 퍼즐 (0) 2026.01.22