C/C++에서 값으로 전달(Pass by Value)에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 제공하겠습니다.
값으로 전달은 함수에 인수를 전달할 때, 인수의 값을 복사하여 함수에 전달하는 방법입니다. 즉, 함수 내부에서 매개변수는 실제 인수의 복사본을 받게 되므로, 함수 내부에서 매개변수의 값을 변경해도 실제 인수에는 영향을 미치지 않습니다.
#include <iostream>
void modifyValue(int x) {
x = 10; // 매개변수 x의 값 변경
}
int main() {
int a = 5;
std::cout << "Before modifyValue: " << a << std::endl;
modifyValue(a); // 값으로 전달
std::cout << "After modifyValue: " << a << std::endl; // a의 값은 변하지 않음
return 0;
}
값으로 전달할 때, 함수가 호출될 때마다 새로운 스택 프레임이 생성됩니다. 이 스택 프레임에는 매개변수의 복사본, 지역 변수, 반환 주소 등이 저장됩니다. 함수가 종료되면 해당 스택 프레임은 제거됩니다.
스택 메모리 구조:
+------------------+
| ... |
+------------------+
| modifyValue 함수 |
| 매개변수 x (복사본)|
+------------------+
| main 함수 |
| 변수 a |
+------------------+
| ... |
+------------------+
값으로 전달할 때, 매개변수는 실제 인수의 복사본을 받습니다. 함수가 호출될 때마다 새로운 메모리 공간이 할당되며, 함수 내부에서 매개변수의 값을 변경해도 실제 인수에는 영향을 미치지 않습니다.
값으로 전달의 개념과 메모리 구조를 이해하기 쉽게 그림과 표로 표현하였습니다.
값으로 전달 예시:
int a = 5;
modifyValue(a);
메모리 배치:
+------------------+
| main 함수 |
| 변수 a: 5 |
+------------------+
|
v
+------------------+
| modifyValue 함수 |
| 매개변수 x: 5 | <-- a의 복사본
+------------------+
값으로 전달 과정:
1. a의 값이 5로 설정됨
2. modifyValue(a) 호출 시 a의 값이 x로 복사됨
3. modifyValue 함수 내부에서 x의 값을 10으로 변경
4. modifyValue 함수 종료 후 x의 메모리 해제, a의 값은 여전히 5
다양한 상황에서 값으로 전달을 사용하는 예제를 추가로 제공합니다.
#include <iostream>
void display(int x) {
std::cout << "Integer: " << x << std::endl;
}
void display(double x) {
std::cout << "Double: " << x << std::endl;
}
int main() {
int a = 10;
double b = 5.5;
display(a); // int형 값을 전달
display(b); // double형 값을 전달
return 0;
}
#include <iostream>
struct Point {
int x, y;
};
void modifyPoint(Point p) {
p.x = 10;
p.y = 20;
}
int main() {
Point pt = {5, 5};
std::cout << "Before modifyPoint: (" << pt.x << ", " << pt.y << ")" << std::endl;
modifyPoint(pt); // 구조체를 값으로 전달
std::cout << "After modifyPoint: (" << pt.x << ", " << pt.y << ")" << std::endl; // pt의 값은 변하지 않음
return 0;
}
값으로 전달은 함수에 인수를 전달할 때 인수의 값을 복사하여 전달하는 방법입니다. 이는 함수 내부에서 매개변수의 값을 변경해도 실제 인수에는 영향을 미치지 않음을 보장합니다. 값으로 전달은 함수 호출 시 새로운 스택 프레임을 생성하여 매개변수의 복사본을 저장하며, 함수 종료 시 해당 스택 프레임이 제거됩니다. 이를 통해 함수 간의 데이터 독립성을 유지하고, 메모리 관리를 단순화할 수 있습니다. 운영체제는 함수 호출과 관련된 스택 메모리를 관리하여 프로그램이 효율적으로 실행될 수 있도록 돕습니다.
이와 같은 내용을 통해 C/C++의 값으로 전달에 대해 더 깊이 이해할 수 있을 것입니다. 추가로 궁금한 사항이 있으면 알려주세요!