CS 면접에서 자주 나오는 개념이다.
위 두 가지는 함수 호출 방식의 차이점을 이해하는데 핵심적인 역할을 한다.
**본문에서는 가독성을 위해 Call by Value = CbV, Call by Reference = CbR 이라고 지칭하겠습니다.
Call by Value와 Call by Reference란?
프로그램에서 함수를 호출할 때, 인자를 전달하는 방식에는 'Call by Value(값에 의한 호출)'와 'Call by Reference(참조에 의한 호출)' 두 가지가 있다. 이 두 방식은 함수가 인자를 처리하는 방법에 있어서 근본적인 차이가 있다.
Call by Value (값에 의한 호출)
Call by Value는 함수가 호출될 때 실제 인자의 값이 복사되어 함수의 매개변수로 전달되는 방식이다.
이는 인자의 원래 값이 아닌, 그 값의 복사본을 사용하기 때문에 함수 내에서 매개변수의 값이 변경되더라도 원래의 인자에는 아무런 영향을 미치지 않는다.
C언어 (CbV)
#include <stdio.h>
void modifyValue(int x) {
x = 20;
printf("Inside function: x = %d\n", x);
}
int main() {
int a = 10;
modifyValue(a);
printf("After function call: a = %d\n", a);
return 0;
}
//출력 결과
Inside function: x = 20
After function call: a = 10
C++ (CbV)
#include <iostream>
using namespace std;
void modifyValue(int x) {
x = 20;
cout << "Inside function: x = " << x << endl;
}
int main() {
int a = 10;
modifyValue(a);
cout << "After function call: a = " << a << endl;
return 0;
}
//출력 결과
Inside function: x = 20
After function call: a = 10
Java (CbV)
public class Main {
public static void modifyValue(int x) {
x = 20;
System.out.println("Inside function: x = " + x);
}
public static void main(String[] args) {
int a = 10;
modifyValue(a);
System.out.println("After function call: a = " + a);
}
}
Inside function: x = 20
After function call: a = 10
Call by Reference (참조에 의한 호출)
Call by Reference는 함수가 호출될 때 인자의 참조가 전달되는 방식이다
즉, 함수는 인자의 주소를 전달받아 그 주소를 통해 원래 데이터에 접근하고 변경할 수 있다.
따라서 함수 내에서 매개변수의 값을 변경하면 원래의 인자도 영향을 받게 된다.
C언어 (CbR)
#include <stdio.h>
void modifyValue(int *x) {
*x = 20;
printf("Inside function: x = %d\n", *x);
}
int main() {
int a = 10;
modifyValue(&a);
printf("After function call: a = %d\n", a);
return 0;
}
//출력 결과
Inside function: x = 20
After function call: a = 20
C++ (CbR)
#include <iostream>
using namespace std;
void modifyValue(int &x) {
x = 20;
cout << "Inside function: x = " << x << endl;
}
int main() {
int a = 10;
modifyValue(a);
cout << "After function call: a = " << a << endl;
return 0;
}
//출력 결과
Inside function: x = 20
After function call: a = 20
Java (CbR)
class Number {
int value;
}
public class Main {
public static void modifyValue(Number num) {
num.value = 20;
System.out.println("Inside function: num.value = " + num.value);
}
public static void main(String[] args) {
Number a = new Number();
a.value = 10;
modifyValue(a);
System.out.println("After function call: a.value = " + a.value);
}
}
Inside function: num.value = 20
After function call: a.value = 20
CbV vs CbR 비교
- 복사 vs 참조: Call by Value는 인자의 값을 복사하여 전달하고, Call by Reference는 인자의 주소를 전달
- 원본 데이터 변경: Call by Value에서는 함수 내에서 인자의 복사본을 변경하므로 원본 데이터는 변경되지 않지만, Call by Reference에서는 원본 데이터를 직접 변경 가능
- 안정성: Call by Value는 원본 데이터가 보호되므로 안전합니다. Call by Reference는 직접 데이터에 접근하므로 주의가 필요
언어별 요약
- C/C++: 기본적으로 Call by Value를 사용하지만, 포인터를 이용하여 Call by Reference를 구현할 수 있다.
- Java: 모든 원시 타입(primitive type)은 Call by Value로 전달되고, 객체 참조 타입(object reference type)은 Call by Reference처럼 동작하지만 실제로는 참조 값이 Call by Value로 전달된다.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/042.gif)
반응형
'Dev > CS' 카테고리의 다른 글
[CS] 프록시(Proxy)란? (2) | 2024.11.08 |
---|---|
[서버] 스토리지 마운트 관련 부팅 순서의 중요성 (0) | 2024.08.20 |
SMTP 발송 vs SMTP 릴레이(Relay) 발송: 차이점과 장점 (0) | 2024.06.24 |
Apache-Tomcat server.xml 파일이란? (0) | 2024.05.16 |
[Library] 라이브러리 버전 업데이트 (0) | 2024.04.25 |