[개념] Call by value, Call by reference

Wonhyun Kwon·2023년 5월 26일
0

개념

목록 보기
2/2

1. 이게 뭔가요?

프로그래밍 언어에서 함수 호출 시 인자 를 전달하는 방식을 설명하는 개념 중 하나이다.
즉, '호출 방식' 의 종류이다.




2. 원시 ? 참조 ?

학습 전에 알아야 할 개념이 있다.
프로그래밍 언어에서 변수에 저장되는 값의 종류도 두 가지가 있다.

  1. 원시 값 (Primitive Value)
    • 변수에 '직접적' 으로 값을 저장한다.
    • 원시 값은 불변(immutable) 하며, 변수에 새로운 값을 할당하면 기존의 값은 변경되지 않고 새로운 값이 할당된다.
    • 즉, 값을 직접 가지고 있어 직접적으로 '값의 복사' 가 이루어진다.
    • 종류
      • number
      • string
      • boolean
      • null
      • undefined

  1. 참조 값 (Reference Value)
    • 변수에 실제 값이 아닌, 값이 저장된 '메모리 주소(참조)'를 가리킨다.
    • 참조 값은 가변(mutable) 하며, 변수에 할당된 objectarray 을 수정하면 해당 객체나 배열이 변경된다.
    • 즉, 동일한 메모리 주소를 공유하는 값의 집합이기 때문에 '메모리 주소의 복사' 가 이루어진다.
    • 종류
      • object
      • array
    • 일부 언어에서는 이를 포인터(Pointer) 라고 부른다.



3. Call by value ?

단어 그대로 '값' 에 의한 호출이다.

특징

  • 함수 호출 시 인자의 값이 복사되어 함수 내부로 전달된다.
  • 함수 내부에서 인자의 값을 변경하더라도 원본 변수의 값은 변하지 않는다.
  • 원본 변수와 함수 내부의 매개변수는 독립적인 메모리 공간에 저장된다.
  • 대부분의 원시 데이터 타입( number , string , boolean )은 Call by value 에 의한 호출로 전달된다.

예시

const changeValue = (x: number) => {
  x = 10;
}

let a  = 5;
changeValue(a);

console.log(a); // 5 (원본 변수 a는 변경되지 않는다)



4. Call by reference ?

단어 그대로 '참조' 에 의한 호출이다.
정확히 말하자면, '메모리' 를 공유하여 그 메모리 속에 저장된 변수를 참조한다는 뜻이다.

특징

  • 함수 호출 시 인자의 메모리 주소 (참조, reference) 가 전달되어 함수 내부에서 해당 주소를 통해 원본 변수에 접근한다.
  • 함수 내부에서 인자의 값을 변경하면 원본 변수의 값도 함께 변경된다.
  • 원본 변수와 함수 내부의 매개변수는 같은 메모리 공간을 공유한다.
  • 대부분의 객체, 배열 (object , array ) 등의 복합 데이터 타입은 Call by reference 에 의한 호출로 전달된다.

예시

const changeValue = (obj: object) => {
  obj.value = 10;
};

let myObj = {
  value: 5 
};
changeValue(myObj);

console.log(myObj.value); // 10 (원본 변수 myObj의 값이 변경된다)

만약에 원본 object 가 있고, 이를 copy 한 object 가 있을 때, copy 한 object 의 value를 바꾸면 원본 역시 바뀐다.
예시는 다음과 같다.

const changeValue = (obj: object) => {
  obj.value = 10;
};

let myObj = {
  value: 5
};

let copyObj = myObj;

changeValue(copyObj);

console.log(myObj.value); // 5

즉, myObjcopyObj메모리를 공유했기 때문에 어느 하나의 값이 변하면 공유하고 있는 변수는 모두 동일하게 변한다.




5. ❗️ 차이점

  • Call by value인자의 값을 복사하여 전달하기 때문에 함수 내부에서의 변경이 원본에 영향을 주지 않는다.
  • Call by reference인자의 메모리 주소를 전달하여 원본 변수에 직접 접근하므로 함수 내부에서의 변경이 원본에 영향을 준다.



6. 결론

언어마다 호출방식이 상이할 수 있으며, 일부 언어에서는 명시적으로 호출방식을 지정하는 방법이 제공될 수도 있다.
이러한 호출 방식의 이해는 호출 시 인자의 동작을 이해하고 예상할 수 있도록 도와준다.

profile
모든 사용자가 만족하는 UI를 만드는 FE 개발자 권원현입니다.

0개의 댓글