속성(C# 프로그래밍 가이드)Properties (C# Programming Guide)

속성은 전용 필드의 값을 읽거나 쓰거나 계산하는 유연한 메커니즘을 제공하는 멤버입니다.A property is a member that provides a flexible mechanism to read, write, or compute the value of a private field. 공용 데이터 멤버인 것처럼 속성을 사용할 수 있지만, 실제로 접근자라는 특수 메서드입니다.Properties can be used as if they are public data members, but they are actually special methods called accessors. 이렇게 하면 데이터에 쉽게 액세스할 수 있으며 메서드의 안전성과 유연성 수준을 올리는 데에도 도움이 됩니다.This enables data to be accessed easily and still helps promote the safety and flexibility of methods.

속성 개요Properties overview

  • 속성을 사용하면 클래스가 구현 또는 검증 코드를 숨기는 동시에 값을 가져오고 설정하는 방법을 공개적으로 노출할 수 있습니다.Properties enable a class to expose a public way of getting and setting values, while hiding implementation or verification code.

  • get 속성 접근자는 속성 값을 반환하는 데 사용되고 set 속성 접근자는 새 값을 할당하는 데 사용됩니다.A get property accessor is used to return the property value, and a set property accessor is used to assign a new value. 이러한 접근자는 각기 다른 액세스 수준을 가질 수 있습니다.These accessors can have different access levels. 자세한 내용은 접근자 액세스 가능성 제한을 참조하세요.For more information, see Restricting Accessor Accessibility.

  • value 키워드는 set 접근자가 할당하는 값을 정의하는 데 사용됩니다.The value keyword is used to define the value being assigned by the set accessor.

  • 속성은 읽기/쓰기(getset 접근자 모두 포함), 읽기 전용(get 접근자는 포함하지만 set 접근자는 포함 안 함) 또는 쓰기 전용(set 접근자는 포함하지만 get 접근자는 포함 안 함)일 수 있습니다.Properties can be read-write (they have both a get and a set accessor), read-only (they have a get accessor but no set accessor), or write-only (they have a set accessor, but no get accessor). 쓰기 전용 속성은 거의 없으며 주로 중요한 데이터에 대한 액세스를 제한하는 데 사용됩니다.Write-only properties are rare and are most commonly used to restrict access to sensitive data.

  • 사용자 지정 접근자 코드가 필요 없는 단순한 속성은 식 본문 정의나 자동 구현 속성으로 구현할 수 있습니다.Simple properties that require no custom accessor code can be implemented either as expression body definitions or as auto-implemented properties.

지원 필드가 있는 속성Properties with backing fields

속성을 구현하는 한 가지 기본 패턴에는 private 지원 필드를 사용하여 속성 값을 설정 및 검색하는 작업이 포함됩니다.One basic pattern for implementing a property involves using a private backing field for setting and retrieving the property value. get 접근자는 private 필드의 값을 반환하고 set 접근자는 private 필드에 값을 할당하기 전에 데이터 유효성 검사를 수행할 수 있습니다.The get accessor returns the value of the private field, and the set accessor may perform some data validation before assigning a value to the private field. 또한 두 접근자 모두 데이터를 저장 또는 반환하기 전에 데이터에 대한 변환이나 계산을 수행할 수도 있습니다.Both accessors may also perform some conversion or computation on the data before it is stored or returned.

다음 예제에서 이 방법을 보여 줍니다.The following example illustrates this pattern. 이 예제에서 TimePeriod 클래스는 시간 간격을 나타냅니다.In this example, the TimePeriod class represents an interval of time. 내부적으로 이 클래스는 _seconds라는 private 필드에 시간 간격을 초 단위로 저장합니다.Internally, the class stores the time interval in seconds in a private field named _seconds. Hours라는 읽기/쓰기 속성을 사용하면 고객이 시간 간격을 시간 단위로 지정할 수 있습니다.A read-write property named Hours allows the customer to specify the time interval in hours. getset 접근자 모두 필요에 따라 시간 및 초 간의 변환을 수행합니다.Both the get and the set accessors perform the necessary conversion between hours and seconds. 또한 set 접근자는 데이터의 유효성을 검사하고 시간(시)이 잘못된 경우 ArgumentOutOfRangeException을 throw합니다.In addition, the set accessor validates the data and throws an ArgumentOutOfRangeException if the number of hours is invalid.

using System;

class TimePeriod
{
   private double _seconds;

   public double Hours
   {
       get { return _seconds / 3600; }
       set { 
          if (value < 0 || value > 24)
             throw new ArgumentOutOfRangeException(
                   $"{nameof(value)} must be between 0 and 24.");

          _seconds = value * 3600; 
       }
   }
}

class Program
{
   static void Main()
   {
       TimePeriod t = new TimePeriod();
       // The property assignment causes the 'set' accessor to be called.
       t.Hours = 24;

       // Retrieving the property causes the 'get' accessor to be called.
       Console.WriteLine($"Time in hours: {t.Hours}");
   }
}
// The example displays the following output:
//    Time in hours: 24

식 본문 정의Expression body definitions

속성 접근자는 식의 결과를 할당하거나 반환하기만 하는 한 줄로 된 문으로 구성되는 경우가 많습니다.Property accessors often consist of single-line statements that just assign or return the result of an expression. 이러한 속성은 식 본문 멤버로 구현할 수 있습니다.You can implement these properties as expression-bodied members. 식 본문 정의는 => 기호와 속성에 할당하거나 속성에서 검색할 식으로 구성됩니다.Expression body definitions consist of the => symbol followed by the expression to assign to or retrieve from the property.

C# 6부터 읽기 전용 속성에서 get 접근자를 식 본문 멤버로 구현할 수 있습니다.Starting with C# 6, read-only properties can implement the get accessor as an expression-bodied member. 이 경우 get 접근자 키워드나 return 키워드를 모두 사용하지 않습니다.In this case, neither the get accessor keyword nor the return keyword is used. 다음 예제에서는 읽기 전용 Name 속성을 식 본문 멤버로 구현합니다.The following example implements the read-only Name property as an expression-bodied member.

using System;

public class Person
{
   private string _firstName;
   private string _lastName;
   
   public Person(string first, string last)
   {
      _firstName = first;
      _lastName = last;
   }

   public string Name => $"{_firstName} {_lastName}";   
}

public class Example
{
   public static void Main()
   {
      var person = new Person("Isabelle", "Butts");
      Console.WriteLine(person.Name);
   }
}
// The example displays the following output:
//      Isabelle Butts

C# 7.0부터 getset 접근자 모두를 식 본문 멤버로 구현할 수 있습니다.Starting with C# 7.0, both the get and the set accessor can be implemented as expression-bodied members. 이 경우 getset 키워드가 있어야 합니다.In this case, the get and set keywords must be present. 다음 예제에서는 두 접근자에 대해 식 본문 정의를 사용하는 방법을 보여 줍니다.The following example illustrates the use of expression body definitions for both accessors. return 키워드는 get 접근자와 함께 사용하지 않습니다.Note that the return keyword is not used with the get accessor.

using System;

public class SaleItem
{
   string _name;
   decimal _cost;
   
   public SaleItem(string name, decimal cost)
   {
      _name = name;
      _cost = cost;
   }

   public string Name 
   {
      get => _name;
      set => _name = value;
   }

   public decimal Price
   {
      get => _cost;
      set => _cost = value; 
   }
}

class Program
{
   static void Main(string[] args)
   {
      var item = new SaleItem("Shoes", 19.95m);
      Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
   }
}
// The example displays output like the following:
//       Shoes: sells for $19.95



자동으로 구현된 속성Auto-implemented properties

경우에 따라 get 속성과 set 접근자에서 지원 필드에 값을 할당하거나 지원 필드에서 값을 검색하기만 하고 추가 논리를 포함하지 않을 수 있습니다.In some cases, property get and set accessors just assign a value to or retrieve a value from a backing field without including any additional logic. 자동 구현 속성을 사용하면 코드를 간소화할 수 있을 뿐 아니라 C# 컴파일러에서 지원 필드를 투명하게 제공하도록 할 수 있습니다.By using auto-implemented properties, you can simplify your code while having the C# compiler transparently provide the backing field for you.

속성에 getset 접근자가 모두 포함된 경우 두 접근자를 모두 자동 구현해야 합니다.If a property has both a get and a set accessor, both must be auto-implemented. 구현을 제공하지 않고 getset 키워드를 사용하여 자동 구현 속성을 정의합니다.You define an auto-implemented property by using the get and set keywords without providing any implementation. 다음 예제에서는 NamePrice가 자동 구현 속성인 점만 제외하고 이전 예제와 동일합니다.The following example repeats the previous one, except that Name and Price are auto-implemented properties. 이 예제에서는 매개 변수화된 생성자도 제거하므로 이제 SaleItem 개체가 매개 변수 없는 생성자 및 개체 이니셜라이저에 대한 호출을 통해 초기화됩니다.Note that the example also removes the parameterized constructor, so that SaleItem objects are now initialized with a call to the parameterless constructor and an object initializer.

using System;

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

   public decimal Price
   { get; set; }
}

class Program
{
   static void Main(string[] args)
   {
      var item = new SaleItem{ Name = "Shoes", Price = 19.95m };
      Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
   }
}
// The example displays output like the following:
//       Shoes: sells for $19.95



C# 언어 사양C# Language Specification

자세한 내용은 C# 언어 사양속성을 참조하세요.For more information, see Properties in the C# Language Specification. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.The language specification is the definitive source for C# syntax and usage.

참고 항목See also