[C#] Static

21044 단어 C# 문법C# 문법

static 이란 무엇인가?

static은 변수나 메소드에 키워드로 사용된다.

static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성이 된다. 즉, 인스턴스(객체) 생성 없이 바로 사용가능 하다.

그러므로, 객체를 생성하지 않아도 되니까 편리하고 속도도 빠르다.

static 키워드를 사용하는 이유는?

자주 변하지 않는 일정한 값이나 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어들이는 것보다 비용도 줄이고 효율을 높일 수있다.
(일종의 전역변수와 같은 개념을 통해서 접근하는 것)

인스턴스 생성 없이 바로 사용가능 하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리 할 때 이용한다.

사용 예

	class TreeNode<T>
    {
        public T Data { get; set; }
        public List<TreeNode<T>> Children { get; set; } = new List<TreeNode<T>>();
        
        static public TreeNode<string> MakeTree()
        {
            TreeNode<string> root = new TreeNode<string>() { Data = "R1 개발실" };
            {
                {
                    TreeNode<string> node = new TreeNode<string>() { Data = "디자인팀" };
                    node.Children.Add(new TreeNode<string>() { Data = "전투" });
                    node.Children.Add(new TreeNode<string>() { Data = "경제" });
                    node.Children.Add(new TreeNode<string>() { Data = "스토리" });
                    root.Children.Add(node);
                }
                {
                    TreeNode<string> node = new TreeNode<string>() { Data = "프로그래밍팀" };
                    node.Children.Add(new TreeNode<string>() { Data = "서버" });
                    node.Children.Add(new TreeNode<string>() { Data = "클라" });
                    node.Children.Add(new TreeNode<string>() { Data = "엔진" });
                    root.Children.Add(node);
                }
                {
                    TreeNode<string> node = new TreeNode<string>() { Data = "아트팀" };
                    node.Children.Add(new TreeNode<string>() { Data = "배경" });
                    node.Children.Add(new TreeNode<string>() { Data = "캐릭터" });
                    root.Children.Add(node);
                }
            }
            return root;
        }

        static public void PrintTree(TreeNode<string> root)
        {
            Console.WriteLine(root.Data);

            foreach (TreeNode<string> child in root.Children)
                PrintTree(child);
        }
        static public int GetHeight(TreeNode<string> root)
        {
            int height = 0;

            foreach (TreeNode<string> child in root.Children)
            {
                int newHeight = GetHeight(child) + 1;
                height = Math.Max(height, newHeight);
            }

            return height;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            TreeNode<string> root = TreeNode<string>.MakeTree();
            TreeNode<string>.PrintTree(root);
            Console.WriteLine(TreeNode<string>.GetHeight(root));
        }
    }

이 코드에서 TreeNode클래스의 함수들을 static 없이 구현한다면

static void Main(string[] args)
{
    TreeNode<string> root = new TreeNode<string>();
	root.PrintTree(root);
	Console.WriteLine();
	Console.WriteLine(root.GetHeight(root));
}

와 같이 함수를 호출할 때 root가 여러번 작성되는 불편함이 있다.

함수의 형태를 변형하여 인자를 받지 않고 TreeNode클래스의 변수에 바로 접근하여 함수를 작성하면 되겠지만, 해당 함수는 재귀함수의 형태로 작성되어있기 때문에 인자 없이 작성이 불가능하여 static을 이용해 코드를 작성하는 것이 깔끔하다.

static 정리

모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다.

  • 인스턴스를 생성하게되면 각 인스턴스들을 서로 독립적이기 때문에 서로 다른 값을 유지한다.

  • 하지만 인스턴스들이 공통적으로 같은 값을 유지해야 하는 경우 static을 붙이면 관리가 편리하다.

static이 붙은 멤버변수는 인스턴스를 생성하지 않아도 사용할 수 있다.

  • static이 붙은 멤버변수는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문이다.

static이 붙은 함수에서는 인스턴스 변수를 사용할 수 없다.

  • static이 붙은 함수는 인스턴스 생성 없이 호출가능한 반면, 인스턴스 변수는 인스턴스를 생성해야만 존재한다.

  • 그러므로 static이 붙은 함수(클래스메소드)를 호출 할 때 인스턴스가 생성되어 있을 수도, 그렇지 않을 수도 있어서 static이 붙은 메소드에서 인스턴스 변수 사용을 허용하지 않는다.

  • 반대로, 인스턴스 변수나 인스턴스 함수에서는 static이 붙은 멤버들을 사용하는 것이 언제나 가능하다. 인스턴스 변수가 존재한다는 것은 static이 붙은 변수가 이미 메모리에 존재한다는 것을 의미하기 때문이다.

함수 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

  • 함수의 작업 내용중에서 인스턴스 변수를 필요로 한다면, static을 붙일 수 없다.

  • 반대로 인스턴스 변수를 필요로 하지 않는다면, 가능하면 static을 붙이는 것이 좋다. 함수 호출시간이 짧아지기 때문에 효율이 높아진다.

좋은 웹페이지 즐겨찾기