C# Prog.
C#에서는 참조에 의한 호출(전달)을 위한 두가지 키워드를 제공하는데요. 'ref'와 'out' 바로 이들입니다.
우선 'ref'는 기존의 C의 포인터와 유사하게 메모리내에 저장되어 있는 값을 가리킵니다.
하지만, 포인터라고는 할 수 없을 것같습니다. 알아보니 'unsafe'라는 포인터를 사용하기 위한 키워드가 따로 존재하더군요. 그래서 제 생각으로는 단순히 참조를 하기위한 키워드로 사료됩니다.
'out' 매개변수는 '출력 전용 매개 변수'라 해서, out 키워드를 적용한 변수는 읽어드릴 수 없습니다. 대신 값을 내보내는 '쓰기'만 가능한 키워드인거죠.
일단, 적절히 생각나는 예제가 없어서, 이부분에 대해서는 책을 잠시 참고할게요.
우선, 변수의 값을 서로 바꿔주는 swap 이라는 함수를 구현해볼까 하는데요. 포인터를 배울 때, 많이 만들어보는 함수죠?
{
class Test
{
static void Main(string[] args)
{
int a = 100;
int b = 200;
swapValues(a, b);
Console.WriteLine("변수 {0}에 들어있는 수는 {1}입니다.", "a", a);
Console.WriteLine("변수 {0}에 들어있는 수는 {1}입니다.", "b", b);
}
public static void swapValues(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
}
}
결과 입니다.
우선 ref 입니다.
namespace TEST
{
class Test
{
static void Main(string[] args)
{
int a = 100;
int b = 200;
swapValues(ref a, ref b);
Console.WriteLine("변수 {0}에 들어있는 수는 {1}입니다.", "a", a);
Console.WriteLine("변수 {0}에 들어있는 수는 {1}입니다.", "b", b);
}
public static void swapValues(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
}
}
결과는요?
자, 값이 바뀐것이 확인되었죠? 그렇다면 이어서 out을 활용한 swap함수를 구현해보겠습니다.
하지만 out 키워드를 쓰기 전에 알아두어야 할 사항이 두가지 있습니다.
그렇지 않으면, 다음과 같은 오류를 만나게 됩니다.
메시지 내용은 '현재 메소드를 떠나기전에 해당 변수가 할당되어야 한다' 즉, 값이 꼭 저장되어야 함을 의미합니다.
2. out 키워드가 쓰인 변수는 함수내에서 값을 읽을 수 없습니다. '쓰기'전용입니다.
그렇지 않으면, 다음과 같은 오류를 만나게 됩니다.
메시지 내용은 '에러 : 할당되지 않은 매개변수의 사용'이라고 뜨네요. out 키워드는 매개변수로 넘어오는 매개변수의 주소만 참조할 뿐, 실제로 값은 신경도 쓰지 않는 것(?)을 알 수 있네요.
실제로, 예만 보여드리기 위해서, out 키워드를 쓴 swap 함수를 구현할 건데요. 만들어 놓고도 참.. ㅋㅋ
단지 설명용으로 보세요 ㅎㅎ
namespace TEST
{
class Test
{
static void Main(string[] args)
{
int a = 100;
int b = 200;
int swappedA = 100;
int swappedB = 200;
swapValues(a, b, out swappedA, out swappedB);
Console.WriteLine("변수 {0}에 들어있는 수는 {1}입니다.", "a", swappedA);
Console.WriteLine("변수 {0}에 들어있는 수는 {1}입니다.", "b", swappedB);
}
public static void swapValues(int a, int b, out int swappedA, out int swappedB)
{
swappedA = b;
swappedB = a;
}
}
}
결과는요?
ref와 out 모두 호출할때, 키워드를 생략하면 안된다는 점 숙지하시구요~ 여기까지 입니다.~
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 문자열을 숫자로 바꿔봅시다! (2) | 2013.07.23 |
---|---|
[C#] 아주 유용한 매개변수의 특징에 대해서 알아봅시다. (0) | 2013.07.23 |
[C#] 알아서 타입을 지정해주는 var 타입을 사용해보자. (0) | 2013.07.17 |
[C#] 원시타입(primitive)에 Nullable 을 사용해보자 (0) | 2013.07.17 |
[C#] enum 열거형을 사용해보자. (0) | 2013.07.17 |