개발공부

c# 함수 기초

파란색까마귀 2022. 2. 13. 21:53

2016. 2. 25. 18:36

https://blog.naver.com/nagne2011/220638119382

 

 class Program
    {
        static void Test1()
        {
            Console.WriteLine("hellow");
        }
        /// <summary>
        /// 3줄짜리 주석, 파라미터에 대한 내용을 적을 수 있다 (자동으로 작성된다)
        /// </summary>
        /// <param name="i"></param>
        /// <param name="j"></param>
        static void Test2(int i, int j)
        {
            Console.WriteLine("test2 : {0}, {1}", i,j);
        }
 
        /// <summary>
        /// 리턴 타입에 대한 설명도 쓸수있다.
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        static int Test3(int num)
        {
 
            return num + 1;
        }
 
        static void Test4(ref int num)   
//struct타입인 int는 num을 복사하여 넘겨주는데, 이를 참조로 바꾸기 위해서
// ref를 붙여주면 연산이 간단해진다
        {
            Console.WriteLine("test4 : {0}", num);
            num++;
        }
        static void Test5(out int num)     //출력용으로 사용한다고 고정, 맴버변수에 항상 할당이 되어있어야한다
        {
            num = 10;
        }
 
        //연속된 함수 생성
        static void Work_01()
        {
            Console.WriteLine("주문 받겠습니다.");
        }
        static void Work_02()
        {
            Console.WriteLine("계산 하겠습니다.");
        }
        static void Work_03()
        {
            Console.WriteLine("기다려 주세요.");
        }
        static void Work_04()
        {
            Console.WriteLine("벨을 울림.");
        }
 
        static void Work_05(int i)
        {
            Console.WriteLine("테스트.");
        }
        
        //델리게이트 함수
        delegate void Work();
 
 
 
        static void Main(string[] args)
        {
            Test1();
 
            Test2(10, 5);
 
            Console.WriteLine("test3 : {0}", Test3(10));
 
            int test = 20;              //메모리상으로 할당이 된것만 넘겨줄 수 있다.
            Test4(ref test);            //참조로 넘겨주었으니 참조로 받는다
            Console.WriteLine("After test4 : {0}", test);
 
            int test3 = 0;
            Test5(out test3);                           //출력값을 10으로 고정
            Console.WriteLine("test5 : {0}", test3);    //값이 10으로 바뀐다
            
            
            //델리게이트
            //: 함수를 연속해서 계속쓸 수 있다
            Work work = new Work(Work_01);
            //함수 추가
            work += new Work(Work_02);
            work += new Work(Work_03);
            work += new Work(Work_04);
            //함수 시작
            work();
            //함수 제거
            work -= Work_03;
            work();
            //예외상황
            //work += new Work(Work_05); -> 다른것들(01~04)과 멤버변수가 일치하여야 한다
 
            myTest_01 mt1 = new myTest_01();
            myTest_01 mt2 = mt1;            //얕은 복사 : 참조만 넘겨준다
            myTest_01 mt3 = mt1.DeppCopy(); //깊은 복사 : 그대로 복하산다
            mt1.PrintNumber();      //10 20 30
            mt1.i = 20;
            mt1.PrintNumber();      //20 20 30
            mt2.PrintNumber();      //20 20 30
            mt3.PrintNumber();      //10 20 30
 
            mt1.WorkSet(Work_01);
            mt1.work();
            mt1.WorkSet(Work_02);
            mt1.work();
 
           // for (int i = 0; i < 100; ++i )
           // {
           //     myTest_01 forTest = new myTest_01();       //100번 찍히겠지만.. 매우 나쁜 코드다
           //     forTest.PrintNumber();
           // }
 
            //프로퍼티
            Console.WriteLine("K : {0}", mt1._k);
            mt1._k = 500;
            mt1.PrintNumber();
 
 
            //상속
            myTest_02 mt4 = new myTest_02();
            mt4.PrintNumber();
            mt4.printString();
 
            myTest_01 mt5 = mt4;
            //is, as
            if (mt5 is myTest_02)    //A is B, A가 원레 생성된 B인지, 즉 타입이 맞는지 확인한뒤 true, false로 리턴한다
            {
                Console.WriteLine("mt5는 Mytest_02입니다.");
            }
            if (mt5 is  myTest_01)   
            {
                Console.WriteLine("mt5는 Mytest_01입니다.");
            }
 
            //as가 더 자주 쓰인다//
            myTest_02 mt7 = mt5 as myTest_02; //만약 이게 맞으면, mt7은 null이 아니게 된다
                                              //= 변경 가능하면 값이 있고, 불가능하면 null
            if(mt7 != null)
            {
                Console.WriteLine("mt7는 myTest_02입니다.");
                mt7.printString();
            }
 
            Console.ReadLine();
        }
    }

 

 

추가. 상속

 class myTest_01
    {
        public Work2 work;
        public int i = 10;      //인수 하나하나 마다 모두 public이나 private등을 붙여주어야 한다
        private int j = 20;     //인수에 바로 값을 대입할 수 있다
        int k = 30;             //아무것도 안붙이면 'private'로 인식한다
 
        //프로퍼티 : 겟셋을 쉽게 만들수 있게 해준다
        public int _k
        {
            get { return this.k; }
            set
            {
                if(value < 0)
                {
                    this.k = 0;
                }
                else if (value > 101)
                {
                    this.k = 100;
                }
                else
                {
                    this.k = value;
                }
            }
        }//겟셋 값을 한다
 
 
        //생성자와 소멸자도 만들 수 있다. 다만 이 경우에 public을 붙여주지 않으면 private로 생성된다..!
        public myTest_01()
        {
            Console.WriteLine("myTest_01 생성");
        }
        ~myTest_01()
        {
            //단, 소멸자는 '언제 소멸될 지 모른다'
            Console.WriteLine("myTest_01 소멸");
        }
        
        public void PrintNumber()
        {
            Console.WriteLine("i : {0},j : {1},k : {2}", i,j,k);
        }
        public myTest_01 DeppCopy()
        {
            myTest_01 result = new myTest_01();
           result.i = this.i;
           result.j = this.j;
           result.k = this.k;
 
           return result;
 
        }
 
        public void WorkSet(Work2 newWork)
        {
            work = newWork;
        }
 
        public void SetJ(int num)
        {
            j = num;
        }
 
    }

 

  //상속
    class myTest_02 : myTest_01 //무조건 public 상속
    {
        public void printString()
        {
            Console.WriteLine("MyTest_02 입니다.");
        }
    }
728x90

'개발공부' 카테고리의 다른 글

c# try-catch  (0) 2022.02.13
c# 함수 상속  (0) 2022.02.13
C# 기초 자료형  (0) 2022.02.13
벡터, 행렬  (0) 2022.02.13
자료구조  (0) 2022.02.13