C# ref 키워드, out 키워드

C# 2016. 6. 20. 15:22
1
2
3
4
5
6
7
8
9
10
11
static void Main(string[] args)
{
    Program program = new Program();
    int a = new int();
    Func1(ref a);
    Console.WriteLine(a);
}
static void Func1(ref int x)
{
    x = x + 1;
}
cs

실행 결과 : 

1


value type를 call by reference로 넘길 수 있다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Point
{
    public int x;
    public int y;
}
static void Main(string[] args)
{
    Point pt = null;
 
    Func1(pt);
    Console.WriteLine("pt : " + pt);
 
    Func2(ref pt);
    Console.WriteLine("pt.x : " + pt.x + " pt.y : " + pt.y);
}
static void Func1(Point pt)
{
    pt = new Point();
    pt.x = 1;
    pt.y = 2;
}
static void Func2(ref Point pt)
{
    pt = new Point();
    pt.x = 3;
    pt.y = 4;
}
cs

실행 결과 : 

pt : 

pt.x : 3 pt.y : 4


얕은 복사(Func1)와 ref에 의한 전달(Func2)의 차이를 잘 보여주는 예제이다.

얕은 복사에 의한 매개변수는 단순히 주소값을 복사해서 넘기는 것이며, Main에서의 pt와 Func1에서의 pt는 같은 주소를 가리키는 서로 다른 포인터이다.

하지만 Func2의 pt는 Main에서의 pt와 같다.




out 키워드 또한 ref 키워드처럼 사용하여 참조에 의한 호출을 가능케 한다.

차이점은

  1. out으로 지정된 인자에 넘길 변수는 초기화되지 않아도 된다.
    초기화되어 있더라도 out 인자를 받는 메서드에서는 그 값을 사용할 수 없다.
  2. out으로 지정된 인자를 받는 메서드는 반드시 변수에 값을 넣어서 반환해야 한다.
C언어 함수에서 인자로 주소값을 받아서 결과를 담아 돌려주는 방식과 같다.
딱 그 용도로만 쓸 수 있도록 만들어놓은 키워드이다.


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

C# 열거형(enum)  (0) 2016.06.20
C# 구조체와 클래스 선택 기준  (0) 2016.06.10
C# 값 타입의 new 할당  (0) 2016.06.10
C# 인터페이스 - IEnumerable, IEnumerator 인터페이스  (0) 2016.06.09
C# 인터페이스(interface)  (0) 2016.06.09
Posted by RPG만들기XP
,