안녕하세요! 지난 시간에는 조건문과 반복문을 중첩하여 사용하는 방법을 통해 프로그램의 흐름을 더욱 복잡하고 정교하게 제어하는 법을 배웠습니다. 이제 여러분의 파이썬 프로그램은 다양한 상황에 따라 유연하게 동작할 수 있게 되었을 거예요!
이번 시간부터는 파이썬에서 데이터를 효율적으로 저장하고 관리하는 데 사용되는 핵심적인 **자료구조(Data Structure)**에 대해 알아보겠습니다. 그 첫 번째 주인공은 바로 **리스트(List)**입니다.
리스트는 여러 개의 데이터를 순서대로 담아 관리할 수 있는 매우 유용하고 유연한 자료구조입니다. 마치 여러 물건을 한 줄로 나열해 놓은 진열대와 같다고 생각하시면 됩니다.
Part 1: 리스트(List)란 무엇인가?
파이썬의 리스트는 다음과 같은 특징을 가집니다.
- 순서가 있다: 데이터를 저장한 순서가 유지됩니다. 따라서 인덱스(Index)를 사용하여 특정 위치의 데이터에 접근할 수 있습니다.
- 다양한 자료형 저장 가능: 하나의 리스트 안에 정수, 실수, 문자열, 심지어 다른 리스트까지! 어떤 자료형의 데이터든 함께 저장할 수 있습니다.
- 변경 가능하다 (mutable): 한 번 만든 리스트의 요소를 추가, 삭제, 변경할 수 있습니다.
- 중복 허용: 같은 값을 여러 번 저장할 수 있습니다.
1. 리스트 만들기
리스트는 대괄호([]) 안에 쉼표(,)로 구분하여 요소들을 나열하는 방식으로 만듭니다.
예시:
# 파일 이름: list_creation.py
# 다양한 자료형을 포함하는 리스트
numbers = [1, 2, 3, 4, 5]
fruits = ["사과", "바나나", "체리", "사과"] # 중복 허용
mixed_data = [10, "Hello", 3.14, True] # 다양한 자료형
# 빈 리스트도 만들 수 있습니다.
empty_list = []
print("숫자 리스트:", numbers)
print("과일 리스트:", fruits)
print("혼합 데이터 리스트:", mixed_data)
print("빈 리스트:", empty_list)
print("numbers의 자료형:", type(numbers))
# 파일 이름: list_creation.py
# 다양한 자료형을 포함하는 리스트
numbers = [1, 2, 3, 4, 5]
fruits = ["사과", "바나나", "체리", "사과"] # 중복 허용
mixed_data = [10, "Hello", 3.14, True] # 다양한 자료형
# 빈 리스트도 만들 수 있습니다.
empty_list = []
print("숫자 리스트:", numbers)
print("과일 리스트:", fruits)
print("혼합 데이터 리스트:", mixed_data)
print("빈 리스트:", empty_list)
print("numbers의 자료형:", type(numbers))
[VS Code 터미널 출력]

Part 2: 리스트 요소 접근하기 - 인덱싱(Indexing)
리스트의 각 요소는 고유한 인덱스(Index) 번호를 가집니다. 이 인덱스를 사용하여 특정 위치의 요소에 접근할 수 있습니다.
- 인덱스는 0부터 시작: 첫 번째 요소의 인덱스는 0, 두 번째는 1... 이런 식입니다.
- 음수 인덱스: 뒤에서부터 접근할 때는 음수 인덱스를 사용합니다. [-1]은 마지막 요소, [-2]는 뒤에서 두 번째 요소입니다.
1. 인덱스를 이용한 요소 접근
예시:
# 파일 이름: list_indexing.py
my_list = ["apple", "banana", "cherry", "date", "elderberry"]
# 양수 인덱스 (앞에서부터 세기)
print(f"첫 번째 요소 (인덱스 0): {my_list[0]}")
print(f"세 번째 요소 (인덱스 2): {my_list[2]}")
print(f"다섯 번째 요소 (인덱스 4): {my_list[4]}")
# 음수 인덱스 (뒤에서부터 세기)
print(f"마지막 요소 (인덱스 -1): {my_list[-1]}")
print(f"뒤에서 두 번째 요소 (인덱스 -2): {my_list[-2]}")
# 파일 이름: list_indexing.py
my_list = ["apple", "banana", "cherry", "date", "elderberry"]
# 양수 인덱스 (앞에서부터 세기)
print(f"첫 번째 요소 (인덱스 0): {my_list[0]}")
print(f"세 번째 요소 (인덱스 2): {my_list[2]}")
print(f"다섯 번째 요소 (인덱스 4): {my_list[4]}")
# 음수 인덱스 (뒤에서부터 세기)
print(f"마지막 요소 (인덱스 -1): {my_list[-1]}")
print(f"뒤에서 두 번째 요소 (인덱스 -2): {my_list[-2]}")
[VS Code 터미널 출력]

