C# 기초 : (C++ 에서 참조자라 불리는) ref 키워드

그리고 out 키워드 (출력 전용 매개 변수)




C++에서 레퍼런스(참조자)는 큰 성능향상을 가져다 주었다.

상수 객체 참조자에 의한 전달 방식이 그 예이다.

call by refference 방식을 구현할 때에도 포인터를

이용하는 것이 아닌 레퍼런스를 이용해 보다 안전하고

간편하게 구현할 수 있었다. C# 또한 마찬가지




하지만 다른점이 있는데

&가 아닌 ref를 붙여줘야 한다는 점


void swap( ref int a, ref int b){

...

}


사용할 떄에도


int x;

int y;


swap(ref x , ref y);




사용할 때에도 왜 귀찮게 ref를 붙여줄까..

생각해봤는데, C++에서 swap함수를 참조자로

만들었다면 사용하는데 있어 이 함수가

call by value를 하는 것인지

call by refference를 하는 것인지

분간이 안간다는 것이다.


하지만 C#에서는 ref를 붙여줌으로써

구분이 가능하다. (단순히 내 생각..)




out 키워드 (출력 전용 매개 변수)

out 키워드는 ref 키워드와 똑같은 일을 하지만

좀 더 안전한 방법으로 일을 한다.




void Divide ( int a , int b, ref int quotient , ref int remainder ){

quotient = a / b;

remainder = a % b;

}


int main(){

int a = 20 , b = 3, c = 0, d = 0;


Divide( a, b, ref c, ref d);

}


a를 b로 나눈 뒤 나머지와 몫을 구해서 c 와 d에 저장한다.

위 코드를 out 키워드로 바꾸어 보자.


void Divide ( int a , int b, out int quotient , out int remainder ){

quotient = a / b;

remainder = a % b;

}


int main(){

int a = 20 , b = 3, c = 0, d = 0;


Divide( a, b, out c, out d);

}




결과는?

ref 키워드와 똑같다. 그렇다면 out 키워드는 왜 쓰는가?




ref 키워드를 이용해서 매개 변수를 넘기는 경우에는 메소드가

해당 매개 변수에 결과를 저장하지 않더라도 컴파일러는

아무런 경고를 하지 않는다. 이와 달리 out 키워드를

이용해서 매개 변수를 넘길 때는 메소드가 해당 매개 변수에

결과를 저장하지 않으면 컴파일러가 에러 메시지를 출력한다.




또한 메소도를 호출하는 쪽에서는 초기화를 하지 않은

지역 변수를 메소드의 out 매개 변수로 넘기는 것이 가능.

컴파일러가 호출당하는 메소드에서 그 지역 변수를

할당할 것을 보장하기 때문이다.




즉, 런타임 에러를 컴파일 타임 에러로 잡아낼 수 있다는 장점이 있다.



+ Recent posts