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}"); } }