아카이빙/C#

[C#] 프로퍼티

셩님 2018. 6. 20. 02:55

[C#] 프로퍼티

  • 클래스를 작성하다보면 private 필드를 선언해야할 경우가 많다.

  • 이 private 필드를 다른 클래스에서 접근하게 하려면 getter, setter 메소드를 따로 정의해 줘야 하는 데 여간 귀찮은 일이 아닐 수 없다.

class MyClass
{
   private int myInt;
   public int GetMyInt()
  {
       return myInt;
  }
   
   public void SetMyInt(int newInt)
  {
       this.myInt = newInt;
  }
}

class MainApp
{
   static void Main()
  {
       MyClass instance = new MyClass();
       instance.SetMyInt(5);

       Console.WriteLine(instance.GetMyInt());
  }
}
  • C#에서는 이 귀찮음을 조금 더 우아하게 다루기 위해서 프로퍼티라는 개념을 가져온다.


프로퍼티의 선언

class 클래스이름
{
   데이터타입 필드이름;
   접근한정자 데이터타입 프로퍼티이름;
  {
       get
      {
           return 필드이름;
      }
       set
      {
           필드이름 = value;
      }
  }
}
  • set에서 value라는 변수는 어디에서도 선언되지 않았지만, 암묵적으로 매개변수로 간주한다.

  • 위의 코드를 프로퍼티로 선언하면 다음과 같다.


class MyClass
{
   private int myInt;
   public int MyInt
  {
       get
      {
           return myInt;
      }
       set
      {
           this.myInt = value;
      }
  }
}

class MainApp
{
   static void Main()
  {
       MyClass instance = new MyClass();
       instance.MyInt = 5;

       Console.WriteLine(instance.MyInt);
  }
}
  • '=' 연산자를 통해 setter처럼 활용할 수 있다.

class MyClass
{
   private int myInt;
   public int MyInt
  {
       get
      {
           return myInt;
      }
  }
}
  • set 접근자를 구현하고 싶지 않으면 get만 정의할 수 도 있다.


자동 구현 프로퍼티

class MyClass
{
   public int MyInt
  {
       get; set;
  }
}

class MainApp
{
   static void Main()
  {
       MyClass instance = new MyClass();
       instance.MyInt = 5;

       Console.WriteLine(instance.MyInt);
  }
}
  • 프로퍼티를 활용하더라도 중복된 코드를 작성한다는 느낌이 있다.

  • 이를 위해 C# 3.0 부터 자동구현 프로퍼티 기능이 도입되었다.


프로퍼티 종합 예제

using System;

class BirthdayInfo
{
   public string Name
  {
       get; set;
  }

   public DateTime Birthday
  {
       get; set;
  }

   public int Age
  {
       get
      {
           return new DateTime(DateTime.Now.Subtract(Birthday).Ticks).Year;
      }
  }

   public override string ToString()
  {
       return string.Format("Name : {0}\nBirthDay : {1}\nAge : {2}",
           Name, Birthday.ToShortDateString(), Age
      );
  }
}

class MainApp
{
   static void Main()
  {
       BirthdayInfo birth = new BirthdayInfo();
       birth.Name = "셩님";
       birth.Birthday = new DateTime(1990, 3, 18);

       Console.WriteLine(birth);
  }
}

참조

  • 뇌를 자극하는 C# 5.0 프로그래밍, 박상현, 한빛미디어 


'아카이빙 > C#' 카테고리의 다른 글

[C#] 인덱서  (0) 2018.06.20
[C#] System.Array  (0) 2018.06.20
[C#] 추상클래스와 인터페이스  (0) 2018.06.18
[C#] 여러 인터페이스의 멤버를 명시적 구현  (0) 2018.06.18
[C#] 인터페이스 다중 상속  (0) 2018.06.18