타입 시스템을 비교 분석하고, 특히 파이썬(Python) 환경에서 변수가 메모리를 관리하는 내부 동작 원리를 살펴보는 글.
변수의 자료형(Type)을 결정하는 방식에 따라 언어의 특성이 결정된다. 이를 비유를 통해 명확히 구분할 수 있다.
-> 아래는 파이썬(동적 타이핑)에 대한 내용
동적 타이핑 언어인 파이썬에서 a = 5 이후 a = "Hello"와 같이 자료형을 변경하며 재할당할 때의 내부 동작은 다음과 같다.
5라는 정수 객체가 생성된다.a라는 포스트잇이 5 객체에 부착된다."Hello" 문자열 객체가 생성되고, 포스트잇 a를 기존의 5에서 떼어내어 "Hello"에 다시 부착한다.5 객체는 파이썬의 청소부인 가비지 컬렉터에 의해 메모리에서 삭제된다.하나의 객체에 여러 개의 이름표(변수)를 붙일 때 발생하는 현상을 Aliasing이라고 하며, 이는 데이터 무결성에 큰 영향을 미친다.
두 명의 팀원이 하나의 수박을 공유하는 상황을 코드로 재현하면 다음과 같다.
# 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
리스트와 같이 내부 수정이 가능한 Mutable(가변) 객체는 Aliasing 상태에서 의도치 않은 변경을 초래할 수 있다.
my_watermelon.append("꿀맛")을 수행하면, 실제 데이터 자체가 수정된다.our_food를 확인했을 때도 ["수박", "꿀맛"]으로 변경되어 나타난다.이는 대규모 데이터 파이프라인 설계 시 원본 데이터를 보호하기 위해 반드시 깊은 복사(Deep Copy)와 같은 기법이 필요한 이유가 된다.
함수 호출 시 매개변수(Parameter)에 값을 직접 지정하여 전달하는 방식은 새로운 변수를 생성하는 것과는 구분되는 '설정(Configuration)'의 개념으로 이해해야 한다.
키워드 인자: 함수 정의 시 미리 지정된 매개변수 이름을 명시하여 인자(Argument)를 전달하는 방식이다. 인자의 순서와 상관없이 특정 매개변수에 값을 할당할 수 있다.
주요 매개변수 분석 (print 함수 예시):
end (종료 문자): * print 함수 호출 종료 시 출력할 문자를 결정한다. \n)이나, end=''와 같이 명시함으로써 다음 출력문과의 연결 방식을 제어할 수 있다.sep (구분자, Separator): * 쉼표(,)로 나열된 여러 개의 출력 인자들 사이를 채울 문자를 결정한다.' ')이며, 이를 변경하여 간격을 없애거나 특정 기호(예: -, /)로 대체할 수 있다. # sep 매개변수 활용 예시
print("010", "1234", "5678", sep="-") # 출력: 010-1234-5678작동 원리: 위 매개변수들은 새로운 메모리 공간에 영구적인 변수를 생성하는 행위가 아니다. 함수 내부에 정의된 설정값(Default Value)을 사용자 정의 값으로 일시적으로 치환하는 행위이며, 해당 함수의 실행이 종료됨과 동시에 해당 설정은 소멸한다.
효율적인 디버깅을 위해 자료형의 가변성을 파악하는 것이 필수적이다.
x[0] = 1과 같이 인덱스를 통한 직접 수정을 시도했을 때 에러가 나면 Immutable(str, tuple 등), 성공하면 Mutable(list, dict 등)이다.id() 값이 바뀌면 Immutable(새 집으로 이사), 그대로이면 Mutable(현 거주지에서 수리)이다.| 분류 | 특징 | 주요 자료형 |
|---|---|---|
| Immutable (불변) | 값 변경 시 기존 객체를 수정하지 않고 새로운 객체를 생성함 | int, str, tuple, bool |
| Mutable (가변) | 기존 객체의 메모리 주소를 유지한 채 내부의 값을 변경 가능함 | list, dict, set |