C#

2020.09.15 - c# review

J_Bin 2020. 9. 15. 18:31

* Property

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _2020._09._15_001
{
    class Facto
    {
        public int MyProperty { get; set; }
    }
    class Tclass
    {
        public int a;
        public int b;
        public string s;

        public override string ToString()
        {
            return "[" + a + "]" + "[" + b + "]" + "[" + s + "]";
        }
    }
    struct Tstruct
    {

    }
    class Program
    {
        
        static void Main(string[] args)
        {
            Tclass aTclass = new Tclass();
            aTclass.a = 100;
            aTclass.b = 200;
            aTclass.s = "hello";

            Console.WriteLine(aTclass);
        }
    }
}

- 결과

값을 넣지않으면 [0][0][ ]이 출력된다 why ? 객체는 Heap영역에 만들어지므로 Heap영역은 모든 객체의 값들이 0으로 초기화되어있기 때문이다.

 

 

 

* struct

- 결과

 

 

* class와 struct의 차이

 

한 마디로 class는 힙영역에 객체 참조 변수가 생기고 struct는 stack영역에 만들어진다.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _2020._09._15_001
{
    class Facto
    {
        public int MyProperty { get; set; }
    }
    class Tclass
    {
        public int a;
        public int b;
        public string s;

        public override string ToString()
        {
            return "[" + a + "]" + "[" + b + "]" + "[" + s + "]";
        }


    }
    struct Tstruct
    {
        public int a;
        public int b;
        public string s;

        public override string ToString()
        {
            return "[" + a + "]" + "[" + b + "]" + "[" + s + "]";
        }
       
        /*public Tstruct()    // struct에서 default생성자는 안된다.
        {

        }*/

        /*public Tstruct(int temp1)
        {
            
        }*/
    }
    class Program
    {

        static void Main1(string[] args)
        {

            /*Tclass aTclass = new Tclass();
            aTclass.a = 100;
            aTclass.b = 200;
            aTclass.s = "hello";
            Console.WriteLine(aTclass);

            Tclass aTclass1;
            aTclass1.a = 100;
            aTclass1.b = 200;
            aTclass1.s = "hello";
            Console.WriteLine(aTclass1);*/
            // class는 객체 생성없이 사용 불가능

            //-------------------Property--------------

            Tstruct aTsturct1 = new Tstruct();
            aTsturct1.a = 100;
            aTsturct1.b = 101;
            aTsturct1.s = "헬로";
            Console.WriteLine(aTsturct1);


            Tstruct aTsturct2;
            aTsturct2.a = 102;
            aTsturct2.b = 103;
            aTsturct2.s = "헬로 키티";
            Console.WriteLine(aTsturct2);
            // struct는 객체 생성없이 사용가능 - 특징 1

            //Tstruct aTsturct2;
            //aTsturct2.a = 100;
            //aTsturct2.b = 200;
            //aTsturct2.s = "hello";
            //Console.WriteLine(aTsturct2);
            // struct는 stack에 생성된다. 
            // 변수가 있어야 aTstruct2를 생성하기 때문에 변수 값이 자동으로 초기화되지 않는다. - 특징 2
            // 구조체는 객체가 아니다. - 특징 3

            Tclass aTclass1 = new Tclass();
            aTclass1.a = 100;
            aTclass1.b = 101;
            aTclass1.s = "헬로우";
            Console.WriteLine(aTclass1);

            Tclass aTclass2 = new Tclass();
            aTclass2.a = 102;
            aTclass2.b = 103;
            aTclass2.s = "헬로우 키티";
            Console.WriteLine(aTclass2);

            aTsturct1 = aTsturct2;
            aTclass1 = aTclass2;
            Console.WriteLine("----------------------------");
            Console.WriteLine(aTsturct1);
            Console.WriteLine(aTsturct2);
            Console.WriteLine(aTclass1);
            Console.WriteLine(aTclass2);
            Console.WriteLine("----------------------------");
            aTsturct1.a = 500;
            aTclass1.a = 500;
            Console.WriteLine(aTsturct1);
            Console.WriteLine(aTsturct2);
            Console.WriteLine(aTclass1);
            Console.WriteLine(aTclass2);
        }

        static void Main(string[] args)
        {
            Tstruct aTstruct1 = new Tstruct();
            Console.WriteLine(aTstruct1);

            Tstruct aTstruct2 = new Tstruct(700);
            Console.WriteLine(aTstruct2);

        }
    }
}

 

 

* ref

 

실체는 iNum2 = 2000 이지만 iArg2를 ref하기 때문에 출력값은 200이 나온다.

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _2020._09._15_002
{
    class Program
    {
        static void test1(int iArg1, ref int iArg2)
        {
            iArg1 = 100;
            //iArg2 = 200;
        }

        static void test2(int iArg1, out int iArg2)
        {
            iArg1 = 100;
            iArg2 = 200;
        }
        static void Main1(string[] args)
        {
            int iNum1 = 1000;
            int iNum2 = 2000;

            test1(iNum1, ref iNum2);

            Console.WriteLine(iNum1);
            Console.WriteLine(iNum2);

        }

        static void Main(string[] args)
        {
            int iNum1 = 1000;
            int iNum2 = 2000;

            test2(iNum1, out int iNum2);
            Console.WriteLine(iNum1);
            Console.WriteLine(iNum2);
        }
    }
}

 

 

* delegate

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _2020._09._15_005
{
    class Program
    {
        // DELEGATE : 메서드이름을 저장하는 DATATYPE을 델리게이트라고 한다.
        // 메서드를 개발자가 만들면 상황에 따라 반환값과 인자의 개수, 인자의 타입이 다르다.
        // 그러므로 한가지 모양의 델리게이트를 정의할수 없기 때문에
        // 개발자가 델리게이트를 저장하는 자료형을 직접 만들어줘야 한다.


        /// <summary>
        /// 델리게이트 코딩 방법
        /// </summary>
        /// <param name="Num1"></param>
        /// <param name="Num2"></param>
        /// <returns></returns>
        static int addInt (int Num1, int Num2)
        {
            return Num1 + Num2;
        }
        delegate int Facto(int Num1, int Num2);     // Facto가 addInt메서드를 대변한다.


        static int MulInt(int num1, int num2)
        {
            return num1 * num2;
        }
        //delegate int MulFacto(int num3, int num4);
        static void Main(string[] args)
        {
            int sum;
            // aFacto는 Facto type이다.
            Facto aFacto;
            // aFacto와 addInt의 자료형(type)이 같다.   // int _ (int, int) 라는 새로운 모양의 자료형을 내가 만든 것이다.




            aFacto = addInt;
            sum = aFacto(3, 4);
            Console.WriteLine(sum);

            Console.WriteLine("-------------------");

            aFacto = MulInt;
            sum = aFacto(3, 4);
            Console.WriteLine(sum);
        }
    }
}

'C#' 카테고리의 다른 글

2020.09.17 - 온/습도 모듈 센서를 이용, 차트 작성  (0) 2020.09.17
2020.09.16  (0) 2020.09.16
2020.09.11 - 온/습도 측정하기 / 리눅스  (0) 2020.09.11
2020.09.10 -  (0) 2020.09.10
2020.09.09 - C# Visualization  (0) 2020.09.09