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 변수는 값을 할당 받아야한다.
        }

cs


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

+ Recent posts