Pass by Reference

  • 참조에 의한 전달은 매개변수가 메소드에 넘겨진 원본 변수를 직접 참조
  • 메소드 안에서 매개변수를 수정하면 이 매개벼수가 참조하고 있는 원본 변수에 수정이 이루어짐
private static void Swap(ref int a, ref int b)
{
	int temp = b;
	b = a;
	a = temp;
}
int x = 3;
int y = 4;

Swap(ref x, ref, y);

private static void Swap(ref int a, ref int b)  
{  
	(b, a) = (a, b);  
}  
  
public static void App()  
{  
	int x = 3;  
	int y = 4;  
	WriteLine($"x:{x}, y:{y}");  
	Swap(ref x, ref y);  
	WriteLine($"x:{x}, y:{y}");  
}


Ref Return

  • 메소드의 호출자로 하여금 반환받은 결과를 참조로 다룰 수 있음

  • ref 한정자를 이용해서 메소드를 선언하고, return 문이 반환하는 변수 앞에도 ref 키워드를 명시

  • 호출자가 특별한 키워드를 사용하지 않는 한 값으로 반환하는 평범한 메소드처럼 동작

public class Product  
{  
	private int _price = 100;  
	  
	public ref int GetPrice()  
	{  
		return ref _price;  
	}  
	  
	public void PrintPrice()  
	{  
		WriteLine($"Price : {_price}");  
	}  
}  
	  
public class RefReturn  
{  
	public static void App()  
	{  
		Product carrot = new Product();  
		ref int refLocalPrice = ref carrot.GetPrice();  
		int normalLocalPrice = carrot.GetPrice();  
		  
		carrot.PrintPrice();  
		
		WriteLine($"Ref Local Price : {refLocalPrice}");  
		WriteLine($"Normal Local Price : {normalLocalPrice}");  
		  
		refLocalPrice = 200;  
		carrot.PrintPrice();  
		
		WriteLine($"Ref Local Price : {refLocalPrice}");  
		WriteLine($"Normal Local Price : {normalLocalPrice}");  
	}  
}


출력 전용 매개변수

  • ref 키워드를 이용해서 메소드를 구현하면 몫과 나머지를 한 번에 반환할 수 있음
    public static class LocalRef  
    {  
      private static void Divide(int a, int b, 
                                  ref int quotient, ref int remainder)  
      {  
          quotient = a / b;  
          remainder = a % b;  
      }  
    	  
      public static void App()  
      {  
          int a = 20;  
          int b = 3;  
          int c = 0;  
          int d = 0;  
          WriteLine($"Before Ref - Quotient : {c}, Remainder : {d}");  
          Divide(a,b,ref c, ref d);  
          WriteLine($"After Ref - Quotient : {c}, Remainder : {d}");  
      }  
    }
    

  • out키워드를 이용한 출력 전용 매개변수사용
  • ref의 경우 키워드를 이용해 매개변수를 넘기는 경우
    메소드가 해당 매개변쉐 결과를 저장하지 않아도 컴파일러는 아무런 경고를 하지 않음
  • out키워드를 사용하면 매개변수를 넘길 때 해당 매개변수에 결과를 저장하지 않으면
    컴파일러가 에러 메세지를 출력함
    public static class Out  
    {  
      private static void Divide(int a, int b, 
                                  out int quotient, out int remainder)  
      {  
          quotient = a / b;  
          remainder = a % b;  
      }  
    	  
      public static void App()  
      {  
          int a = 20;  
          int b = 3;  
          int c = 0;  
          int d = 0;  
          WriteLine($"Before Ref - Quotient : {c}, Remainder : {d}");  
          Divide(a,b,out c, out d);  
          WriteLine($"After Ref - Quotient : {c}, Remainder : {d}");  
      }  
    }