지난 주, 말하는 감자님과 스터디를 하다가 함수 호출 방식에 대한 궁금증이 생겨서 call by value / call by reference를 찾아보고 정리하는 글.

1. 프로그래밍 언어별 함수 호출 방식

프로그래밍 언어에서 함수 호출 시 인자를 어떻게 전달하느냐에 따라 세가지 개념으로 나뉘어진다.

1-1. Call by Assignment

Python, JavaScript, Java 객체 타입 등에서 사용

  • 일명 Call by Object Reference / Call by Sharing 이라고도 불림
  • “참조값을 복사”해서 함수에 전달하는 방식
  • 함수 안에서 매개변수가 새로운 객체를 가리키도록 바꾸면 원본은 안 바뀜
  • 하지만 함수 안에서 객체 내부를 수정하면 원본도 바뀜
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]

✅ 특징: 참조를 전달하지만, 재할당과 내부 수정의 결과가 다르게 나타남

1-2. Call by Value

값에 의한 호출로 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
}

✅ 특징: 원본은 절대 안 바뀜

1-3. Call by Reference

참조에 의한 호출로 C++, Pascal 등에서 사용

  • 변수의 주소(참조)를 전달
  • 함수 안에서 매개변수를 바꾸면 원본 변수도 같이 바뀜
  • 메모리 효율적이고 빠르지만, 부작용(side effect) 가능성이 있음
#include <iostream>
using namespace std;

void change(int &x) { // 참조 전달
    x = 20;
}

int main() {
    int a = 10;
    change(a);
    cout << a << endl; // 20으로 바뀜
}

✅ 특징: 원본이 직접 수정됨

1-4. 정리 표

호출 방식전달되는 것원본 영향 여부해당 언어 예시
Call by Assignment참조값을 복사내부 수정 O, 재할당 XPython, JavaScript, Java (객체 타입)
Call by Value값 복사XC, Java (primitive), Go
Call by Reference주소(참조) 전달OC++ (참조/포인터), Pascal

참고자료1 https://jins-dev.tistory.com/entry/Python

profile
기록은 기억을 지배한다.

0개의 댓글