지난 주, 말하는 감자님과 스터디를 하다가 함수 호출 방식에 대한 궁금증이 생겨서 call by value / call by reference를 찾아보고 정리하는 글.
프로그래밍 언어에서 함수 호출 시 인자를 어떻게 전달하느냐에 따라 세가지 개념으로 나뉘어진다.
Python, JavaScript, Java 객체 타입 등에서 사용
def change_list(lst):
lst.append(4) # 내부 수정 (원본 영향 O)
lst = [10, 20] # 새로운 리스트 할당 (원본 영향 X)
a = [1, 2, 3]
change_list(a)
print(a) # [1, 2, 3, 4]
✅ 특징: 참조를 전달하지만, 재할당과 내부 수정의 결과가 다르게 나타남
값에 의한 호출로 C, Java의 primitive type, Go 등에서 사용
#include <stdio.h>
void change(int x) {
x = 20; // 함수 안에서만 변경됨
}
int main() {
int a = 10;
change(a);
printf("%d\n", a); // 여전히 10
}
✅ 특징: 원본은 절대 안 바뀜
참조에 의한 호출로 C++, Pascal 등에서 사용
#include <iostream>
using namespace std;
void change(int &x) { // 참조 전달
x = 20;
}
int main() {
int a = 10;
change(a);
cout << a << endl; // 20으로 바뀜
}
✅ 특징: 원본이 직접 수정됨
| 호출 방식 | 전달되는 것 | 원본 영향 여부 | 해당 언어 예시 |
|---|---|---|---|
| Call by Assignment | 참조값을 복사 | 내부 수정 O, 재할당 X | Python, JavaScript, Java (객체 타입) |
| Call by Value | 값 복사 | X | C, Java (primitive), Go |
| Call by Reference | 주소(참조) 전달 | O | C++ (참조/포인터), Pascal |