2. 리스트 길이 확인하기 (len() 함수)
- len() 함수는 리스트에 몇 개의 요소가 들어있는지, 즉 리스트의 길이를 반환합니다.
예시:
# 파일 이름: list_length.py
my_list = ["apple", "banana", "cherry"]
list_length = len(my_list)
print(f"리스트의 길이: {list_length}")
empty_list = []
print(f"빈 리스트의 길이: {len(empty_list)}")
# 파일 이름: list_length.py
my_list = ["apple", "banana", "cherry"]
list_length = len(my_list)
print(f"리스트의 길이: {list_length}")
empty_list = []
print(f"빈 리스트의 길이: {len(empty_list)}")
[VS Code 터미널 출력]

Part 3: 리스트 요소 변경하기
리스트는 변경 가능한(mutable) 자료형이므로, 인덱스를 사용하여 특정 위치의 요소를 새로운 값으로 변경할 수 있습니다.
예시:
# 파일 이름: list_modification.py
fruits = ["사과", "바나나", "체리"]
print(f"원본 리스트: {fruits}")
# 인덱스를 사용하여 요소 변경
fruits[1] = "오렌지" # 인덱스 1의 '바나나'를 '오렌지'로 변경
print(f"변경 후 리스트: {fruits}")
# 존재하지 않는 인덱스에 접근하면 오류 발생!
# fruits[3] = "포도" # IndexError: list assignment index out of range
# 파일 이름: list_modification.py
fruits = ["사과", "바나나", "체리"]
print(f"원본 리스트: {fruits}")
# 인덱스를 사용하여 요소 변경
fruits[1] = "오렌지" # 인덱스 1의 '바나나'를 '오렌지'로 변경
print(f"변경 후 리스트: {fruits}")
# 존재하지 않는 인덱스에 접근하면 오류 발생!
# fruits[3] = "포도" # IndexError: list assignment index out of range
[VS Code 터미널 출력]

Part 4: 리스트에 요소 추가/삭제하기
리스트는 동적으로 크기가 변할 수 있으므로, 요소를 추가하거나 삭제하는 기능이 매우 중요합니다.
1. 요소 추가하기 (append(), insert())
- append(item): 리스트의 맨 뒤에 새로운 요소를 추가합니다.
- insert(index, item): 특정 index 위치에 item을 삽입합니다. 해당 인덱스부터 뒤의 요소들은 한 칸씩 뒤로 밀립니다.
예시:
# 파일 이름: list_add_elements.py
my_numbers = [1, 2, 3]
print(f"원본 리스트: {my_numbers}")
# append로 맨 뒤에 요소 추가
my_numbers.append(4)
my_numbers.append(5)
print(f"append 후: {my_numbers}") # 결과: [1, 2, 3, 4, 5]
# insert로 특정 위치에 요소 삽입
my_numbers.insert(0, 0) # 인덱스 0에 0 삽입
print(f"insert(0, 0) 후: {my_numbers}") # 결과: [0, 1, 2, 3, 4, 5]
my_numbers.insert(3, 2.5) # 인덱스 3에 2.5 삽입
print(f"insert(3, 2.5) 후: {my_numbers}") # 결과: [0, 1, 2, 2.5, 3, 4, 5]
# 파일 이름: list_add_elements.py
my_numbers = [1, 2, 3]
print(f"원본 리스트: {my_numbers}")
# append로 맨 뒤에 요소 추가
my_numbers.append(4)
my_numbers.append(5)
print(f"append 후: {my_numbers}")
# insert로 특정 위치에 요소 삽입
my_numbers.insert(0, 0) # 인덱스 0에 0 삽입
print(f"insert(0, 0) 후: {my_numbers}")
my_numbers.insert(3, 2.5) # 인덱스 3에 2.5 삽입
print(f"insert(3, 2.5) 후: {my_numbers}")
[VS Code 터미널 출력]

