본문 바로가기

프로그래밍/C#

씨샵 01 static(스태틱), construct(생성자), ref, out(call by ref)

 

C++ 이랑 별로 다른게 크게 없는것 같음

 

기본적인건 거의 같고 문법 및 쓰임새 조금 다른것만 정리

 

 

 

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

namespace TestClassA
{
    class Program
    {
        public static int value = 0; // static 멤버 변수 초기화

        private int privateInt;
        public int publicInt;

        static Program() // static 생성자
        {
            value = 10;
        }
        public Program()
        {
            privateInt = 20;
            publicInt = 30;
        }
        public void SetInt(int arg)
        {
            privateInt = arg;
        }
        public int GetInt()
        {
            return privateInt;
        }

        public void Sub(ref int x)
        {
            x = x - 30;
        }

        public void Add(out int y)
        {
            y = 10 + 30;
        }

        static void Main(string[] args)
        {
            // WriteLine 을 사용하면 강제 개행 된다. ( cout 에서 endl; 한것과 같음 )
            // static 멤버 변수 value는 객체를 생성하지 않아도 static Program 생성자에 의해 10으로 초기화 됨.
            Console.WriteLine("Program.value : {0}", Program.value);

            // class 변수를 선언할때는 항상 new 를 사용해야 한다.
            // 그냥 Program Instance; 만 할 경우에는 ref 타입 변수가 선언됨 (c++ 에서 type* 과 같음)
            Program Instance = new Program();

            // Write는 강제 개행이 안된다. 대신에 WriteLine 처럼 {0} 과 같은 기호를 안써줘도 됨.
            // PrivateInt 와 PubliceInt 는 static 변수가 아니기 때문에 new 연산자로 할당 될 때 public Program() 생성자에 의해 초기화된다.
            Console.Write("value:" + Program.value + " PrivateInt:" + Instance.GetInt() + " PubliceInt:" + Instance.publicInt+"\n");

            // public 변수는 직접 값 대입 가능
            Instance.publicInt = 100;

            // private 변수는 public 함수로 설정한 set/get 함수로만 접근 가능
            Instance.SetInt(500);

            Console.WriteLine("Instance.publicInt:{0} Instance.privateInt:{1}", Instance.publicInt, Instance.GetInt());

            // 씨샵에는 call by ref 방식이 두가지 있다. ref 와 out 방식
            // ref는 값이 초기화된 상태로만 넘겨야 하고 out는 초기화가 안되어 있어도 상관 없다.
            int x = 100;
            Instance.Sub(ref x);
            Console.WriteLine("Instance.Sub() Result = {0}", x);

            int y;
            Instance.Add(out y);
            Console.WriteLine("Instance.Add() Result = {0},", y);
        }
    }
}