값으로 전달

Jaemyeong Lee·2024년 8월 8일
0

FastCampusC++

목록 보기
40/78

C++ 값 전달 예제: 자세한 설명

이 포스트에서는 C++에서 값 전달이 어떻게 작동하는지 다양한 예제를 통해 알아보겠습니다. 예제를 통해 값이 복사되는 방식과 이것이 함수의 동작에 어떻게 영향을 미치는지 이해할 수 있을 것입니다.

예제 1: 인라인 스왑

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;
    }
}

설명:

  • 두 개의 정수 xy를 각각 10과 20으로 선언합니다.
  • xy의 값을 출력합니다.
  • temp라는 임시 변수를 사용하여 xy의 값을 서로 교환합니다.
  • 교환 후 xy의 변경된 값을 출력합니다.

이 예제는 함수 없이 직접 값 교환을 수행하는 간단한 인라인 스왑을 보여줍니다.

예제 2: 값 전달을 사용하는 스왑 함수

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 함수는 pxpy의 값을 교환하려고 시도합니다.
  • 그러나 pxpy는 값으로 전달되므로 xy의 복사본을 다룹니다.
  • xy의 주소는 pxpy의 주소와 다르기 때문에 swap0 내에서의 변경 사항은 xy에 영향을 미치지 않습니다.

swap0 호출 후 xy의 값을 출력하면 값이 변경되지 않음을 알 수 있습니다. 이는 값 전달이 복사본으로 작업함을 보여줍니다.

예제 3: 수동 인라인 스왑

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 함수 내에서 수동으로 수행합니다.
  • pxpyxy의 지역 복사본입니다.
  • pxpy를 교환한 후에도 xy는 변경되지 않습니다.

이 예제는 값 전달의 개념을 강화하여 복사본의 변경 사항이 원래 변수에 영향을 미치지 않음을 보여줍니다.

예제 4: 값 전달을 사용하는 구조체 수정

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 구조체를 정의하고 pricepower 필드를 포함합니다.
  • upgrade0 함수는 Weapon 인스턴스를 값으로 전달받아 수정하려고 합니다.
  • upgrade0 함수 내에서 로컬 복사본인 weapon을 수정합니다.
  • upgrade0 호출 후 원래 weapon의 값을 출력하면 값이 변경되지 않음을 알 수 있습니다.

이 예제는 구조체와 같은 복잡한 타입에서도 값 전달이 로컬 복사본을 수정함을 보여줍니다.

예제 5: 수동 인라인 코드로 구조체 수정

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 함수 내에서 수동으로 수행합니다.
  • pWeaponweapon의 지역 복사본입니다.
  • pWeapon을 수정한 후에도 원래 weapon은 변경되지 않습니다.

이 예제는 값 전달이 원래 변수를 변경하지 않음을 더욱 잘 보여줍니다.

예제 6: 반환 값을 사용하는 구조체 수정

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의 로컬 복사본을 수정한 후 수정된 복사본을 반환합니다.
  • main 함수에서 반환된 Weapon 인스턴스를 다시 weapon에 할당합니다.
  • 이 할당 후 weapon은 수정된 값을 반영합니다.

이 예제는 반환 값을 사용하여 원래 변수를 수정하는 방법을 보여줍니다.

profile
李家네_공부방

0개의 댓글