04-6 자료형 돌아보기
윤혜민·박현규 · 21 / 30 절지금까지 파이썬의 다양한 자료형을 공부하면서 각 자료형의 다양한 특징과 함께 코드 예제를 실행해봤습니다. 그래서 정신없이 달린 여러분에게 자료형을 대하는 시선에 대해서는 이야기할 시간이 없었네요. 그래서 자료형을 마무리하기 전에 자료형을 바라보는 시선에 대해 이야기하려고 합니다. 이미 다 설명한 내용이지만 지나가듯 설명한 것들이라 다시 돌아볼만 합니다.
값을 수정할 수 있는가? 가변성, 불변성
값을 변경하는 예제를 이야기할 때마다 값을 변경할 수 있음에 대한 유무를 이야기하면서 가변성과 불변성에 대해 이야기를 했습니다. 이를 영어로는 뮤터블, 이뮤터블이라고 이야기합니다. 뮤터블은 가변성, 이뮤터블은 불변성입니다. 이 책에서는 영어를 사용하지 않고 가변성, 불변성이라고 하겠습니다. 예를 들어 숫자, 문자열, 불, 튜플은 불변성이었습니다.
# 불변
text = "hello"
text[0] = "H" # 오류 발생! 문자열은 불변성
text[0]은 h입니다. 그래서 print(text[0])과 같이 값을 읽어 출력하는 건 괜찮습니다. 하지만 이 값을 "H"로 바꿀 수는 없습니다. 왜냐하면 문자열은 불변성을 띄고 있기 때문입니다. 반면 리스트, 딕셔너리, 집합은 가변성입니다. 그래서 값을 추가하거나 삭제할 수 있습니다.
# 가변
my_list = [1, 2, 3]
my_list[0] = 100 # OK! 리스트는 가변, [100, 2, 3]으로 바뀜
my_list[0]은 1이지만 my_list[0] = 100을 실행하면 1이 100으로 바뀝니다. 이처럼 파이썬의 자료형은 가변성 또는 불변성을 띄고 있습니다. 여러분이 나중에 프로그램을 작성할 때는 데이터가 코드로 만들어진 파도를 타고 흐를 겁니다. 그때 값의 변화를 따질 수 있어야 합니다. 어떤 값은 코드 흐름에서 변경하면 안 되는 것도 있고, 어떤 값은 변경해야 할 수도 있습니다. 이런 것들을 결정하는 건 여러분의 몫입니다. 자료형의 가변성, 불변성을 다시 떠올리기 바랍니다.
하나만 저장할지 묶어 저장할지?
따로 길게 설명할 필요 없는 내용입니다. 파이썬의 자료형은 값을 단일하게 관리할지 묶어 관리할지에 따라 다음과 같이 자료형을 준비해두었습니다.
단일한 값 : 숫자, 문자열, 불
컨테이너 : 리스트, 딕셔너리, 튜플, 집합
이때 값을 묶어 관리하는 자료형을 특별히 컨테이너 자료형이라고 부릅니다. 말 그대로 컨테이너 박스에 값을 담는 것을 상상하면 됩니다.
순서가 있는지 없는지?
집합을 통해 순서를 언급했습니다. 파이썬의 문자열, 리스트, 튜플은 순서를 기억하는 자료형입니다. 딕셔너리는 조금 애매합니다. 원래 예전 파이썬에서는 딕셔너리는 순서가 없었습니다. 하지만 이제는 딕셔너리도 순서를 유지합니다. 반면 집합은 순서를 보장하지 않습니다. 순서가 있는 자료형과 없는 자료형을 구분해야 하는 이유는 이후 나올 반복문과의 조합 때문입니다. 이미 반복문을 살펴본 적이 있죠. 반복문은 컨테이너 자료형의 요소를 왼쪽부터 하나씩 순회하면서 반복하는 구조를 갖습니다. 그래서 순서 유무가 코드의 결과에 영향을 미칩니다. 어쨌든 컨테이너 자료형에 순서 유무가 있다라는 걸 다시 기억하기 바랍니다.
인덱싱이 있는지 없는지?
순서의 유무에 따라 인덱싱을 적용할 수 있는 자료형과 그렇지 않은 자료형을 나눌 수 있습니다. 직관적으로도 당연합니다. 순서가 있어야 인덱싱으로 구성 요소를 특정할 수 있기 때문이죠. 딕셔너리는 조금 애매한데, 딕셔너리 자체는 인덱싱을 사용할 수 없습니다. 딕셔너리에는 순서가 있지만 키를 사용해야 하므로 student[0]과 같은 표현은 난센스입니다. 애초에 딕셔너리는 키를 통해 값을 찾으라고 만든 자료형이지 인덱싱을 쓰라고 만든 자료형이 아니기 때문이죠.
student = {"name": "Alice", "age": 20, "grade": "A"}
# 순서는 있지만 인덱스 접근은 안 됨
# print(student[0]) # 오류 발생!
하지만 keys( ), values( )가 반환하는 값은 객체인데 이것도 나중에 공부하겠습니다. 아무튼 객체는 list( ) 함수로 감싸면 리스트화할 수 있습니다. 그런데 리스트는 인덱싱을 할 수 있죠? 그래서 결론은 keys( ), values( )와 list( ) 함수를 연이어 조합하면 딕셔너리를 인덱싱을 사용하는 것처럼 보이게 할 수는 있습니다.
student = {"name": "Alice", "age": 20, "grade": "A"}
# 키 객체를 리스트로 변환
keys = list(student.keys())
print(keys[0]) # "name"
print(student[keys[0]]) # "Alice"
참, 거짓의 성질이 있는지?
파이썬 자료형에는 True, False 성질을 갖는 값을 자료형도 있습니다. 좀 이상하게 들릴 수도 있겠지만 이것도 스쳐지나가듯 설명한 적이 있습니다. 예를 들어 숫자형 자료형의 값 중 하나인 0은 False로 평가되는 값입니다. 빈 문자열도 False로 평가하죠. 다음 코드를 실행해봅시다. bool( ) 함수는 값의 참, 거짓을 판단해줍니다.
print(bool(0))
print(bool(""))
print(bool([]))
[실행 결과]
False
False
False
실행 결과를 보면 0, "", [ ]은 거짓으로 평가합니다. 이 값 외에는 참으로 평가합니다.
print(bool(1))
print(bool(-5))
print(bool("Hello"))
print(bool([1, 2, 3]))
[실행 결과]
True
True
True
True
이런 성질을 나중에 공부할 제어문과 조합하면 재미있는 작업을 많이 할 수 있습니다. 아무튼 값에 따라 이를 참이나 거짓으로 평가할 수 있다는 것도 기억해두기 바랍니다.
이처럼 파이썬 자료형은 그 특징에 따라 이후 프로그래밍을 진행하며 많은 것을 결정하는 중요한 재료입니다. 문법을 공부할 때는 코드를 한글자씩 입력하면서 print( ) 함수로 출력하느라 생각하지도 못하는 사실입니다. 하지만 모든 프로그램은 어떤 데이터를 처리합니다. 그래서 자료형의 특성을 잘 구분하고 이해하는 것은 중요한 일입니다. 이정도면 제 잔소리도 끝났네요. 이제 자료형을 떠나 다음 레벨인 제어문으로 이동하겠습니다.
