함수에 인자를 전달하는 방식에는 크게 두가지가 있다.
#include <stdio.h>
void swap(int a, int b){
// 매개변수는 전달받은 값을 바탕으로 원본과는 전혀 다른 메모리 공간에 새로운 지역변수를 만듭니다.
// 따라서 매개변수가 원본의 value를 가진다면 원본과는 전혀 다른 변수라고 볼 수 있습니다.
int temp;
temp = a;
a = b;
b = temp;
}
int main(){
int a, b;
a = 10;
b = 20;
printf("swap 전 : %d %d\n", a, b);
swap(a, b);
printf("swap 후 : %d %d\n", a, b);
return 0;
}
하지만 원본의 주소값(reference)을 가진다면 원본에 접근이 가능하게 됩니다.
이는 call by reference라고 합니다.
#include <stdio.h>
void swap(int *a, int *b){ //포인터 변수를 선언할 때
int temp;
temp = *a; // 포인터 변수가 가리키는 값을 추출할 때
*a = *b;
*b = temp;
}
int main(){
int a, b;
a = 10;
b = 20;
printf("swap 전 : %d %d\n", a, b);
swap(&a, &b);
printf("swap 후 : %d %d\n", a, b);
return 0;
}
Java의 경우 함수에 전달되는 인자의 데이터 타입에 따라서 (원시자료형 / 참조자료형) 함수 호출 방식이 달라진다.
정리
- Call By Value - 원본 값을 그대로 복사하여 전달하며, 원본에 영향을 미칠 수 없습니다.
- Call By Reference - 원본의 주소값을 복사하여 전달하며, 원본에 영향을 미칠 수 있습니다.
변수의 주소값을 추출 및 저장하는 기능을 언어 차원에서 제공해주어야 call by reference가 가능합니다.
https://velog.io/@codemcd/Call-By-Value-VS-Call-By-Reference