본문 바로가기
IT⦁영어⦁하자보수/IT

4. 파이썬 기초 - 2장 파이썬 프로그래밍의 기초, 자료형 (2) [조코딩]

by 별꽃74 2025. 9. 19.

파이썬 기초 - 2장 파이썬 프로그래밍의 기초, 자료형 (2) | 2023 점프 투 파이썬

안녕하세요! 👨‍🏫 오늘은 '점프 투 파이썬' 강의의 두 번째 시간, **'자료형(Data Type)'**의 두 번째 파트를 보고 왔습니다. 프로그래밍을 마치 과학 실험에 비유한다면, 자료형은 우리가 실험을 할 때 사용하는 다양한 시약들과 같아요. 🧪 각 시약의 특성과 반응 방식을 정확히 알고 있어야만 우리가 원하는 결과물을 만들어낼 수 있습니다.
지난 시간에는 숫자형, 문자열, 리스트와 같이 비교적 직관적인 자료형들을 다루었죠. 이번 시간에는 한 단계 더 나아가, 파이썬의 진정한 힘을 보여주는 특별한 자료형들인 튜플, 딕셔너리, 집합, 불, 그리고 변수에 대해 심도 깊게 파헤쳐 볼 겁니다. 마치 숙련된 과학자가 되어 이 재료들의 숨겨진 특성과 활용법을 파악하고, 여러분만의 멋진 프로그램을 만들어 보세요! 🔬✨ 이 글을 읽고 나면, 여러분은 단순한 코더를 넘어 데이터를 자유자재로 다루는 진정한 파이썬 전문가로 거듭날 수 있을 것입니다.


튜플 (Tuple), 불변의 가치 📦

튜플은 지난 시간에 배웠던 리스트와 매우 유사하지만, 가장 근본적인 차이점이 있습니다. 바로 **'불변성(Immutable)'**입니다. 🚫 리스트는 내부의 값을 자유롭게 추가, 삭제, 수정할 수 있는 '가변(Mutable)' 자료형인 반면, 튜플은 한 번 생성되면 그 값을 절대 변경할 수 없습니다. 튜플은 소괄호 ()를 사용하여 만듭니다. 사실 괄호가 없더라도 쉼표로 구분된 값들은 자동으로 튜플로 인식되기도 합니다.

  • 튜플은 왜 필요할까? 튜플의 불변성은 때로는 불편하게 느껴질 수 있지만, 이것이 바로 튜플의 가장 큰 장점이자 존재 이유입니다.
    1. 데이터 안정성 보장: 튜플에 담긴 데이터는 절대 변하지 않음을 보장하기 때문에, 프로그램이 예상치 못한 오류를 일으킬 가능성을 줄여줍니다. 🛡️ 특히 함수의 인자나 데이터베이스에서 가져온 중요한 데이터를 다룰 때 매우 유용합니다.
    2. 메모리 및 속도 효율: 가변 자료형인 리스트보다 메모리를 적게 차지하고 처리 속도가 빠릅니다.
    3. 키(Key) 역할: 딕셔너리의 키로는 변경 불가능한 자료형만 사용할 수 있는데, 튜플은 이 조건에 부합하므로 딕셔너리의 키로 활용될 수 있습니다.
  • 튜플의 특별한 기능: 언패킹(Unpacking) 파이썬에서 튜플은 **'언패킹(Unpacking)'**이라는 매우 편리한 기능을 제공합니다.위 코드처럼 튜플에 담긴 여러 값을 여러 변수에 한 번에 할당하거나, 두 변수의 값을 한 줄로 쉽게 교환할 수 있습니다. 이는 파이썬의 간결성을 보여주는 대표적인 예시입니다. 🪄
  • x, y, z = (10, 20, 30)
    print(x) # 10
    print(y) # 20
    print(z) # 30
    
    # 변수 값 교환도 한 줄로!
    a, b = 100, 200
    a, b = b, a
    print(a, b) # 200 100
    

딕셔너리 (Dictionary), 키와 값의 마법 🔑

