매개변수 한정자?
어떤 함수가 있을 때 해당 함수의 매개변수의 앞에 붙이는 키워드를 매개변수 한정자
라고 한다.
이를 통해서 매개변수에 특정한 기능, 역할을 부여할 수 있다.
out 키워드
out
키워드는 매개변수 한정자 중 하나이다.
반환타입
함수이름
(out
타입
변수이름
) 의 형태를 가진다.
int a;
int b;
int Func(out int x, out int y)
{
x = 5;
y = 10;
return x + y;
}
Console.WriteLine(Func(out a, out b));
Console.WriteLine(a);
Console.WriteLine(b);
매개변수 한정자가 out이라면 함수를 호출
할때 매개변수에 out 한정자 를 붙혀줘야 한다.
함수 Func()은 변수 a와 b의 참조를 전달 받는다.
이때 변수 a와 b에는 값이 초기화 되지 않아도 된다.
대신 반드시 함수 내에서 out 매개변수에 값을 할당
해야만 한다.
즉 out 매개변수
는 함수에서 여러가지 값을 반환하기 위해서
값을 반환받을 메모리 공간을 매개변수로 요청
하는 문법이다.
ref 키워드
ref
키워드도 매개변수 한정자 중 하나이다.
void Func (ref int x, int y){
x += y;
y += x;
}
int a = 10;
int b = 20;
Func(ref a, b);
Console.WriteLine(a); // 30출력 함수 내부 연산의 영향을 받았다.
Console.WriteLine(b); // 20출력 함수 내부 연산의 영향을 받지 않았다.
매개변수 한정자가 ref라면 함수를 호출
할때 매개변수에 ref 한정자를 붙혀줘야 한다.
기본적으로 C#에서 함수에 매개변수를 전달할때 Func의 두번쨰 매개변수 b처럼 call by value
를 한다. 이때 함수 내부에서 발생한 연산의 결과는 b의 원본에는 아무런 영향을 주지 못한다.
하지만 ref 키워드를 사용해 명시적으로 call by reference
를 할 수 있다. 참조로 전달을 하게되면 함수 내부에서 발생한 연산의 결과가 원본인 a에 영향을 끼치게 된다.
ref와 out의 차이점
out은 매개변수로 줄 변수가 초기화 되어있지 않아도 상관이 없었다.
out
에서 필요로 하는건 오직 값을 반환받기 위한 메모리 공간
이기 떄문이다.
하지만 ref
는 변수의 값을 참조전달
받기 위한 문법이기 때문에 변수가 미리 초기화 되어있어야만 한다.
대신 out 과 다르게 함수 내부에서 ref 매개변수의 값을 할당하지 않아도 된다.