EP.3-3 Call by Reference
Phase 3: Memory & Address Control
EP.3-3 Call by Reference — 함수의 국경을 넘는 제어
값을 복사해주는 '통보'가 아니라, 열쇠를 넘겨주는 '권한 위임'의 기술
복사(Value)와 주소(Reference)의 차이
함수에 데이터를 보낼 때, 우리는 두 가지 선택을 할 수 있습니다. 변수 안의 내용물을 복사해서 보내느냐(Value), 아니면 변수가 있는 창고의 열쇠를 보내느냐(Reference)입니다.
포인터를 사용한 Call by Reference는 함수가 메인 공정(main)의 데이터를 직접 수정할 수 있게 해줍니다. 이것은 마치 원격지에 있는 장비의 관리자 권한을 획득하는 것과 같습니다.
⚡ 실습: 두 장비의 데이터를 맞바꾸는 Swap 공정
포인터 없이는 절대 불가능한 '값 교체(Swap)' 공정을 통해 원격 제어의 위력을 확인합니다.
#include <stdio.h>
// [함수 설계] 리모컨(주소)을 받아 직접 값을 교체함
void swap(int *pA, int *pB) {
int temp; // 값을 잠시 담아둘 임시 보관함
temp = *pA; // A의 위치로 가서 값을 temp에 보관
*pA = *pB; // B의 값을 A의 위치에 덮어쓰기
*pB = temp; // 보관했던 값을 B의 위치에 쓰기
}
int main() {
int sensor_1 = 10;
int sensor_2 = 20;
printf("교체 전: sensor_1 = %d, sensor_2 = %d\n", sensor_1, sensor_2);
// [국경 개방] 주소(&)를 함수로 전달합니다.
swap(&sensor_1, &sensor_2);
printf("교체 후: sensor_1 = %d, sensor_2 = %d\n", sensor_1, sensor_2);
return 0;
}
// [함수 설계] 리모컨(주소)을 받아 직접 값을 교체함
void swap(int *pA, int *pB) {
int temp; // 값을 잠시 담아둘 임시 보관함
temp = *pA; // A의 위치로 가서 값을 temp에 보관
*pA = *pB; // B의 값을 A의 위치에 덮어쓰기
*pB = temp; // 보관했던 값을 B의 위치에 쓰기
}
int main() {
int sensor_1 = 10;
int sensor_2 = 20;
printf("교체 전: sensor_1 = %d, sensor_2 = %d\n", sensor_1, sensor_2);
// [국경 개방] 주소(&)를 함수로 전달합니다.
swap(&sensor_1, &sensor_2);
printf("교체 후: sensor_1 = %d, sensor_2 = %d\n", sensor_1, sensor_2);
return 0;
}
수만 개의 데이터를 가진 배열을 함수로 보낼 때, 이를 일일이 복사하는 것은 엄청난 리소스 낭비입니다. 포인터(시작 주소)만 던져주면 데이터가 1개든 100만 개든 단 1초의 지체 없이 제어권을 넘길 수 있기 때문입니다. 이것이 고속 제어의 핵심입니다.
함수 안에서 *(역참조)를 사용하는 순간, 우리는 이미 함수의 벽을 뚫고 밖으로 나간 것입니다. &로 열쇠를 만들고, *로 문을 여는 이 일련의 과정이 '껌'처럼 느껴진다면 당신은 이미 포인터의 주인입니다.

댓글
댓글 쓰기