객체 참조를 통한 인수 전달 이해
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- Python 및 C 언어를 배우는 초보 개발자
- 메모리 관리와 인수 전달 방식을 이해하고자 하는 프로그래머
- 난이도: 중간 (메모리 개념과 참조/값 전달 차이를 설명)
핵심 요약
- Python에서는 가변 객체(예: 딕셔너리)가 참조로 전달되어 함수 내부에서 변경 시 원본에 영향을 준다
- C에서 기본 타입(int)은 값 전달로, 포인터를 사용해야 원본을 수정할 수 있다
box = {"item": "another box"}
와 같은 재할당은 새로운 객체를 생성해 원본을 변경하지 않는다
섹션별 세부 요약
1. Python의 객체 참조 메커니즘
my_box
변수는 딕셔너리 객체의 메모리 주소(예: 0x1234)를 참조change_box(my_box)
는 해당 주소를 복사하여 함수 내부에서 동일한 객체를 조작box["item"] = "new toy"
는 0x1234 주소의 객체를 수정해my_box
에도 반영
2. C의 값 전달과 포인터 사용
try_to_change(int x)
는num
의 값을 복사(0x2000 주소)하여 변경 시 원본(0x1000
)에 영향 없음change_number(int ptr)
는num
의 주소(#
)를 전달해ptr = 100
으로 원본을 직접 수정
3. 재할당 시 발생하는 변화
box = {"item": "another box"}
는 새로운 딕셔너리(0x5678)를 생성하여my_box
는 0x1234에 남음- C의 포인터 재할당(
ptr = malloc(...)
)은 새로운 메모리 주소를 가리키게 해 원본과 분리
결론
- Python에서 가변 객체는 참조로 전달되지만, 재할당은 새로운 객체를 생성
- C에서는 포인터를 사용해야 원본 값을 수정할 수 있음
- 메모리 주소 개념과 참조/값 전달 차이를 철저히 이해해야 실무에서 버그를 방지할 수 있음