Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 정적 생성자와 인스턴스 생성자의 차이점 완벽 정리

C#에서 생성자는 크게 정적 생성자(Static Constructor)인스턴스 생성자(Instance Constructor) 두 가지로 나눌 수 있습니다. 두 생성자는 호출 시점과 역할이 완전히 다르기 때문에, 이 차이를 정확히 이해하는 것이 중요합니다.

정적 생성자(Static Constructor)란?

정적 생성자는 static 한정자를 사용하여 선언한 생성자입니다. 클래스에 처음 접근하는 시점에 단 한 번만 실행되며, 클래스의 전체 수명 주기 동안 다시 호출되지 않습니다. 주로 정적 필드를 초기화하거나 클래스 수준의 초기화 작업을 수행할 때 사용됩니다.

정적 생성자의 특징은 다음과 같습니다.

  • 접근 제한자(public, private 등)를 사용할 수 없습니다.
  • 매개변수를 가질 수 없으므로 오버로딩이 불가능합니다.
  • 개발자가 직접 호출할 수 없으며, CLR(공용 언어 런타임)이 자동으로 호출합니다.

인스턴스 생성자(Instance Constructor)란?

인스턴스 생성자는 객체의 인스턴스 데이터를 초기화하는 생성자입니다. new 키워드로 클래스의 객체를 생성할 때마다 호출되며, 하나의 클래스에 여러 개의 인스턴스 생성자를 오버로딩하여 정의할 수 있습니다.

아래 예제를 통해 정적 생성자와 인스턴스 생성자의 차이를 확인해 보겠습니다.

예제 코드

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

namespace Difference {
   class Demo {
      static int val1;
      int val2;

      // 정적 생성자
      static Demo() {
         Console.WriteLine("This is Static Constructor");
         val1 = 70;
      }

      // 인스턴스 생성자
      public Demo(int val3) {
         Console.WriteLine("This is Instance Constructor");
         val2 = val3;
      }

      private void show() {
         Console.WriteLine("First Value = " + val1);
         Console.WriteLine("Second Value = " + val2);
      }

      static void Main(string[] args) {
         Demo d1 = new Demo(110);
         Demo d2 = new Demo(200);
         d1.show();
         d2.show();
         Console.ReadKey();
      }
   }
}

실행 결과

This is Static Constructor
This is Instance Constructor
This is Instance Constructor
First Value = 70
Second Value = 110
First Value = 70
Second Value = 200

결과 분석

실행 결과를 보면 알 수 있듯이, "This is Static Constructor" 메시지는 단 한 번만 출력됩니다. 이는 첫 번째 객체 d1이 생성되기 전에 정적 생성자가 실행되었음을 의미합니다.

반면, "This is Instance Constructor" 메시지는 객체를 생성할 때마다 출력됩니다. 즉, d1d2 두 개의 객체를 생성했기 때문에 인스턴스 생성자가 두 번 호출된 것입니다.

또한 정적 필드 val1은 모든 객체가 값을 공유하기 때문에 항상 70으로 출력되지만, 인스턴스 필드 val2는 각 객체마다 별도로 존재하므로 110200이라는 서로 다른 값이 출력됩니다.

핵심 요약

  • 정적 생성자: 클래스당 한 번만 실행되며, 정적 멤버 초기화에 사용됩니다.
  • 인스턴스 생성자: 객체가 생성될 때마다 호출되며, 인스턴스 멤버를 초기화합니다.
  • 정적 필드는 모든 객체가 공유하고, 인스턴스 필드는 객체별로 독립적으로 유지됩니다.