이 포스트에서는 C++에서 값 전달이 어떻게 작동하는지 다양한 예제를 통해 알아보겠습니다. 예제를 통해 값이 복사되는 방식과 이것이 함수의 동작에 어떻게 영향을 미치는지 이해할 수 있을 것입니다.
int main() {
{
int x = 10, y = 20;
cout << "x : " << x << endl;
cout << "y : " << y << endl;
int temp = x;
x = y;
y = temp;
cout << "x : " << x << endl;
cout << "y : " << y << endl;
}
}
설명:
x와 y를 각각 10과 20으로 선언합니다.x와 y의 값을 출력합니다.temp라는 임시 변수를 사용하여 x와 y의 값을 서로 교환합니다.x와 y의 변경된 값을 출력합니다.이 예제는 함수 없이 직접 값 교환을 수행하는 간단한 인라인 스왑을 보여줍니다.
void swap0(int px, int py) {
int temp = px;
px = py;
py = temp;
}
int main() {
{
int x = 10, y = 20;
cout << "x : " << x << endl;
cout << "y : " << y << endl;
swap0(x, y);
cout << "x : " << x << endl;
cout << "y : " << y << endl;
}
}
설명:
swap0 함수는 px와 py의 값을 교환하려고 시도합니다.px와 py는 값으로 전달되므로 x와 y의 복사본을 다룹니다.x와 y의 주소는 px와 py의 주소와 다르기 때문에 swap0 내에서의 변경 사항은 x와 y에 영향을 미치지 않습니다.swap0 호출 후 x와 y의 값을 출력하면 값이 변경되지 않음을 알 수 있습니다. 이는 값 전달이 복사본으로 작업함을 보여줍니다.
int main() {
{
int x = 10, y = 20;
cout << "x : " << x << endl;
cout << "y : " << y << endl;
int px = x;
int py = y;
int temp = px;
px = py;
py = temp;
cout << "x : " << x << endl;
cout << "y : " << y << endl;
}
}
설명:
swap0의 단계를 main 함수 내에서 수동으로 수행합니다.px와 py는 x와 y의 지역 복사본입니다.px와 py를 교환한 후에도 x와 y는 변경되지 않습니다.이 예제는 값 전달의 개념을 강화하여 복사본의 변경 사항이 원래 변수에 영향을 미치지 않음을 보여줍니다.
struct Weapon {
int price;
int power;
};
void upgrade0(Weapon weapon) {
weapon.power += 10;
weapon.price += 10;
}
int main() {
{
Weapon weapon{10, 20};
cout << "Price : " << weapon.price << endl;
cout << "Power : " << weapon.power << endl;
upgrade0(weapon);
cout << "Price : " << weapon.price << endl;
cout << "Power : " << weapon.power << endl;
}
}
설명:
Weapon 구조체를 정의하고 price와 power 필드를 포함합니다.upgrade0 함수는 Weapon 인스턴스를 값으로 전달받아 수정하려고 합니다.upgrade0 함수 내에서 로컬 복사본인 weapon을 수정합니다.upgrade0 호출 후 원래 weapon의 값을 출력하면 값이 변경되지 않음을 알 수 있습니다.이 예제는 구조체와 같은 복잡한 타입에서도 값 전달이 로컬 복사본을 수정함을 보여줍니다.
int main() {
{
Weapon weapon{10, 20};
cout << "Price : " << weapon.price << endl;
cout << "Power : " << weapon.power << endl;
Weapon pWeapon = weapon;
pWeapon.power += 10;
pWeapon.price += 10;
cout << "Price : " << weapon.price << endl;
cout << "Power : " << weapon.power << endl;
}
}
설명:
upgrade0의 단계를 main 함수 내에서 수동으로 수행합니다.pWeapon은 weapon의 지역 복사본입니다.pWeapon을 수정한 후에도 원래 weapon은 변경되지 않습니다.이 예제는 값 전달이 원래 변수를 변경하지 않음을 더욱 잘 보여줍니다.
Weapon upgrade1(Weapon weapon) {
weapon.power += 10;
weapon.price += 10;
return weapon;
}
int main() {
{
Weapon weapon{10, 20};
cout << "Price : " << weapon.price << endl;
cout << "Power : " << weapon.power << endl;
weapon = upgrade1(weapon);
cout << "Price : " << weapon.price << endl;
cout << "Power : " << weapon.power << endl;
}
}
설명:
upgrade1 함수는 weapon의 로컬 복사본을 수정한 후 수정된 복사본을 반환합니다.Weapon 인스턴스를 다시 weapon에 할당합니다.weapon은 수정된 값을 반영합니다.이 예제는 반환 값을 사용하여 원래 변수를 수정하는 방법을 보여줍니다.