공부/C#

콜 바이 벨류(Call by Value)와 콜 바이 레퍼런스(Call by Reference)의 차이점

셩잇님 2022. 12. 16. 15:45
반응형

 

 

C#에서 함수에 인수를 전달하는 기본 방법은 "콜 바이 벨류(Call by Value)", 즉 값에 의한 호출입니다. 즉, 인자 값이 함수에 전달되고 함수 내에서 인자 값을 변경해도 함수 외부의 인자 값에는 영향을 미치지 않는다는 것입니다. 말로 설명하면 어려우니 간단한 예제를 보겠습니다. 다음 예제는 콜 바이 벨류(Call by Value), 값에 의한 호출에 대한 예제입니다.

void Increment(int x)
{
  x += 1;
}

int main()
{
  int a = 1;
  Increment(a);
  Console.WriteLine(a);  // Output의 값은 1이다.
}

위 예시에서 a의 값은 a의 값 만큼 증가되는 함수에 전달됩니다. 이 때 함수 내에서는 x의 값이 증가하지만, 이 변경된 값은 함수 외부의 값(main 함수의 a)에게 영향을 미치지 않습니다. 그렇다면 이 때 어떻게 하면 외부의 값(main 함수의 a)에게 영향을 줄 수 있을까요?

 

이럴 때에는 참조(Reference)를 나타내는 키워드인 ref 키워드를 이용하여 인자 값을 전달하여 사용할 수 있습니다. 인자 값이 참조로 전달되면 함수 내(Increcment)에서 인자값에 대한 모든 변경사항이 함수 외부(main)에 반영됩니다. 글로만 설명하기 어려우니 아래 예제를 확인하세요. 다음 예제는 콜 바이 레퍼런스(Call by Reference), 참조에 의한 호출에 대한 예제입니다.

void Increment(ref int x)
{
  x += 1;
}

int main()
{
  int a = 1;
  Increment(ref a);
  Console.WriteLine(a);  // Output의 값은 2이다.
}

위 예제에서 a의 값은 참조 키워드(ref)를 이용하여 Increment 함수로 전달됩니다. 해당 함수(Increment) 내부에서 x의 값은 1 증가하여, 이 함수는 외부의 값(main)에도 반영됩니다. 이것이 C#에서 콜 바이 벨류(Call by Value)와 콜 바이 레퍼런스(Call by Reference)의 차이점입니다.

 


 

콜 바이 벨류(Call by Value)의 장점

1. 보다 쉽고, 간단하게 이해하고 구현할 수 있습니다.

2. 함수 내 인자 값의 변경으로 의도하지 않은 부작용을 방지할 수 있습니다.

3. 함수가 원본이 아닌 인자 값의 복사본으로 작업하기 때문에 필요에 따라 성능을 향상 시킬 수 있습니다.

 

그렇다면 단점은 무엇일까요?

1. 인자 값을 복사본으로 이용하기 때문에 메모리 사용 측면에서는 효울성이 떨어질 수 있습니다.

2. 이로인해 복사본을 만드는 데 많은 비용적인 측면이 발생하므로, 이것 저것을 포함하고 있는 큰 개체를 복사할 때에는 적합하지 않을 수 있습니다.

3. 변경 사항이 함수 외부에 반영되지 않으므로 함수에 의해 수정되도록 작성한 코드에는 적합하지 않을 수 있습니다.

 


 

콜 바이 레퍼런스(Call by Reference)의 장점

1. 인자 값이 복사본으로 만들어지지 않기 때문에 메모리 사용 측면에서 더 효율적일 수 있습니다.

2. 함수가 인자값을 수정하고, 변경사항이 외부에 적용되도록 반영할 때 좋습니다.

3. 복사본을 만들 필요가 없으므로, 큰 객체에 더 적합합니다

 

그렇다면 단점은 무엇일까요?

1. 이해하고 구현하기가 보다 더 어려울 수 있습니다

2. 함수 내 값의 변경으로 인해 의도하지 않은 부작용이 있을 수 있습니다

3. 작은 객체에는 적합하지 않습니다. 참조를 전달하는 오버헤드가 복사본을 만드는 비용보다 클 수 있기 때문입니다.

 


 

그렇다면 어떠할 때 콜 바이 벨류와, 콜 바이 레퍼런스를 구분해서 사용해야 할까요? 이들을 선택하는 기준은 코드 작성시 프로그래머의 요구 사항에 따라 달라집니다.

 

일반적으로 콜 바이 벨류(Call by Value), 값에 의한 호출은 의도하지 않은 부작용을 피하고 싶을 때와, 간단한 데이터 유형 또는 작은 객체로 작업할 때 좋은 선택입니다. 콜 바이 레퍼런스(Call by Reference), 참조에 의한 호출은 함수가 인수를 수정하고 변경사항이 함수 외부에도 반영되도록 하려고 할 때, 또는 복사하기에는 비효율적인 큰 객체로 작업할 때 좋은 선택입니다.

 

 

반응형