개발일지
article thumbnail

함수 인수 전달 방식

C++에서 함수 인수 전달 방식은 크게 값에 의한 전달, 참조에 의한 전달, 포인터에 의한 전달의 세 가지 방법이 있습니다. 이 세 가지 방법은 각각의 장단점이 있으므로, 어떤 방식을 선택할지는 상황에 따라 다릅니다. 이번 글에서는 이 세 가지 방식에 대해 자세히 알아보도록 하겠습니다.


#값에 의한 전달(call by value)

값에 의한 전달은 함수 인수로 값 자체를 전달하는 방식입니다. 이 방식은 함수 내부에서 인수 값을 변경하더라도 함수 외부에서는 변경되지 않습니다. 따라서 함수 인수가 참조할 수 있는 값의 범위가 함수 내부로 제한되기 때문에, 함수 외부에서는 함수 인수를 변경할 수 없게 됩니다.

void increment(int x) {
    x++;
}

int main() {
    int a = 1;
    increment(a);
    cout << a << endl; // 1
    return 0;
}

위 코드에서 increment 함수는 인수로 받은 x를 1 증가시키고 있습니다. 그러나 main 함수에서 increment 함수를 호출하고 나서 a의 값은 변경되지 않습니다. 이는 increment 함수에서는 x의 값이 1 증가되어 있지만, main 함수에서는 여전히 a의 값이 1인 채로 남아있기 때문입니다.

 


#참조에 의한 전달 (call by reference)

참조에 의한 전달은 함수 인수로 값이 아니라 값이 저장된 메모리 공간의 주소를 전달하는 방식입니다. 이 방식은 함수 내부에서 인수 값을 변경하면 함수 외부에서도 변경된 값을 참조할 수 있습니다.

void increment(int& x) {
    x++;
}

int main() {
    int a = 1;
    increment(a);
    cout << a << endl; // 2
    return 0;
}

위 코드에서 increment 함수의 인수로 int& x를 사용하고 있습니다. 이는 int형 변수의 참조를 나타내는 것으로, 이를 통해 increment 함수 내부에서 x의 값을 변경하면 main 함수에서 사용하는 a의 값도 함께 변경됩니다. 따라서 위 코드에서 a의 값이 1 증가된 2가 출력되는 것입니다.


#포인터에 의한 전달 (call by pointer)

포인터에 의한 전달은 함수 인수로 값이 저장된 메모리 공간의 주소를 가리키는 포인터를 전달하는 방식입니다. 이 방식은 참조에 의한 전달과 매우 유사하지만, 포인터를 사용하므로 함수 내부에서 인수 값을 변경할 때도 함수 외부에서도 변경된 값을 참조하기 위해서는 포인터 연산자를 사용해야 합니다.

void increment(int* x) {
    (*x)++;
}

int main() {
    int a = 1;
    increment(&a);
    cout << a << endl; // 2
    return 0;
}

위 코드에서 increment 함수의 인수로 int* x를 사용하고 있습니다. 이는 int형 변수의 주소를 나타내는 것으로, 이를 통해 increment 함수 내부에서 x가 가리키는 메모리 공간의 값을 변경하면 main 함수에서 사용하는 a의 값도 함께 변경됩니다. 따라서 위 코드에서 a의 값이 1 증가된 2가 출력되는 것입니다.


#결론

함수 인수 전달 방식의 선택은 상황에 따라 다르지만, 보통은 값에 의한 전달보다는 참조에 의한 전달이나 포인터에 의한 전달을 선호합니다. 이는 함수 내부에서 인수 값을 변경하더라도 함수 외부에서도 변경된 값을 참조할 수 있기 때문입니다. 따라서 C++에서는 참조에 의한 전달과 포인터에 의한 전달을 많이 사용합니다. 그러나 값에 의한 전달도 상황에 따라 유용하게 사용될 수 있습니다.

profile

개발일지

@damin06

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!