NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 20. 속성. (Property)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 오늘은 속성에 대해 알아보겠습니다. 속성은 전용 필드의 값을 읽거나 쓰는데 사용하는 메서드입니다. 이 메서드는 일반적인 메서드와는 다른데요. 좀 더 유연하게 프로그래밍 할 수 있는 특수한 형태의 메서드로 이해하면 될거 같습니다.

     

    일반적인 형태의 속성은 아래와 같이 표현합니다.

    Program.cs

    using System;
     
    namespace Property
    {
        class BirthdayInfo
        {
            #region Fields        
     
            private string name;
            private DateTime birthday;
     
            #endregion
     
            #region Properties        
     
            public string Name { get { return name; } set { name = value; } }
            public DateTime Birthday { get { return birthday; } set { birthday = value; } }
            /// <summary>        
            /// ReadOnly Property        
            /// </summary>        
            public int Age { get { return new DateTime(DateTime.Now.Subtract(birthday).Ticks).Year; } }
     
            #endregion
        }
        class Program
        {
            static void Main(string[] args)
            {
                BirthdayInfo birthdayInfo = new BirthdayInfo();
                birthdayInfo.Name = "소심비형";
                birthdayInfo.Birthday = new DateTime(1989, 12, 22);
                Console.WriteLine($"Name: {birthdayInfo.Name}");
                Console.WriteLine($"Birthday: {birthdayInfo.Birthday.ToLongDateString()}");
                Console.WriteLine($"Age: {birthdayInfo.Age}");
                Console.ReadKey();
            }
        }
    }
    

     

     

    위 16~34라인과 같이 내부 필드 데이타를 읽거나 쓸 때 속성을 사용합니다. 물론, 31라인처럼 데이타를 계산하여 반환할수도 있죠. 31라인의 Age의 경우에는 get만 존재하므로 읽기 전용 속성입니다. 아래와 같이 생성자를 생략하고 초기화 할 수도 있습니다.

    BirthdayInfo birthdayInfo = new BirthdayInfo { Name = "소심비형", Birthday = new DateTime(1989, 12, 22) };

     

     

    위 문법은 클래스 생성과는 약간 다릅니다. 클래스명 뒤에 "()"를 생략해도 되죠. 물론, 붙여도 정상적으로 동작됩니다. 이렇게 약식 표현으로 처리해도 됩니다. 또한, 특별히 데이타 처리에 있어서 필드를 사용할 필요가 없다면 속성도 약식 표현이 가능합니다.

    Program.cs

    using System;
    namespace Property
    {
        class BirthdayInfo
        {
            #region Fields        
            // 이런 불필요한 필드는 사용하지 않는게 좋다.        
            //private string name;        
            //private DateTime birthday;        
            #endregion
     
            #region Properties        
            public string Name { get; set; }
            public DateTime Birthday { get; set; }
            /// <summary>        
            /// ReadOnly Property        
            /// </summary>        
            public int Age { get { return new DateTime(DateTime.Now.Subtract(Birthday).Ticks).Year; } }
            #endregion
        }
        class Program
        {
            static void Main(string[] args)
            {
                BirthdayInfo birthdayInfo = new BirthdayInfo { Name = "소심비형", Birthday = new DateTime(1989, 12, 22) };
                Console.WriteLine($"Name: {birthdayInfo.Name}");
                Console.WriteLine($"Birthday: {birthdayInfo.Birthday.ToLongDateString()}");
                Console.WriteLine($"Age: {birthdayInfo.Age}");
                Console.ReadKey();
            }
        }
    }

     

     

    필드 맴버를 생성하지 않고, 속성에서 get, set만 정의합니다. 이렇게 단순 데이타만을 저장할 때는 필드를 만들 필요가 없습니다. 응용 프로그램의 복잡도를 높이는 주요 원인중에 하나가 바로 무분별한 필드의 생성이죠. 필드가 많아질수록 복잡도는 증가하고 가독성은 떨어집니다. 더 좋은 코드를 작성하려면 필드는 사용하지 않는게 좋습니다.

    필드가 많아질수록 네이밍하기도 어려워져서 나중에는 비슷한 이름을 사용하거나 접미사로 숫자를 붙이는 개발자를 종종 보게 됩니다. 가급적이면 다른 사람이 봐도 이해할 수 있는 이름을 지어주세요.

     

    C#에서는 이런 형식을 자동 구현 속성(Auto-Implemented Property)이라고 부릅니다. C# 3.0에 새롭게 추가되었기에 이전 버전의 .NET은 사용할 수 없습니다. 내부 필드가 없이 만들어지는 속성은 컴파일러가 자동으로 익명 필드를 만들고 데이타를 읽거나 쓸 수 있는 메커니즘을 제공합니다.

    아래 코드와 같이 C# 6.0 부터는 자동 구현 속성을 바로 초기화 할 수 있습니다.

    Program.cs

    using System;
    namespace Property
    {
        class BirthdayInfo
        {
            #region Fields        
            // 이런 불필요한 필드는 사용하지 않는게 좋다.        
            //private string name;        
            //private DateTime birthday;        
            #endregion
     
            #region Properties        
            public string Name { get; set; } = "소심비형";
            public DateTime Birthday { get; set; } = new DateTime(1989, 12, 22);
            /// <summary>        
            /// ReadOnly Property        
            /// </summary>        
            public int Age
            {
                get { return new DateTime(DateTime.Now.Subtract(Birthday).Ticks).Year; }
            }
            #endregion
        }
        class Program
        {
            static void Main(string[] args)
            {
                BirthdayInfo birthdayInfo = new BirthdayInfo();
                Console.WriteLine($"Name: {birthdayInfo.Name}");
                Console.WriteLine($"Birthday: {birthdayInfo.Birthday.ToLongDateString()}");
                Console.WriteLine($"Age: {birthdayInfo.Age}");
                Console.ReadKey();
            }
        }
    }
    

     

     

    마지막으로 익명 형식의 속성입니다. 익명 형식은 주로 Linq Expression에서 사용됩니다. 자세한 내용은 Linq관련 글에서 다루도록 하겠습니다. 익명 형식은 아래 예제를 통해 확인할 수 있습니다.

    Program.cs

    using System;
     
    namespace AnonymousType
    {
        class Program
        {
            static void Main(string[] args)
            {
                var a = new { Name = "소심비형", Age = 27 };
                Console.WriteLine($"Name: {a.Name}, Age: {a.Age}");
                var b = new { Subject = "수학", Scores = new int[] { 50, 60, 70, 80, 90 } };
                Console.Write($"Subject: {b.Subject}, Scores: {string.Join(", ", b.Scores)}");
                Console.ReadKey();
            }
        }
    }
    

     

     

    결과는 아래와 같습니다.

    p6TuYCb.png

     

     

    익명 형식은 말 그대로 이름이 없는 형식을 나타냅니다. 그리고, 형식이 없기 때문에 var 또는 dynamic 형식을 사용하게 됩니다. 지금은 익명 형식의 속성을 초기화 하는 방법만 확인하고 그 외에 내용들은 각각의 글에서 다루도록 하겠습니다.

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.