프로그래밍에서 'pass by'는 함수 호출 시 인자가 함수 내부로 전달되는 방식을 의미합니다. 크게 'pass by value'(값에 의한 전달)와 'pass by reference'(참조에 의한 전달) 두 가지로 나눌 수 있습니다. 이 두 방식은 데이터의 복사 여부와 원본 데이터의 변경 가능성에 따라 큰 차이를 보입니다.
값에 의한 전달 (Pass by Value)
'Pass by value'는 함수에 인자를 전달할 때, 해당 인자의 '값' 자체가 복사되어 전달되는 방식입니다. 즉, 함수 내부에서 인자의 값을 변경하더라도 원본 변수의 값에는 아무런 영향을 미치지 않습니다. 마치 원본 문서를 복사해서 사본으로 작업하는 것과 같습니다. 대부분의 프로그래밍 언어에서 기본적으로 이 방식을 사용합니다. 예를 들어, C, Java, Python (기본적으로) 등이 이에 해당합니다.
예시:
def modify_value(x):
x = x + 10
print(f"함수 내부: {x}")
original_value = 5
print(f"함수 호출 전: {original_value}")
modify_value(original_value)
print(f"함수 호출 후: {original_value}")
위 코드의 출력 결과는 다음과 같습니다:
함수 호출 전: 5
함수 내부: 15
함수 호출 후: 5
보시다시피 함수 내부에서 x의 값이 15로 변경되었지만, original_value는 여전히 5로 유지됩니다.
참조에 의한 전달 (Pass by Reference)
'Pass by reference'는 함수에 인자를 전달할 때, 해당 인자의 '값'이 아닌 '메모리 주소'(참조)가 전달되는 방식입니다. 따라서 함수 내부에서 인자의 값을 변경하면, 원본 변수의 값도 함께 변경됩니다. 원본 문서를 직접 수정하는 것과 같습니다. C++ (포인터, 참조자), C# (ref, out 키워드), JavaScript (객체 전달 시) 등에서 이 방식을 지원하거나 유사한 동작을 보입니다.
예시:
#include <iostream>
void modify_reference(int &x) { // 참조자(&)를 사용하여 참조에 의한 전달
x = x + 10;
std::cout << "함수 내부: " << x << std::endl;
}
int main() {
int original_value = 5;
std::cout << "함수 호출 전: " << original_value << std::endl;
modify_reference(original_value);
std::cout << "함수 호출 후: " << original_value << std::endl;
return 0;
}
위 코드의 출력 결과는 다음과 같습니다:
함수 호출 전: 5
함수 내부: 15
함수 호출 후: 15
이 경우, 함수 내부에서 x의 값이 변경되자 original_value의 값도 15로 함께 변경되었습니다.
혼동하기 쉬운 개념: Python의 객체 전달
Python은 'pass by object reference'라는 독특한 방식을 사용합니다. 이는 'pass by value'와 'pass by reference'의 중간적인 성격을 띱니다. Python에서 모든 것은 객체이며, 변수는 객체를 참조하는 이름표와 같습니다. 함수에 인자를 전달할 때는 객체의 참조가 전달됩니다.
-
불변 객체 (Immutable Objects): 문자열, 숫자, 튜플 등은 변경이 불가능합니다. 함수 내부에서 이 객체의 값을 변경하려고 하면, 새로운 객체가 생성되고 해당 객체에 대한 새로운 참조가 만들어집니다. 따라서 원본 변수는 영향을 받지 않습니다. 이는 'pass by value'와 유사하게 동작합니다.
-
가변 객체 (Mutable Objects): 리스트, 딕셔너리 등은 변경이 가능합니다. 함수 내부에서 이 객체의 내용을 변경하면, 원본 객체도 함께 변경됩니다. 이는 'pass by reference'와 유사하게 동작합니다.
Python 예시 (가변 객체):
def modify_list(my_list):
my_list.append(100)
print(f"함수 내부: {my_list}")
original_list = [1, 2, 3]
print(f"함수 호출 전: {original_list}")
modify_list(original_list)
print(f"함수 호출 후: {original_list}")
출력 결과:
함수 호출 전: [1, 2, 3]
함수 내부: [1, 2, 3, 100]
함수 호출 후: [1, 2, 3, 100]
요약
'Pass by'는 함수 호출 시 인자가 전달되는 방식을 이해하는 데 중요한 개념입니다. 'Pass by value'는 값 복사를 통해 원본을 보호하고, 'pass by reference'는 참조 전달을 통해 원본을 직접 수정할 수 있게 합니다. 사용하는 언어의 'pass by' 방식을 정확히 이해하면 예상치 못한 부작용을 방지하고 효율적인 코드를 작성하는 데 큰 도움이 됩니다.