딕셔너리는 '키(Key)'와 '값(Value)'이 한 쌍을 이루는 자료형입니다. 중괄호 {}를 사용하며, {'이름': '홍길동', '나이': 30}과 같은 형태로 데이터를 저장합니다. 마치 사전에 단어를 찾아 뜻을 알 수 있듯이, 딕셔너리는 고유한 키를 통해 해당 값에 매우 빠르게 접근할 수 있습니다. 📖

  • 딕셔너리 내부의 비밀: 해시 테이블 딕셔너리가 빠른 이유는 내부적으로 **'해시 테이블(Hash Table)'**이라는 자료 구조를 사용하기 때문입니다. 해시 테이블은 키를 특별한 값(해시)으로 변환하여, 그 해시값에 해당하는 메모리 공간에 값을 저장합니다. 이 덕분에 딕셔너리는 데이터의 양이 많아져도 키만 알고 있다면 거의 즉각적으로(평균 O(1)) 값을 찾아낼 수 있습니다. ⚡️ 이는 리스트나 튜플처럼 순차적으로 탐색해야 하는 구조와 비교했을 때 엄청난 속도 차이를 만들어냅니다.
  • 키의 규칙:
    • 고유성: 키는 중복될 수 없습니다. 만약 중복된 키를 사용하면 나중에 입력된 값으로 덮어쓰여집니다.
    • 불변성: 키로는 변경될 수 없는(immutable) 자료형만 사용할 수 있습니다. 따라서 리스트처럼 가변 자료형은 키로 사용할 수 없습니다.
  • 딕셔너리 조작법:
  • d = {'name': '조코딩', 'age': 30, 'job': 'developer'}
    
    # 새로운 키-값 쌍 추가
    d['email'] = 'jocoding@example.com'
    
    # 기존 값 변경
    d['age'] = 31
    
    # 키로 값 접근
    print(d['name']) # '조코딩'
    
    # 안전하게 값 가져오기: get()
    # 없는 키를 호출하면 에러 발생
    # print(d['address']) # KeyError 발생!
    
    # get() 함수 사용: 없는 키를 호출해도 에러가 나지 않고 None 반환
    print(d.get('address')) # None
    # 또는 기본값 설정 가능
    print(d.get('address', '주소 정보 없음')) # '주소 정보 없음'
    
  • 딕셔너리 함수: 딕셔너리는 키와 값을 다루는 다양한 함수를 제공합니다. keys()는 키들의 목록을, values()는 값들의 목록을, items()는 키-값 쌍의 목록을 반환합니다. 이 함수들을 통해 딕셔너리의 내부를 쉽게 탐색할 수 있습니다.

집합 (Set), 중복을 허용하지 않는 공간 👥

집합은 수학의 집합 개념과 똑같습니다. 중괄호 {}를 사용하며, 중복된 값을 허용하지 않고, 순서가 없습니다. 🚫 따라서 인덱싱이나 슬라이싱은 사용할 수 없지만, 중복된 값을 효율적으로 제거하거나 집합 연산을 수행하는 데 매우 강력한 힘을 발휘합니다.

  • 집합의 활용:
    1. 중복 제거: 가장 대표적인 활용법은 중복된 값을 제거하는 것입니다. 리스트에 중복된 값이 많을 경우, 집합으로 변환하면 자동으로 중복이 사라집니다.
    2. 빠른 멤버십 테스트: 특정 값이 집합 안에 존재하는지 확인하는 속도가 매우 빠릅니다. in 연산자를 사용해 'apple' in my_set과 같이 확인할 수 있습니다.
    3. 집합 연산: 합집합, 교집합, 차집합과 같은 수학적 연산을 매우 쉽게 수행할 수 있습니다.
  • 집합 연산의 마법:
수학 시간에 배웠던 벤 다이어그램을 떠올려 보세요. 파이썬의 집합은 이 연산들을 코드로 구현해 놓은 것과 같습니다.
```python
s1 = {1, 2, 3, 4, 5}
s2 = {4, 5, 6, 7, 8}

# 합집합 (union): s1과 s2의 모든 요소 포함
print(s1.union(s2))         # {1, 2, 3, 4, 5, 6, 7, 8}

# 교집합 (intersection): s1과 s2에 공통으로 있는 요소
print(s1.intersection(s2))  # {4, 5}

# 차집합 (difference): s1에서 s2의 요소를 뺀 나머지
print(s1.difference(s2))    # {1, 2, 3}

# 대칭 차집합 (symmetric_difference): 합집합 - 교집합
print(s1.symmetric_difference(s2)) # {1, 2, 3, 6, 7, 8}
```
이처럼 집합은 **고유한 값만 다루거나** **데이터 간의 관계를 분석**할 때 매우 유용합니다.

불 (Boolean), 참과 거짓의 세계 ☯️

