Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
07-05 07:53
관리 메뉴

nomad-programmer

[Programming/C#] 자동 구현 프로퍼티 본문

Programming/C#

[Programming/C#] 자동 구현 프로퍼티

scii 2020. 9. 12. 03:18

프로퍼티는 데이터의 오염에 대해선 메소드처럼 안전하고, 데이터를 다룰 때는 필드처럼 간결하다. 하지만 많은 경우 중복된 코드를 작성하고 있다는 기분이 들게 된다.
다음 코드의 NameCard 클래스를 보면 Name과 PhoneNumber 프로퍼티는 단순히 name과 phoneNumber 필드를 읽고 쓰기만 하고 있다. 여기에는 아무 논리도 섞여 있지 않다.
이런 경우 C# 언어는 더 단순하게 만드는 "자동 구현 프로퍼티 (Auto-Implemented Property)" 를 C# 3.0 때 도입했다.

public class NameCard
{
    private string name;
    private string phoneNumber;
    
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    
    public string PhoneNumber
    {
        get { return phoneNumber; }
        set { phoneNumber = value; }
    }
}

위의 코드에서 Name과 PhoneNumber 프로퍼티는 다음과 같이 자동 구현 프로퍼티로 대체힐 수 있다.

public class NameCard
{
    public string Name { get; set; }
    public string PhoneNumber { get; set; }
}

필드를 선언할 필요도 없고 그저 get 접근자와 set 접근자 뒤에 세미 콜론만 붙여주면 된다. 그리고 C# 7.0 부터는 다음과 같이 자동 구현 프로퍼티를 선언과 동시에 초기화를 수행할 수 있다. 덕분에 자동 구현 프로퍼티에 초기값이 필요할 때 생성자에 초기화 코드를 작성하는 것을 하지 않아도 된다.

public class NameCard
{
    public string Name { get; set; } = "unknown";
    public string PhoneNumber { get; set; } = "000-0000";
}

자동 구현 프로퍼티 예제

using System;
using System.Data;

namespace CSharpExample
{
    class BirthdayInfo
    {
        // 아래처럼 구현하면 생성자에서 초기화를 진행해야 한다.
        //public string Name { get; set }
        // 자동 구현 프로퍼티 초기화
        public string Name { get; set; } = "unknown";
        public DateTime Birthday { get; set; } = new DateTime(1, 1, 1);
        public int Age
        {
            get
            {
                return new DateTime(DateTime.Now.Subtract(Birthday).Ticks).Year;
            }
        }
    }

    class MainApp
    {
        static int Main(string[] args)
        {
            BirthdayInfo birth = new BirthdayInfo();
            Console.WriteLine($"Name : {birth.Name}");
            Console.WriteLine($"Birthday : {birth.Birthday.ToShortDateString()}");
            Console.WriteLine($"Age : {birth.Age}");

            birth.Name = "헬로월드";
            birth.Birthday = new DateTime(1991, 6, 28);

            Console.WriteLine($"Name : {birth.Name}");
            Console.WriteLine($"Birthday : {birth.Birthday.ToShortDateString()}");
            Console.WriteLine($"Age : {birth.Age}");

            return 0;
        }
    }
}


/* 결과

Name : unknown
Birthday : 0001-01-01
Age : 2020
Name : 헬로월드
Birthday : 1991-06-28
Age : 30

*/

자동 구현 프로퍼티의 뒤에서 일어나는 일

Developer Command Prompt For VS 2019 터미널에서 ildasm.exe (IL Deassembler) 를 실행한 후 컴파일한 exe 파일을 열면 아래 사진과 같이 나온다.

ildasm.exe 실행 결과

k__BackingField 는 C# 컴파일러가 자동으로 구현해준 코드이다.
<Birthday>K__BackingField는 Birthday 프로퍼티를 위해, <Name>k__BackingField는 Name 프로퍼티를 위해 컴파일러가 물밑에서 선언해 준 것이다. 덕분에 한결 편한 프로그래밍을 할 수 있게 된다.

Comments