Python 상기시키기

no-glass-otacku·2026년 3월 25일

[Python] 타입 시스템의 이해: Dynamic Typing과 메모리 참조 모델

타입 시스템을 비교 분석하고, 특히 파이썬(Python) 환경에서 변수가 메모리를 관리하는 내부 동작 원리를 살펴보는 글.


1. 타입 시스템: 전용 상자 vs 포스트잇

변수의 자료형(Type)을 결정하는 방식에 따라 언어의 특성이 결정된다. 이를 비유를 통해 명확히 구분할 수 있다.

1.1 정적 타이핑(Static Typing): 전용 상자 모델

  • 비유: 변수는 특정 크기와 용도가 정해진 '전용 상자'와 같다.
  • 특징: 정수형(int) 상자를 만들면 오직 정수만 담을 수 있으며, 실행 전(Compile 타임)에 상자의 규격을 결정한다.
  • 언어: C, C++, Java 등.
  • 장점: 안정성이 높고 실행 속도가 빠르나, 유연성이 부족하다.

1.2 동적 타이핑(Dynamic Typing): 포스트잇 모델

  • 비유: 변수는 데이터에 붙이는 '포스트잇(이름표)'과 같다.
  • 특징: 데이터가 먼저 존재하고, 변수는 그 데이터가 무엇이든 상관없이 이름표만 붙인다. 자료형은 실행 시점(Runtime)에 결정된다.
  • 언어: Python, JavaScript 등.
  • 장점: 개발 속도가 빠르고 유연하지만, 실행 전까지 타입 에러를 발견하기 어렵다.

-> 아래는 파이썬(동적 타이핑)에 대한 내용


2. 파이썬의 변수 할당과 재할당 메커니즘

동적 타이핑 언어인 파이썬에서 a = 5 이후 a = "Hello"와 같이 자료형을 변경하며 재할당할 때의 내부 동작은 다음과 같다.

  1. 객체 생성: 메모리 공간에 5라는 정수 객체가 생성된다.
  2. 참조(Binding): 변수 a라는 포스트잇이 5 객체에 부착된다.
  3. 재할당: 새로운 "Hello" 문자열 객체가 생성되고, 포스트잇 a를 기존의 5에서 떼어내어 "Hello"에 다시 부착한다.
  4. 가비지 컬렉션(GC): 어떠한 이름표도 붙어있지 않은(참조 카운트가 0인) 기존의 5 객체는 파이썬의 청소부인 가비지 컬렉터에 의해 메모리에서 삭제된다.

3. 별칭(Aliasing) 현상과 Mutable 객체의 주의점

하나의 객체에 여러 개의 이름표(변수)를 붙일 때 발생하는 현상을 Aliasing이라고 하며, 이는 데이터 무결성에 큰 영향을 미친다.

3.1 수박(Watermelon) 예시를 통한 고찰

두 명의 팀원이 하나의 수박을 공유하는 상황을 코드로 재현하면 다음과 같다.

# 1. 하나의 리스트 객체 생성 후 my_watermelon 이름표 부착
my_watermelon = ["수박"]

# 2. 새로운 이름표 our_food를 같은 객체에 부착 (Aliasing)
our_food = my_watermelon

# 3. id() 함수로 메모리 주소 확인 시 동일함 (id(my_watermelon) == id(our_food))
print(my_watermelon is our_food) # True

3.2 Side Effect의 발생

리스트와 같이 내부 수정이 가능한 Mutable(가변) 객체는 Aliasing 상태에서 의도치 않은 변경을 초래할 수 있다.

  • 상황: 한 명이 my_watermelon.append("꿀맛")을 수행하면, 실제 데이터 자체가 수정된다.
  • 결과: 아무 작업도 하지 않은 다른 팀원의 our_food를 확인했을 때도 ["수박", "꿀맛"]으로 변경되어 나타난다.

이는 대규모 데이터 파이프라인 설계 시 원본 데이터를 보호하기 위해 반드시 깊은 복사(Deep Copy)와 같은 기법이 필요한 이유가 된다.


4. 함수 인자 전달 메커니즘: 키워드 인자(Keyword Argument)

함수 호출 시 매개변수(Parameter)에 값을 직접 지정하여 전달하는 방식은 새로운 변수를 생성하는 것과는 구분되는 '설정(Configuration)'의 개념으로 이해해야 한다.

  • 키워드 인자: 함수 정의 시 미리 지정된 매개변수 이름을 명시하여 인자(Argument)를 전달하는 방식이다. 인자의 순서와 상관없이 특정 매개변수에 값을 할당할 수 있다.

  • 주요 매개변수 분석 (print 함수 예시):

    • end (종료 문자): * print 함수 호출 종료 시 출력할 문자를 결정한다.
      • 기본값은 줄바꿈 문자(\n)이나, end=''와 같이 명시함으로써 다음 출력문과의 연결 방식을 제어할 수 있다.
    • sep (구분자, Separator): * 쉼표(,)로 나열된 여러 개의 출력 인자들 사이를 채울 문자를 결정한다.
      • 기본값은 공백(' ')이며, 이를 변경하여 간격을 없애거나 특정 기호(예: -, /)로 대체할 수 있다.
        # sep 매개변수 활용 예시
        print("010", "1234", "5678", sep="-") # 출력: 010-1234-5678
  • 작동 원리: 위 매개변수들은 새로운 메모리 공간에 영구적인 변수를 생성하는 행위가 아니다. 함수 내부에 정의된 설정값(Default Value)을 사용자 정의 값으로 일시적으로 치환하는 행위이며, 해당 함수의 실행이 종료됨과 동시에 해당 설정은 소멸한다.


5. 결론 및 요약: Mutable vs Immutable 구별법

효율적인 디버깅을 위해 자료형의 가변성을 파악하는 것이 필수적이다.

  1. 가변성 테스트: x[0] = 1과 같이 인덱스를 통한 직접 수정을 시도했을 때 에러가 나면 Immutable(str, tuple 등), 성공하면 Mutable(list, dict 등)이다.
  2. ID 추적: 값을 변경했을 때 id() 값이 바뀌면 Immutable(새 집으로 이사), 그대로이면 Mutable(현 거주지에서 수리)이다.
분류특징주요 자료형
Immutable (불변)값 변경 시 기존 객체를 수정하지 않고 새로운 객체를 생성함int, str, tuple, bool
Mutable (가변)기존 객체의 메모리 주소를 유지한 채 내부의 값을 변경 가능함list, dict, set
profile
이제 개발해야지...

0개의 댓글