변수 여러 개를 하나로 묶어 관리하는 파이썬의 4가지 자료구조인 리스트, 튜플, 딕셔너리, 집합의 특징과 차이점을 명확히 정리해요. 상황별로 어떤 자료구조를 선택해야 하는지 완벽한 가이드를 제공하며, 입문자가 자주 겪는 리스트 참조 문제나 딕셔너리 키 제약 조건 등 실무에 바로 적용할 수 있는 꿀팁을 알려드려요.
목차
- 왜 자료구조가 필요한가요?
- 1. 리스트 (list) — 가장 많이 쓰는 자료구조
- 2. 튜플 (tuple) — 바뀌면 안 되는 데이터
- 3. 딕셔너리 (dict) — 이름으로 찾는 자료구조
- 4. 집합 (set) — 중복 없는 자료구조
- 한눈에 보는 4가지 자료구조 비교 및 자주 하는 실수
- 자주 묻는 질문
왜 자료구조가 필요한가요?
프로그래밍을 처음 배우면 변수 하나에 값 하나를 담는 방법을 가장 먼저 알게 돼요. 그런데 만약 학생 30명의 수학 점수를 저장해야 한다면 어떨까요? 변수를 30개 만드는 건 너무 비효율적이잖아요.
일반 변수를 여러 개 만드는 방식과 자료구조를 사용하는 방식을 비교해 볼게요.
변수 수십 개를 만들 필요 없이 대괄호 하나로 깔끔하게 정리되었죠? 이렇게 여러 값을 하나의 변수에 묶어서 다루는 방법이 바로 자료구조예요. 파이썬에는 상황에 맞게 골라 쓸 수 있는 4가지 기본 자료구조가 있어요. 하나씩 차근차근 살펴볼게요.
1. 리스트 (list) — 가장 많이 쓰는 자료구조
리스트는 파이썬에서 가장 기본적이고 자주 쓰이는 자료구조예요. 대괄호 []로 만들고, 순서가 있으며 나중에 안의 내용을 마음대로 수정할 수 있다는 것이 가장 큰 특징이에요.
데이터를 꺼낼 때는 인덱스라는 위치 번호를 사용해요. 여기서 제일 중요한 건 파이썬의 인덱스는 0부터 시작한다는 거예요. 첫 번째 값이 1이 아니라 0번 자리라는 걸 꼭 기억해야 해요. 원하는 범위만큼 잘라내는 슬라이싱 기능도 있어요.
기본적인 리스트 생성과 인덱싱, 슬라이싱, 그리고 자주 쓰는 메서드들을 살펴볼게요.
리스트를 다룰 때 인덱싱만큼 중요한 기능들이니 꼭 직접 타이핑해서 결과를 확인해 보세요.
여기서 초보자들이 정말 많이 당황하는 문제가 하나 있어요. 바로 리스트를 다른 변수에 복사할 때 생기는 문제예요. 리스트를 = 기호로 다른 변수에 넣으면 값 자체가 복사되는 게 아니라, 데이터가 있는 메모리 주소(참조)만 공유하게 돼요. 이럴 때는 안전하게 복사하는 방법을 알아야 해요. 파이썬 리스트 복사 가이드를 보면 copy 모듈을 사용해서 이 문제를 해결하는 방법이 잘 나와 있어요.
⚠️ Warning
리스트 안의 데이터가 바뀌면 안 될 때는 단순히 ‘=’ 기호로 할당하면 안 돼요. 원본 데이터가 같이 손상될 수 있어요.
단순 할당과 올바른 복사 방법의 차이를 코드로 확인해 볼게요.
2. 튜플 (tuple) — 바뀌면 안 되는 데이터
튜플은 리스트와 거의 비슷하게 생겼어요. 차이점이 있다면 대괄호 [] 대신 소괄호 ()를 쓴다는 것, 그리고 한 번 만들면 안의 내용을 절대 수정할 수 없다는 점이에요.
“수정할 수 없으면 불편한 거 아니야?”라고 생각할 수 있어요. 하지만 프로그램 설정값, GPS 좌표(위도, 경도), RGB 색상값처럼 중간에 값이 바뀌면 큰일 나는 데이터들이 있죠. 이런 데이터를 다룰 때는 실수로 값이 변경되는 걸 막아주는 튜플이 아주 유용해요.
튜플을 만들고 언패킹하는 방법, 그리고 수정하려고 할 때 발생하는 에러를 살펴볼게요.
❗ 중요
요소가 하나뿐인 튜플을 만들 때는 값 뒤에 쉼표를 찍는 것을 절대 잊지 마세요. 쉼표가 없으면 파이썬은 그냥 괄호로 묶인 일반 숫자로 오해해요.
3. 딕셔너리 (dict) — 이름으로 찾는 자료구조
앞서 본 리스트와 튜플은 데이터가 들어간 ‘순서(인덱스)’로 값을 찾았죠. 반면에 딕셔너리는 키(Key)와 값(Value)의 쌍으로 데이터를 저장해요. 마치 사전에서 단어를 찾으면 뜻이 나오는 것과 같아요. 중괄호 {} 안에 키: 값 형태로 만들어요.
딕셔너리에서 값을 꺼내는 방법은 두 가지가 있어요. 대괄호 []를 쓰는 방법과 .get() 메서드를 쓰는 방법이에요. 두 방법은 없는 키를 찾을 때 완전히 다르게 동작해요.
💡 Tip
실무에서는 존재하지 않는 키를 호출했을 때 프로그램이 갑자기 멈추는 걸 막기 위해 안전한 .get() 방식을 훨씬 많이 사용해요.
딕셔너리를 사용할 때 한 가지 중요한 규칙이 있어요. 파이썬 딕셔너리 키 제약조건을 살펴보면, 키는 반드시 변하지 않는 값(불변형)이어야 한다고 나와 있어요. 그래서 내용은 바뀔 수 있는 리스트는 키로 쓸 수 없지만, 수정이 불가능한 튜플이나 문자열, 숫자는 키로 쓸 수 있어요.
튜플을 언제 써야 할지 막막했다면, 이렇게 딕셔너리의 키로 활용할 때 아주 찰떡궁합이라는 걸 기억해 두세요.
4. 집합 (set) — 중복 없는 자료구조
마지막으로 알아볼 자료구조는 집합이에요. 중괄호 {}로 만든다는 점은 딕셔너리와 같지만, 키:값 형태가 아니라 값만 나열해요. 집합의 가장 큰 특징은 데이터의 중복을 절대 허용하지 않고, 순서도 없다는 점이에요.
이런 특징 덕분에 리스트 안에 들어있는 지저분한 중복 데이터들을 한 번에 깔끔하게 정리할 때 아주 유용하게 쓰여요. 수학 시간에 배웠던 교집합, 합집합, 차집합 같은 연산도 그대로 사용할 수 있어요.
📌 Note
빈 집합을 만들 때 s = {}라고 쓰면 파이썬은 빈 딕셔너리로 오해하니까, 꼭 set()이라고 명시해 줘야 해요.
한눈에 보는 4가지 자료구조 비교 및 자주 하는 실수
지금까지 배운 4가지 자료구조를 한눈에 들어오게 표로 정리해 드릴게요. 이것만 기억해도 상황에 맞는 자료구조를 쉽게 고를 수 있어요.
| 구분 | list |
tuple |
dict |
set |
|---|---|---|---|---|
| 만드는 방법 | [1, 2, 3] |
(1, 2, 3) |
{"k": 1} |
{1, 2, 3} |
| 순서 | 있음 | 있음 | 있음(삽입순) | 없음 |
| 수정 가능 | 가능 | 불가 | 가능 | 가능 |
| 중복 허용 | 허용 | 허용 | 키는 불가 | 불가 |
| 접근 방식 | 인덱스 [0] |
인덱스 [0] |
키 ["name"] |
없음 |
list: 순서가 있는 목록이 필요하고 데이터가 계속 추가, 삭제될 때tuple: 절대 바뀌면 안 되는 설정값이나 좌표를 묶어둘 때dict: 데이터를 이름(키)으로 빠르고 직관적으로 찾아야 할 때set: 데이터에서 중복을 없애거나, 두 그룹 간의 공통점/차이점을 비교할 때
마지막으로, 입문자들이 코드 작성 시 가장 많이 하는 실수 4가지를 모아봤어요. 눈으로 쓱 훑어보면서 나는 이런 실수를 하지 않도록 주의해 봐요.
코드를 짜다가 에러가 난다면 이 4가지 중에 하나일 확률이 아주 높으니 꼭 체크해 보세요.
자주 묻는 질문
Q. 리스트를 새로운 변수에 할당하고 수정했는데 원본 리스트도 같이 바뀌었어요. 왜 그런가요?
파이썬에서 리스트 같은 자료구조를 다른 변수에 = 기호로 바로 할당하면, 안의 데이터를 새로 복사하는 게 아니에요. 데이터가 저장된 메모리 주소(참조) 하나를 두 변수가 같이 쳐다보게 되거든요. 원본은 그대로 두고 독립적인 복사본을 만들고 싶다면 리스트.copy() 메서드를 쓰거나 copy 모듈의 기능들을 사용해야 해요.
Q. 딕셔너리의 키(key)로 리스트를 사용할 수 있나요?
아니요, 리스트는 딕셔너리의 키로 사용할 수 없어요. 딕셔너리의 키는 누군가 중간에 값을 바꿀 수 없는 ‘불변(immutable)’ 객체여야만 해요. 문자열이나 숫자, 그리고 안의 내용을 바꿀 수 없는 튜플은 키로 쓸 수 있지만, 값을 맘대로 추가하고 뺄 수 있는 가변(mutable) 객체인 리스트나 집합은 키로 쓸 수 없답니다.
Q. 빈 집합(set)을 만들 때 s = {} 처럼 중괄호를 사용하면 안 되나요?
네, 안 돼요. 파이썬에서 빈 중괄호 {}는 빈 딕셔너리를 만드는 데 이미 사용되고 있거든요. 집합도 중괄호를 사용하긴 하지만, 아무 데이터도 없는 빈 집합을 처음 선언할 때는 반드시 set()이라는 함수 형태를 사용해야 파이썬이 딕셔너리와 헷갈리지 않아요.