1. 시퀀스 자료형 특징
시퀀스(Sequence) 자료형은 여러 데이터가 일렬로 나열되어 저장되는 구조입니다. 데이터가 순서대로 정렬되어 있기 때문에 인덱스(Index) 번호를 통해 특정 위치의 요소를 검색하고 조회할 수 있습니다.
대표적인 시퀀스 자료형에는 변경이 불가능한 문자열(str), 튜플(tuple), 바이트(bytes)와 생성 후에도 값을 바꿀 수 있는 리스트(list), 바이트 어레이(bytearray)가 있습니다.
1.1 변경 가능(Mutable) vs 변경 불가능(Immutable)
파이썬 시퀀스의 핵심적인 차이는 ‘생성된 후에 내부 원소를 바꿀 수 있는가?’에 있습니다.
변경 불가 (Immutable) 자료형 (문자열, 튜플)
한 번 메모리에 구조가 생성되면 원천적으로 그 내부 값을 바꾸거나 지울 수 없습니다.
s = "창덕"
# s[0] = "성" # TypeError 발생! 문자열은 부분 수정이 막혀있습니다.
t = ("고", "요", "한")
# t[0] = "김" # TypeError 발생! 튜플 역시 부분 갱신을 지원하지 않습니다.
[!NOTE] 내부 상태를 바꾸는 것이 금지되어 있기 때문에, 시퀀스의 내용을 일부 변형하려면 무조건 기존 객체를 복제한 “완전히 새로운” 인스턴스가 반환됩니다.
변경 가능 (Mutable) 자료형 (리스트)
생성된 후에도 기존 메모리 안착된 구조를 그대로 유지한 채 데이터를 끼워 넣거나 삭제할 수 있습니다.
l = ["전", "민", "수"]
l[0] = "김"
print(l) # ['김', '민', '수'] (기존 리스트 인스턴스의 값이 정상적으로 치환됨)
1.2 컬렉션(Collection) 상태로서의 기능
시퀀스는 곧 “구조화된 컬렉션”이므로 다음과 같은 공통 기능을 100% 보장합니다.
- 원소 개수 확인 (
len()): 내부 요소가 몇 개인지를 알려줍니다. - 반복형 변환 (
iter()): 내부의 요소를 순서대로 하나씩 뽑아낼 수 있는 반복자(Iterator)를 생성할 수 있습니다. - 포함 여부 확인 (
in): 불리언 검색 기능을 지원하여 데이터가 포함되어 있는지True,False로 반환합니다.
name = "강대명"
print(len(name)) # 3
print("대" in name) # True
1.3 인터닝(Interning) 메커니즘
자주 쓰이는 간단한 값을 매번 번거롭게 새로 생성하지 않고, 같은 모양을 유지하고 있는 변경 불가능(Immutable)한 시퀀스는 재사용성을 극대화하기 위해 파이썬 인터프리터가 인터닝(Interning) 기법을 사용합니다.
단, 새로운 생성자 함수를 명시적으로 통하지 않고 기존 객체에서 곧바로 포인터를 받아야 적용됩니다.
t = ("고", "가", "한")
ti = tuple(t) # 기존의 t를 다시 빌려줍니다.
print(t is ti) # True (메모리를 완전히 공유함)
# 변경 가능한 리스트는 인터닝이 성립되지 않습니다. 항상 새로 만들어집니다.
l = ["고", "요", "한"]
li = list(l) # 원본 데이터를 복제하여 "별개의" 리스트 생성
print(l is li) # False
서브목차