Property 초기화 하는 방법은 어떻게 하나요?

안녕하세요.

Property 초기화하는 기준을 알고 싶어 질문을 올립니다.

  1. 생성자를 통해 Property를 초기화를 해야 하는지 아니면 Property 선언시 초기화를 넣는게 좋은건가요?

  2. 두가지 방법다 동일하게 수행하는 걸까요? (만약, 다르다면 예를 같이 들어주시면 좋을 것 같아요)

  3. 그 외 더 효율적인 초기화 하는 방법이 있을까요?

아래 예를 작성해두었습니다.
1.

public class Person 
{
    public string name { get; set; }

    public Person()
    {
         this.name = string.Empty;
    }
}
  1. public class Person 
    {
        public string name { get; set; } = string.Empty;
    }
    
1 Like

둘 다 상관이 없습니다. 단지 다음의 관점으로 이해하는게 좋습니다.

public string name { get; set; } = string.Empty;

이 방식은 초기화 인자없이 초기화 해야 하는 경우 유용합니다. 기본값 개념입니다.

    public Person()
    {
         this.name = string.Empty;
    }

위의 예는 초기값을 설정하는 동일한 방식이나 생성자 인자를 통해 초기화 할 기회가 주어집니다. 즉, 생성자 인자가 없을 경우 첫번째 방법의 자동 속성 초기자의 형태가 좋습니다.

생성자 인자와 상관없이 생성자에서 속성을 초기화 해야 하는 이유가 하나 더 있습니다. 속성 끼리 관계를 가지는 경우인데요, 다음의 예로 살펴볼 수 있습니다.

    public Person()
    {
         this.Driver = new DefaultDriver();
         this.DriverDecorator = new DriverDecorator(this.Driver);
    }

초기화 되는 순서는 자동 속성 → 생성자 순입니다.

2 Likes

머신 책 읽어Dream (daum.net)

effective C# 3판에서 14장 보시면 조금은 도움이 되실 겁니다.

2 Likes

일단 틀린 용어가 있습니다. 제가 잘못 아는 것일 수도 있지만…

맴버변수가 아니라 Property 입니다. 맴버변수는 Field라고도 불리며 뒤에 { get; set; } 이 붙지 않습니다.
정말 메모리 공간 그 자체가 있는 것이고, get set에 대해서 특정 동작을 할 수 없습니다.

따라서 다음과 같습니다.

public string MyName { get; set; }

private string _MyName;

public string MyName
{
    get => _MyName;
    set
    {
         _MyName = value;
    }
}

입니다. private에 '_'가 붙어 있는 것을 Backing Field 라고 합니다.

왜 Property가 중요하냐면, Interface라는 것 때문입니다. Field는 Interface를 통해 다형성 제공을 할 수 없고, Property는 GetValue, SetValue Method 개념이기 때문에 다형성 제공이 가능합니다.

그리고 개인적으로 생성자라는 Return 형이 없고 클래스와 이름이 같은 함수는 '초기화’의 기능을 담당합니다. 이 생성자는 작성하신 Custom Class를 재귀적으로 하여 Class가 상속하고 있는 생성자를 재귀적으로 호출하며 Object의 생성자까지 타고 올라가서 호출하게 됩니다.

C#에서 문법적으로 편리하게 제공은 하지만, 생성자에서 초기화를 명시적으로 적어주는 것이 추후 유지보수 할 때는 좋다고 생각합니다.

물론 간단하고 빠르게 만들고 수정이 빈번하지 않는 작업을 한다면 문법에서 제공하는 편의도 이용하는 것이 현명하다고 생각합니다.

2 Likes

제목 및 내용 수정했습니다!

1 Like