Notice
Recent Posts
Recent Comments
Link
bdfgdfg
[C#] ref,out 키워드 본문
반응형
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