2. 요소 삭제하기 (remove(), pop(), del)
- remove(value): 리스트에서 처음 발견되는 특정 값을 삭제합니다. 값이 없으면 오류가 발생합니다.
- pop(index): 특정 index 위치의 요소를 삭제하고 그 요소를 반환합니다. 인덱스를 지정하지 않으면 마지막 요소를 삭제하고 반환합니다.
- del 리스트[index]: 특정 index 위치의 요소를 삭제합니다. pop()처럼 반환하지는 않습니다.
예시:
# 파일 이름: list_delete_elements.py
items = ["빵", "우유", "계란", "빵", "치즈"]
print(f"원본 리스트: {items}")
# remove로 값 삭제
items.remove("빵") # 첫 번째 '빵'이 삭제됩니다.
print(f"remove('빵') 후: {items}") # 결과: ['우유', '계란', '빵', '치즈']
# pop으로 인덱스 삭제 및 값 반환
removed_item = items.pop(1) # 인덱스 1의 '계란' 삭제 및 반환
print(f"pop(1) 후: {items}, 삭제된 항목: {removed_item}") # 결과: ['우유', '빵', '치즈'], 삭제된 항목: 계란
last_item = items.pop() # 인덱스 지정 안 하면 마지막 요소 삭제
print(f"pop() 후: {items}, 삭제된 항목: {last_item}") # 결과: ['우유', '빵'], 삭제된 항목: 치즈
# del로 인덱스 삭제
del items[0] # 인덱스 0의 '우유' 삭제
print(f"del items[0] 후: {items}") # 결과: ['빵']
# 모든 요소 삭제
items.clear()
print(f"clear() 후: {items}") # 결과: []
# 파일 이름: list_delete_elements.py
items = ["빵", "우유", "계란", "빵", "치즈"]
print(f"원본 리스트: {items}")
# remove로 값 삭제
items.remove("빵") # 첫 번째 '빵'이 삭제됩니다.
print(f"remove('빵') 후: {items}")
# pop으로 인덱스 삭제 및 값 반환
removed_item = items.pop(1) # 인덱스 1의 '계란' 삭제 및 반환
print(f"pop(1) 후: {items}, 삭제된 항목: {removed_item}")
last_item = items.pop() # 인덱스 지정 안 하면 마지막 요소 삭제
print(f"pop() 후: {items}, 삭제된 항목: {last_item}")
# del로 인덱스 삭제
del items[0] # 인덱스 0의 '우유' 삭제
print(f"del items[0] 후: {items}")
# 모든 요소 삭제
items.clear()
print(f"clear() 후: {items}")
[VS Code 터미널 출력]

마무리하며
이번 시간에는 파이썬의 가장 기본적인 자료구조 중 하나인 **리스트(List)**에 대해 정의부터 생성, 요소 접근(인덱싱), 변경, 추가, 삭제까지 자세히 알아보았습니다. 리스트는 데이터를 순서대로 관리하고 동적으로 크기를 조절할 수 있어 거의 모든 파이썬 프로그램에서 광범위하게 사용됩니다.
이제 여러분은 파이썬에서 여러 데이터를 효과적으로 묶고 조작할 수 있는 강력한 도구를 얻게 되었습니다.
다음 포스팅에서는 리스트와 비슷하지만 중요한 차이점을 가진 또 다른 자료구조인 **튜플(Tuple)**과 그 불변성에 대해 알아보겠습니다.
궁금한 점이 있다면 언제든지 질문해주세요! 다음 포스팅에서 만나요!
'Python' 카테고리의 다른 글
3-3. 딕셔너리(Dictionary)의 개념과 키-값 구조 (0) | 2025.06.23 |
---|---|
3-2. 튜플(Tuple)과 불변성 (0) | 2025.06.23 |
2-6. 중첩 조건문과 반복문 활용 (0) | 2025.06.22 |
2-5. break, continue의 사용법 (0) | 2025.06.22 |
2-4. for 반복문과 range() (0) | 2025.06.22 |