C# 정적 생성자와 기본 생성자 호출 순서

조회수 1353회
class Person
{
    static public Person Instance = new Person("Jong");
    string name;

    static Person()
    {
        Console.WriteLine("static Person() Called!");
    }
   public Person(string _name)
    {
        name = _name;
        Console.WriteLine("Person Called!");
    }
    public void DisplayName()
    {
        Console.WriteLine(name);
    }

}
class Program
{
    static void Main(string[] args)
    {
        Person nPerson = new Person("ABCD");

    }
}

C# 7.1 책 기준으로 클래스의 정적 필드의 경우 선언과 동시에 초기화 구문이 있을 경우, 컴파일러가 선언부만 남겨두고, 초기화 구문은 정적 생성자가 없을 경우는 생성, 있을 경우는 그 정적 생성자와 병합하여 코드가 생성되어 컴파일 된다고 적혀있습니다.

그리고 정적 멤버를 처음 호출하거나, 인스턴스 생성자로 생성되어질 경우 정적 생성자가 인스턴스 생성자보다 우선적으로 실행된다고 하더라구요.

위 코드에서 정적 생성자가 언제 호출됬는지를 알아보기 위해

Console.WriteLine("static Person Called!");

이라는 코드를 넣어놨는데

static public Person Instance = new Person("Jong");

위 코드의 초기화 부분인 new Person("Jong") 소스 코드가 정적 생성자와 병합되어 실행되는데, 실행 결과를 보니 Instance의 인스턴스 생성자 실행 -> Person의 정적 생성자 실행 -> nPerson의 인스턴스 생성자 실행 이더라구요.

그러면 소스코드가 아래와 같이 병합된건가요 ?

  static Person()
  {
       Instance = new Person("Jong");
       Console.WriteLine("static Person() Called!");
  }

그러면 정적 생성자 안의 어떠한 코드가 있어도, 병합될때 초기화 구문은 항상 기존의 코드보다 우선순위로 삽입되는건가요 ?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 네 맞습니다.
    무엇이 프로그래머 입장에서 직관적인지 생각해보시면 순서도 유추할 수 있습니다.
    만약 정적 생성자의 코드가 정적 필드 초기화보다 먼저 수행된다면 정적 생성자에서 필드 초기화에 쓰인 값을 사용할 수 없을 것입니다.
    int a = 42;라고 했는데 a의 값을 읽으니 0이 나왔다면 저는 프로그래밍을 안했을겁니다.
    때문에 순서는

    1. 정적 필드 초기화
    2. 정적 생성자
    3. 일반 필드 초기화
    4. 일반 생성자

    이렇게 됩니다. 필드 초기화 코드가 생성자의 코드보다 먼저 수행된다는 내용은 공식 문서에서도 확인하실 수 있습니다.

    필드는 개체 인스턴스에 대한 생성자를 호출 하기 직전에 초기화됩니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 아, 맞네요. 쓰인 값을 사용할 수 없어버리네요. 단순한데 생각을 너무 꽉 막혀서 했네요. 정말 감사합니다. 알 수 없는 사용자 2019.1.26 17:28

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)