함수 매개변수에 사용가능한 ref/out 키워드
ref 키워드
- 참조 전달을 위해 사용할 수 있다.
namespace CSharpClass
{
class Product
{
private int price = 100;
public ref int GetPrice()
{
return ref price;
}
}
}
참조 인자로 반환할 경우 return의 반환 변수에도 ref 키워드를 붙여야한다.
class Program
{
static void Main(string[] args)
{
Product carrot = new Product();
// 참조 변수로 밖에서 값을 수정할 수 있다.
ref int ref_local_price = ref carrot.GetPrice();
// 지역 변수로 취급된다.
int local_price = carrot.GetPrice();
// 에러 : 값 형식을 참조 형식 변수에 초기화
ref int ref_half_price = carrot.GetPrice();
// 에러 : 참조 형식을 값 형식에 초기화
int ref_half_price2 = ref carrot.GetPrice();
}
}
- 함수를 참조 형식을 반환한다고 선언했을 지라도 밖에서 지역 변수로 초기화하면 지역 변수로 취급된다.
- 외부에서도 참조 형식으로 받으려면 ref 키워드를 양쪽에 명식적으로 선언해야하며 총 4번이나 ref라는 키워드를 사용해야한다.
- 한쪽이라도 참조 형식 짝이 맞지 않는 경우 컴파일 에러가 발생한다.
out 키워드
하나 이상의 함수의 반환 인자에 대해 명시적으로 선언할 때 사용한다.
static void Divide(int x, int y, out int quotient, out int remainder)
{
quotient = x / y;
remainder = x % y;
}
ref 키워드를 사용하지 않는 이유
- out 키워드로 선언된 매개 변수는 반드시 함수 내에서 값을 할당해야한다. (컴파일 에러)
- 사용자의 실수로 값을 대입하지 않는 것을 방지
해당 매개 변수는 항상 지역 변수로 할당될 것이라는 보장이 있으므로 함수 외부에서 인라인 형태로 변수를 선언할 수 있다.
static void Main(string[] args)
{
int x = 21;
int y = 8;
Divide(x, y, out int quotient, out int remainder);
Console.WriteLine("{0:D}, {1:D}", quotient, remainder); // 2, 5
Console.Read();
}
미리 선언된 변수를 매개 변수로 전달할 수 있다. 대신 반드시 out 키워드를 명시해야한다.
int quotient = 0, remainder = 0;
Divide(x, y, out quotient, out remainder);
가변 인자 함수와 지역 함수
static void Main(string[] args)
{
int sum = 0;
Sum(1, 2, 3, 4, 5);
// values는 int형 배열이다.
void Sum(params int[] values)
{
for (int i = 0; i < values.Length; ++i)
{
// 함수 내 지역변수를 참조할 수 있다.
sum += values[i];
}
}
Console.WriteLine("Sum 1 ~ 5 : {0}", sum); // 15
Console.Read();
}
- C#에서는 가변 개수를 가지는 매개 변수에 대한 함수를 선언할 수 있다.
- params type[]의 선언으로 배열 형태로서 매개 변수에 전달된다.
- 지역 함수는 함수내 정의된 함수로 지역 함수는 선언된 함수내의 지역 변수를 참조할 수 있다.
- 구조상 지역 함수의 후 선언 선 호출이 가능하다.
명명된 인수를 통한 함수 호출
class Program
{
static void PrintProfile(string name, string phone)
{
Console.WriteLine("Name : {0}, Phone : {1}", name, phone);
}
static void Main(string[] args)
{
PrintProfile(name: "강감찬", phone: "010-3241-5929");
PrintProfile(phone: "010-2131-7779", name : "이성계");
PrintProfile(name: "이순신", "010-3221-4572");
PrintProfile("유관순", phone: "010-1223-8889");
PrintProfile("윤봉길", "010-7321-0871");
Console.Read();
}
}
함수에 명명된 인수로 인자를 전달하면, 선언된 매개 변수이름으로 값을 대응시킬 수 있다. 대응되는 매개 변수가 있다면 순서에 상관없이 대응되는 매개 변수로 전달된다.