namespace ConsoleApplication1

{

    struct MyData

    {

        public int x, y;


        public MyData(int x, int y)

        {

            this.x = x;

            this.y = y;

        }


        public MyData(ref int x, ref int y)

        {

            this.x = 0;

            this.y = 0;

        }


        public void NoShow()

        {

            Console.WriteLine("no swap");

            Console.WriteLine("{0}        {1}", this.x, this.y);

        }


        public void Show()

        {

            Console.WriteLine("swap");

            Console.WriteLine("{0}        {1}", this.x, this.y);

        }

    }


    class MyDataClass

    {

        public int x = 10, y = 100;


        public void NoShow()

        {

            Console.WriteLine("No swap");

            Console.WriteLine("{0}        {1}", x, y);

        }


        public void Show()

        {

            Console.WriteLine("swap");

            Console.WriteLine("{0}        {1}", x, y);

        }

    }


    class Swap

    {


        static public void CSwapdata(MyDataClass md)

        {

            int temp;

            temp = md.x;

            md.x = md.y;

            md.y = temp;

        }


        static public void CSwapdata1(ref MyDataClass md)

        {

            int temp;

            temp = md.x;

            md.x = md.y;

            md.y = temp;

        }


        static public void Swapdata(MyData md)

        {

            int temp;

            temp = md.x;

            md.x = md.y;

            md.y = temp;

        }


        static public void Swapdata1(ref MyData md)

        {

            int temp;

            temp = md.x;

            md.x = md.y;

            md.y = temp;

        }

    }


    class Program

    {


        static void Main(string[] args)

        {

            MyData Md = new MyData(10, 100);


            MyData Md1;

            Md1.x = 10;

            Md1.y = 100;


            Console.WriteLine("new struct value");


            Md.NoShow();


            Swap.Swapdata(Md);


            Md.Show();


            Console.WriteLine("new struct ref");


            Md.NoShow();


            Swap.Swapdata1(ref Md);


            Md.Show();


            Console.WriteLine("value struct value");


            Md1.NoShow();


            Swap.Swapdata(Md1);


            Md1.Show();


            Console.WriteLine("value struct ref");


            Md1.NoShow();


            Swap.Swapdata1(ref Md1);


            Md1.Show();


            MyDataClass CMd = new MyDataClass();


            Console.WriteLine("class value swap");


            CMd.NoShow();


            Swap.CSwapdata(CMd);


            CMd.Show();


            Console.WriteLine("class ref swap");


            CMd.NoShow();


            Swap.CSwapdata1(ref CMd);


            CMd.Show();


        }

    }

}


구문이 좀 길지만 실행해보면 차이를 알수 있다.


구조체의 경우 ref로 참조하지 않을 경우 원본의 데이터를 바꿀수 없다.

이것은 구조체를 new로 할당하거나 그냥 할당해도 마찬가지이다.


클래스의 경우에는 반대이다. 어떤 방식으로 넣어도(ref로 넣던 값형으로 넣던) 내부의 데이터를 변경할수가 있다.


즉 클래스는 애초부터 참조형 형태의 데이터이고 구조체의 경우에는 값형 데이터이며 이 차이를 명확하게 인식해야 한다.

'게임개발공부 > C#공부' 카테고리의 다른 글

C# 프로그래밍 <윈폼> <이벤트> <델리게이트>  (0) 2014.01.10
DateTime 구조체  (0) 2013.12.30
변수가 사용됐다? 초기화의 순서는?  (0) 2013.12.30
인덱서  (0) 2013.12.30
구조체  (0) 2013.12.30
Posted by JJOREG