이 포스트에서는 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
은 수정된 값을 반영합니다.이 예제는 반환 값을 사용하여 원래 변수를 수정하는 방법을 보여줍니다.