ref 키워드 (참조자)
C++에서 참조자 & 있다면 C#에는 단순히 참조를 하기위한 ref키워드가 있다.
값형식이든 참조 형식이든 둘다 스택에 있는 값이 복사된다.
값 형식 : 스택영역메모리에 값이 직접 들어가있어서 그것이 복사된것
참조 형식 : 스택영역메모리에 힙영역의 주소가 들어있어서 그 주소가 복사되면서 같은 객체를 가리 킴
ref키워드를 이용하면 스택영역 메모리의 주소를 사용하면서 Call by reference를 사용하게된다.
예제코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | static void Main(string[] args) { int a = 100; int b = 200; swapvalue(ref a, ref b); Console.WriteLine("변수{0}에 들어있는 수는{1}입니다.", "a", a); Console.WriteLine("변수{0}에 들어있는 수는{1}입니다.", "b", b); } static void swapvalue(ref int a, ref int b) { int temp = a; a = b; b = temp; } |
a값과 b값이 변경되었다.
out 키워드 (참조자)
out키워드도 Call by reference를 가능하게 하는 키워드이며
'출력용 매개변수'라고도 하여 값을 읽을 수 없는 쓰기용이다.
ref와 다른 특징들이 있다.
1. 현재 메소드가 끝나기 전에 out키워드가 붙은 변수는 값을 할당 받아야한다.
1 2 3 4 5 6 7 | static void swapvalue(ref int a, ref int b, out int c) { int temp = a; a = b; b = temp; //c 변수는 값을 할당 받아야한다. } |
2. out 키워드가 쓰인 변수는 함수내에서 값을 읽을 수 없다.
1 2 3 4 5 6 7 8 | static void swapvalue(ref int a, ref int b, out int c) { int temp = c; //에러 a = b; b = temp; c = a; } | cs |
예제코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | static void Main(string[] args) { int a = 100; int b = 200; int swapA ; //값 초기화 의미 X int swapB; //값 초기화 의미 X swapvalue(a,b, out swapA, out swapB); Console.WriteLine("변수{0}에 들어있는 수는{1}입니다.", "a", swapA); Console.WriteLine("변수{0}에 들어있는 수는{1}입니다.", "b", swapB); } static void swapvalue(int a,int b, out int swapA, out int swapB) { swapA = b; swapB = a; } | cs |
ref와 기능이 같은데 out키워드를 쓰는 이유?
ref키워드를 이용해서 매개 변수를 넘기는 경우에는 메소드가 해당 매개변수에 결과를 저장하지 않더라도 컴파일러는 아무런 경고를 하지 않는다.
하지만 out 키워드는 매개변수를 넘길 때 메서드가 해당 매개변수에 결과를 저 정하지 않으면 컴파일러 에러를 주면서 강제적으로 제한을 준다.
또 첫 번째처럼 초기화를 하지 않아도 되는 이유는 호출당할 때 값을 할당할 것을 보장하기때문이다. 프로그램이 실행됐을 때가 아닌 코드를 작성하는 중에 컴파일 과정 에러를 확인할 수 있다.
공부참조
https://grayt.tistory.com/90?category=683217
https://runtoyourdream.tistory.com/279
https://grayt.tistory.com/90?category=683217
'프로그래밍언어 > C#' 카테고리의 다른 글
C#) 네임스페이스 / 유니티 네임스페이스 (0) | 2019.02.13 |
---|---|
C#) 박싱/언박싱 (boxing/unboxing) (0) | 2019.02.10 |
C#) Lamda #2 (0) | 2019.02.07 |
C#) Lamda 람다 식 (0) | 2019.02.06 |
C#) Generics 제네릭 클래스 (0) | 2019.02.04 |