bdfgdfg

[C#] ref,out 키워드 본문

게임프로그래밍/C#

[C#] ref,out 키워드

marmelo12 2022. 4. 18. 16:16
반응형

C#에서는 포인터가 존재하지 않는다. 또한 C++처럼 참조자(&)키워드가 없기에 다른 방식으로 원본을 넘겨줘야 한다.

그것이 ref 키워드.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Program
{
 
    static void Test(int a, ref int b)
    {
        a = 100;
        b = 200;
    }
    static void Main(string[] args)
    {
        int a = 10, b = 20;
        Console.WriteLine("a : {0} b : {1}",a,b);
        Test(a, ref b); // 넘길 때 ref키워드를 붙여줘야 한다.
        Console.WriteLine("a : {0} b : {1}", a, b);
    }
}
 
cs

ref키워드를 통해 넘긴 변수는 원본의 값이 바뀌었지만, 그렇지않은 변수는 함수에서 값이 바뀌어도 원본은 바뀌지 않음.

 -> 원본을 넘긴게 아닌, 복사가 이루어졌기에 별개의 메모리.

 -> ref키워드는 메소드,호출자쪽 둘 다 붙여줘야 한다.

 -> 참고로 C#과 같이 완전히 객체지향언어에서는 전역함수는 불가능.

 

또한 참조자를 반환할수도 있다.

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
class Test
{
    private int m_test = 200;
 
    public ref int GetTest()
    {
        return ref m_test;
    }
}
 
 
class Program
{
 
    static void Test(int a, ref int b)
    {
        a = 100;
        b = 200;
    }
    static void Main(string[] args)
    {
        Test test = new Test();
        Console.WriteLine(test.GetTest());
        ref int value = ref test.GetTest();
        value = 500;
        Console.WriteLine("원본이 바뀐다 -> {0}",test.GetTest());
    }
}
 
cs

 

여기저기 참조자를 붙여야하는게 조금 귀찮긴 하지만, 참조자를 반환함으로서 실제 test 객체의 멤버인 m_test의 값을 수정할 수 있는 것.

 

또한 함수에서 둘 이상의 결과를 반환해야 하는 경우도 종종 존재한다.

그럴경우에도 ref를 사용할 수는 있다. 다만 가독성면에서 이 ref가 원본을 넘겨 단순히 어떤 값을 수정하길 바라는건지, 아니면 넘긴 변수에 값을 담아오길 바라는건지는 사용자 입장에서는 알수가 없다. 또한 좀 더 안전하게 처리하기 위해서

위와 같은 경우에는 out 키워드를 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Program
{
 
    static void Divide(int a,int b, out int quotient, out int remainder)
    {
        quotient = a / b;
        remainder = a % b;
    }
    static void Main(string[] args)
    {
        int a = 45, b = 4, q, r;
 
        Divide(a, b, out q, out r);
 
        Console.WriteLine("결과 : {0}, {1}",q,r);
    }
}
 
cs

 

out키워드가 ref키워드보다 안전장치가 하나 더 달려있는데, out키워드를 통해 선언된 매개변수는 함수 정의부에서 결과값을 저장하지 않으면 컴파일 에러를 내뱉는다.

 

반응형

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

[C#] 인터페이스,추상클래스  (0) 2022.04.19
[C#] 부모 자식 사이의 형 변환 (is,as)  (0) 2022.04.18
[C#] 문자열 다루기  (0) 2022.04.18
[C#] C#의 데이터 형식  (0) 2022.04.17
[C#] CLR(Common Language Runtime)  (0) 2022.04.17
Comments