noname02

out, ref 본문

Study/C#

out, ref

kimtaku 2015. 5. 3. 17:52

out과 ref 키워드는 매개변수의 값을 참조하게 한다.

C와 C++에서 포인터를 생각하면 된다. 혹은 C++에서 &연산자를 생각하면 된다.

객체는 어차피 항상 참조형이므로 굳이 사용할 필요는 없다.


out과 ref는 매개변수에 키워드를 적어줘야 한다.

정의할 때에는 당연히



1
2
public void Method(ref int a) { ... } ;
public void Method(out int a) { ... } ;
cs


의 형태로 정의를 하며, 이 함수를 호출할 때에는



1
2
Method(ref a);
Method(out a);
cs


의 형태로 ref, out을 명시해줘야 한다.

ref와 out의 차이점이라고 한다면, ref는 매개변수를 전달할 때 해당 변수가 꼭 초기화가 되어있어야 된다는 것이다.



1
2
3
4
int a = 10;
int b;
Method(ref a); // OK
Method(ref b); // ERROR
cs


b는 초기화가 되어있지 않으므로 ref로 전달해줄 수 없다.

out은 초기화가 되어 있건, 되어 있지 않건 상관이 없다.

그러면 굳이 ref를 쓸 필요가 있을까? 초기화를 할 필요가 없는 out이 더 효율적으로 보인다.

그러나 out은 ref와는 다르게 메서드 내에서 꼭 매개변수로 받은 값을 초기화를 해줘야 된다는 것이다.

메서드 밖에서 이미 초기화가 되어서 들어왔다고 해도 새로 초기화를 해줘야 한다. 그러니까 값을 꼭 넣어줘야 한다는 것이다. 그렇지 않으면 컴파일 오류를 발생시킨다.



1
2
public void Method(ref int a) { } ; // OK
public void Method(out int a) { } ; // ERROR
cs


ref는 함수가 텅 비어 있어도 된다. a로 받은 값을 사용하지 않아도 된다. (물론 굳이 그러진 않겠지만)

하지만 out은 인수로 받은 변수를 무조건 어떤 값의 형태를 넣어줘야 한다.



그런데 이러한 비슷한 성질 때문에, ref와 out은 오버로딩이 되지 않는다.

즉 


1
2
public void Method(ref int a) { ... } ;
public void Method(out int a) { ... } ;
cs


와 같이 오버로딩을 할 수 없다. 

물론 매개변수의 개수가 차이가 나거나, 받아들이는 자료형이 차이가 난다면 오버로딩이 당연히 된다.


'Study > C#' 카테고리의 다른 글

var  (0) 2015.05.30
base  (0) 2015.05.05
[Visual Studio] 코드 자동 정렬  (0) 2015.05.03
as와 is  (0) 2015.05.01
Comments