불(Boolean) 자료형은 오직 **참(True)**과 거짓(False) 두 가지 값만을 가집니다. 마치 전구의 on/off처럼 말이죠. 💡 불 자료형은 주로 조건문(if/elif/else)이나 반복문(while)에서 조건의 참/거짓을 판별하는 데 사용됩니다.

  • 자료형의 참과 거짓: 파이썬에서는 모든 자료형이 불 자료형으로 변환될 수 있습니다. 이를 '진리값(truthy/falsy)' 이라고 부릅니다.
    • 거짓(False)으로 간주되는 것들:
      • None (값이 없음을 의미)
      • 숫자 0
      • 비어 있는 문자열 ("")
      • 빈 리스트 ([])
      • 빈 튜플 (())
      • 빈 딕셔너리 ({})
      • 빈 집합 (set())
    • 참(True)으로 간주되는 것들: 위 경우를 제외한 모든 것.
  • 논리 연산자: 불 자료형은 논리 연산자 and, or, not과 함께 사용되어 복잡한 조건을 구성할 수 있습니다.
    • A and B: A와 B 둘 다 참일 때만 참.
    • A or B: A와 B 중 하나라도 참일 때 참.
    • not A: A가 거짓일 때 참.

변수 (Variable), 데이터를 담는 그릇 🏺

변수는 프로그래밍에서 값을 저장하는 공간이라고 흔히 말합니다. 하지만 파이썬의 변수는 조금 특별합니다. 변수는 값이 저장된 메모리 주소를 가리키는 '이름표'와 같습니다. 🏷️

  • 변수 할당의 원리: a = 10이라고 코드를 작성하면, 파이썬은 메모리 어딘가에 10이라는 객체(Object)를 만들고, a라는 이름표가 그 객체를 가리키도록 연결합니다.
  • 이러한 방식은 **'이름 바인딩(Name Binding)'**이라고 부르며, 다른 언어의 변수 선언 방식과 차이가 있습니다.
  • 가변 vs. 불변 자료형의 복사: 이 '이름표' 개념은 변수 복사 시 매우 중요합니다.
    1. 불변 자료형 (숫자, 문자열, 튜플) 복사:a의 값이 변경될 때 새로운 객체가 만들어지기 때문에 b는 영향을 받지 않습니다.
    2. a = 100
      b = a # b는 a가 가리키는 객체를 똑같이 가리킴
      
      a = 200 # 새로운 객체(200)가 만들어지고, a는 그 객체를 가리킴
      print(a, b) # 200 100
      
    3. 가변 자료형 (리스트, 딕셔너리, 집합) 복사:a와 b가 같은 리스트를 가리키고 있기 때문에, a를 변경하면 b도 함께 변경됩니다. 마치 두 개의 이름표가 하나의 상자를 가리키는 것과 같죠.
    4. a = [1, 2, 3]
      b = a # b와 a는 같은 리스트를 가리킴!
      
      a.append(4) # a가 가리키는 리스트에 4를 추가
      print(a) # [1, 2, 3, 4]
      print(b) # [1, 2, 3, 4]
      
  • 진정한 복사: 만약 값만 복사하고 싶다면, 슬라이싱을 이용하거나 copy() 함수를 사용해야 합니다. 이렇게 해야 두 변수가 서로 다른 상자를 가리키게 되어 독립적으로 존재합니다.
  • 변수 교환의 마법: 파이썬은 a, b = b, a와 같이 단 한 줄의 코드로 두 변수의 값을 서로 바꿀 수 있는 매우 편리한 기능을 제공합니다. ✨ 이는 사실 내부적으로 튜플 언패킹을 활용한 것입니다.

정리하며... ✍️

오늘은 파이썬 프로그래밍의 핵심 재료들인 튜플, 딕셔너리, 집합, 불, 그리고 변수의 개념을 깊이 있게 다뤄봤습니다. 각 자료형은 고유한 특성과 용도를 가지고 있으며, 어떤 문제를 해결하느냐에 따라 가장 적합한 재료를 선택하는 것이 중요합니다.

  • 튜플은 변경되지 않는 안정적인 데이터를 다룰 때,
  • 딕셔너리는 키를 통해 빠르게 데이터를 찾고 싶을 때,
  • 집합은 중복을 제거하거나 집합 연산을 할 때,
  • 은 조건의 참/거짓을 판단할 때,
  • 변수는 값을 저장하고 관리할 때 사용됩니다.

이 멋진 재료들을 자유자재로 다루는 능력이야말로 파이썬 전문가로 성장하는 첫걸음입니다. 🚶‍♂️ 이 지식들을 바탕으로 여러분의 창의적인 아이디어를 현실로 만들어 보세요! 🌟