ref와 out 차이

2015. 6. 23. 18:05프로그래밍/C#

728x90
728x90

서론

기존 C++에서 사용하던 레퍼런스는 ref 키워드를 써서 사용하면 된다.

이와 비슷한 녀석인 out이 있는데..

처음 봐서 생소해서 예제를 넷에서 찾아보았다.


일단 out은 ref와 거의 비슷한 역할을 하지만 차이점이 있다.


첫 번째, 함수 호출 시 호출 인자를 초기화 하지 않으면 ref는 에러를 발생한다.

초기화 되지 않은 변수기 때문에 C#에선 조금 하드하게 에러를 발생한다.

하지만 out은 초기화하지 않은 변수도 사용할 수 있다.

이는 C#의 특성상 코드를 간결하게 하기 위한 언어이다.

초기화와 메소드에서 사용하는 값을 넣는 행위를 중복으로 간주할 수 있다.

이를 지원해주는 것이 out이다.


두 번째, out은 위에서 보았듯이 초기화 하지 않은 변수들이 넘어오기때문에 반드시 메소드 초기화 해주어야한다.

메소드에서 초기화 할 것을 가정하고 넘겼으므로 초기화 하지 않으면 에러를 리턴한다.


코드

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace RefAndOutTest
{
    // program
    class Program
    {
        static void Main(string[] args)
        {
            
            Point myPoint = new Point(1015);
            int x1, x2;
            int y1, y2;
 
            myPoint.SetPointOut(out x1, out y1);
            /*
            1>c:\users\jo minhyuk\documents\visual studio 2012\Projects\RefAndOutTest\
            * RefAndOutTest\Program.cs(19,28,19,30): error CS0165: 할당되지 않은 'x2' 지역 변수를 사용했습니다.
            1>c:\users\jo minhyuk\documents\visual studio 2012\Projects\RefAndOutTest\RefAndOutTest\
            * Program.cs(19,36,19,38): error CS0165: 할당되지 않은 'y2' 지역 변수를 사용했습니다.
            */
            // myPoint.SetPointRef(ref x2, ref y2);
        }
    }
 
    // Point class
    class Point
    {
        // public
        public Point(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
 
        // set Function Out
        public void SetPointOut(out int x, out int y)
        {
            /*
            안에서 초기화하지 않으면?
            1>c:\users\jo minhyuk\documents\visual studio 2012\Projects\RefAndOutTest\RefAndOutTest\
             * Program.cs(41,15,41,26): error CS0177: 제어가 현재 메서드를 벗어나기 전에 'x' out 매개 변수를 할당해야 합니다.
            1>c:\users\jo minhyuk\documents\visual studio 2012\Projects\RefAndOutTest\RefAndOutTest\
             * Program.cs(41,15,41,26): error CS0177: 제어가 현재 메서드를 벗어나기 전에 'y' out 매개 변수를 할당해야 합니다.
             */
            x = this.x;
            y = this.y;
        }
 
        // set Function Ref
        public void SetPointRef(ref int x, ref int y)
        {
            x = this.x;
            y = this.y;
        }
 
        // private
        private int x;
        private int y;
    }
}
cs





728x90
반응형

'프로그래밍 > C#' 카테고리의 다른 글

[.NET, C#] 비동기 네트워크 API  (0) 2016.02.14
직렬화  (0) 2015.08.03
Delegate  (2) 2015.08.03
데이터 보관하기  (0) 2015.08.03
C#이란?  (0) 2015.08.03
가비지 컬렉션  (0) 2015.07.28
처음만드는 C# 기초 입출력  (0) 2015.06.22