●/섹션 4. 객체지향 여행

05.static (일반함수 VS static(정적)함수)

한국 /프랑스 웹툰 리뷰 2021. 7. 12. 10:08
728x90

 

using System;

namespace Csharp
{   
    class Knight
    {
        //static은 변수뿐만 아니라 나중에 함수에도 붙일 수 있다!
        static public int counter = 1;    //오로지 1개만 존재

        public int id;
        public int hp;
        public int attack;


        //< 일반함수 vs static(정적)함수 >

        //static이 아닌 일반함수는, Knight knight = new Knight();처럼 Knight클래스 자체를 인스턴스화 한 변수 knight에 종속된다.
        public void Test1()
        {

        }

        //static으로 만들면, class Knight에 종속된다. 그러므로 유일성이 보장된다.
        static public void Test2()
        {
            //class Knight에 종속되는 공용함수
        }
    }
}

 

 

using System;

namespace Csharp
{   
    class Knight
    {
        //static은 변수뿐만 아니라 나중에 함수에도 붙일 수 있다!
        static public int counter = 1;    //오로지 1개만 존재

        public int id;
        public int hp;
        public int attack;


        //< 일반함수 vs static(정적)함수 >

        //static이 아닌 일반함수는, Knight knight = new Knight();처럼 Knight클래스 자체를 인스턴스화 한 변수 knight에 종속된다.
        public void Test1()
        {

        }

        //static으로 만들면, class Knight에 종속된다. 그러므로 유일성이 보장된다.
        static public void Test2()
        {
            //class Knight에 종속되는 공용함수            
        }

        static public void Test3()
        {
            //id = 23;      불가능 (빨간줄이 뜬다)
            //hp = 100;     불가능 (빨간줄이 뜬다)

            //공용함수라는 것은, 각각 개개인의 정보에 접근한다는 것은 사실 말이 안되는 것임.
            //id라는 변수의 값이 모든 Knight 객체마다 다 다를수 있는데 id를 어떻게 알고 어떤 애의 객체를 참조해야 할지 알고 접근을 하겠음?
        }

        static public void Test4()
        {
            //static함수 안에서는 static변수만 사용 가능
            counter++;
        }

        static public Knight CreateKnight()
        {
            //오해할까봐 그러는데, static을 붙였다고 해서, 일반 인스턴스에 접근 못하는 건 아니다..!

            //hp나 attack에 접근하기 위해서 인스턴스화한 새로운 객체를 생성했다. 
            Knight knight = new Knight();
            knight.hp = 100;
            knight.attack = 1;

            return knight;
        }

        public void Move()
        {
            Console.WriteLine("Knight Move");
        }

        public void Attack()
        {
            Console.WriteLine("Knight Attack");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            //static함수 같은 경우, class Knight에 종속되어 있기 때문에,
            //class Knight를 통해 바로 호출할 수 있다.
            Knight.CreateKnight();

            //public void Move(), public void Attack() 같이 인스턴스화한 객체에 종속적인 함수들은 
            //class Knight로 호출할 수 없다.
            //Knight.Move(); <--------- 불가능 (빨간줄이 뜬다)

            //static 함수
            Knight knight100 = Knight.CreateKnight();
            
            //일반 함수
            knight100.Move();

            //일반 함수
            Knight knight101 = new Knight();
            knight101.Move();

            //얘도 대표적인 static 함수 (왜냐하면 class Console로 바로 접근해서 함수 WriteLine를 바로 사용하기 때문)(인스턴스화한 객체 없이)
            Console.WriteLine();

            //static 함수가 아닌 일반 함수 (왜냐하면 class Random으로 바로 접근하는 것이 아닌, 인스턴스화한 객체를 새로 만들어서 함수 Next를 불러오기 때문) 
            Random rand = new Random();
            rand.Next();
        }
    }
}
728x90