함수 인수 전달 방식
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++에서는 참조에 의한 전달과 포인터에 의한 전달을 많이 사용합니다. 그러나 값에 의한 전달도 상황에 따라 유용하게 사용될 수 있습니다.
'프로그래밍 > C++' 카테고리의 다른 글
[백준/C++] 10828번 큐 (0) | 2023.05.31 |
---|---|
[백준/C++] 10828번 스택 (0) | 2023.05.11 |
[C++]윈도우 API를 활용한 절대 음감 게임 (0) | 2023.04.06 |
[백준/C++] 16076번 휴식이 필요해 문제풀이 (0) | 2023.04.01 |
[백준/C++] 2563번 색종이 문제풀이 (0) | 2023.03.20 |