C#

[C#]Call By Value, Call By Reference

DevStory 2021. 5. 16.

Call By Value, Call By Reference

C#에서는 함수 또는 메서드를 호출하는 두 가지 방법이 있습니다. 

 

첫 번째는 "Call By Value(값으로 호출)"이고 두 번째는 "Call By Reference(참조로 호출)"입니다.

 

두 방법의 주요 차이점은 Call By Value는 변수의 값을 전달하고 Call By Reference는 해당 변수의 주소를 전달한다는 것입니다.

 

Call By Value에 의한 호출은 변수의 값을 함수에 전달합니다. 함수 내부에서 전달 받은 값을 변경해도 원래 변수의 값은 변경되지 않습니다.

 

Call By Reference에 의한 호출은 변수 자체를 함수에 전달합니다. 함수 내부에서 전달 받은 값의 변경 사항이 있을 경우 원래 변수에도 영향을 줍니다.


Call By Value

Call By Value에 의한 호출은 인수 값을 해당 함수의 형식 매개 변수로 복사합니다.

 

매개 변수는 다른 메모리 위치에 저장됩니다. 

 

따라서 함수 내에서 변경된 사항은 호출자의 실제 매개 변수에 반영되지 않습니다.

class Program
{
  static void SwapStrings(string s1, string s2)
  {
    string temp = s1;
    s1 = s2;
    s2 = temp;
    Console.WriteLine("메소드에서 값 변경: {0} {1}", s1, s2);
  }
     
  static void Main(string[] args)
  {
    string str1 = "Kang";
    string str2 = "JaeSeong";
    Console.WriteLine("SwapStrings 메소드 호출 전: {0} {1}", str1, str2);

    SwapStrings(str1, str2);
    Console.WriteLine("SwapStrings 메소드 호출 후: {0} {1}", str1, str2);
  }
}

실행 결과


Call By Reference

Call By Reference에 의한 호출은 인수의 주소를 형식 매개 변수에 복사합니다. 

 

이 메서드에서 주소는 함수 호출에 사용되는 실제 인수에 접근하는 데 사용됩니다. 

 

함수의 모든 연산은 실제 파라미터의 주소에 저장된 값에 대해 수행되며 수정된 값은 동일한 주소에 저장됩니다.

 

ref 키워드를 사용해서 메서드 호출에서 인수를 참조로 전달합니다.

class Program
{
  static void SwapStrings(ref string s1, ref string s2)
  {
    string temp = s1;
    s1 = s2;
    s2 = temp;
    Console.WriteLine("메소드에서 값 변경: {0} {1}", s1, s2);
  }
     
  static void Main(string[] args)
  {
    string str1 = "Kang";
    string str2 = "JaeSeong";
    Console.WriteLine("SwapStrings 메소드 호출 전: {0} {1}", str1, str2);

    SwapStrings(ref str1, ref str2);
    Console.WriteLine("SwapStrings 메소드 호출 후: {0} {1}", str1, str2);
  }
}

실행 결과


Call By Value와 Call By Reference의 주요 차이점

  1. Call By Value 방식은 원래 값이 변경되지 않지만 Call By Reference 방식은 원래 값이 변경됩니다.
  2. Call By Value 방식에서는 변수의 복사본이 전달되는 반면 Call By Reference 방식에서는 변수 자체가 전달됩니다.
  3. Call By Value 방식에서는 인수는 다른 메모리 위치에서 생성되는 반면 Call By Reference 방식에서는 인수가 동일한 메모리 위치에 생성됩니다.
  4. Call By Value 방식에서 인수의 수신 매개 변수는 데이터 유형과 함께 변수 이름입니다. 반면 Call By Reference방식에서는 수신 매개 변수가 항상 데이터 유형과 함께 포인터 변수이고, 객체의 경우 클래스 유형과 함께 객체 이름입니다.

비교

Parameters  Call By Value Call By Reference
정의 함수를 호출할 때 변수를 복사하여 값을 전달할 때 이를 "Call By Value"라고 합니다. 함수를 호출할 때 변수를 복사하여 값을 전달하지 않고 변수의 주소를 사용할 때 "Call By Reference"라고 합니다.
인수 변수의 복사본이 전달됩니다. 변수 자체가 전달됩니다.
효과 함수 외부의 값을 수정하지 않습니다. 함수 외부의 변수 값에도 영향을 줍니다.
값의 변경 실제 변수의 값을 수정할 수 없습니다. 실제 변수의 값을 수정할 수 있습니다.
값의 수정 원래 값이 수정되지 않습니다. 원래 값이 수정 될 수 있습니다.
메모리 위치 다른 위치에 생성됩니다. 동일한 위치에 생성됩니다.
안정성 기존의 값이 변경되지 않으므로 안전하다고 할 수 있습니다. 기존의 값이 변경될 수 있으므로 유의해야 합니다.
디폴트 Visual Basic NET 및 C #, C++. PHP와 같은 많은 프로그래밍 언어에서 디폴트입니다.  JAVA와 같은 대부분의 프로그래밍 언어에서 지원되지만 디폴트는 아닙니다.
반응형

'C#' 카테고리의 다른 글

[C#]DataTable에 행(Row) 추가하는 방법  (1) 2021.07.26
[C#]ref와 out  키워드  (0) 2021.05.16
[C#]값 형식(Value Types)과 참조 형식(Reference Types)  (3) 2021.05.15
[C#]물음표(?) 사용  (2) 2021.05.13
[C#]Nullable 타입  (3) 2021.05.13

댓글