상세 컨텐츠

본문 제목

[C#] 읽기/쓰기 속성 선언 및 사용 - get, set 사용 관련

본문

반응형

 

=================================

=================================

=================================

 

 

 

출처: https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/get

 

get 키워드는 속성 값 또는 인덱서 요소를 반환하는 속성 또는 인덱서의 accessor 메서드를 정의합니다. 자세한 내용은 속성자동으로 구현된 속성 및 인덱서를 참조하세요.

다음 예제에서는 Seconds라는 속성의 get 및 set 접근자를 둘 다 정의합니다. _seconds라는 private 필드를 사용하여 속성 값을 지원합니다.

C#
 class TimePeriod {      private double _seconds;       public double Seconds      {          get { return _seconds; }          set { _seconds = value; }      } } 

대체로 get 접근자는 앞의 예제와 마찬가지로 값을 반환하는 단일 문으로 구성됩니다. C# 7.0부터 get접근자를 식 본문 멤버로 구현할 수 있습니다. 다음 예제에서는 get 및 set 접근자 둘 다를 식 본문 멤버로 구현합니다.

C#
 class TimePeriod {     private double _seconds;      public double Seconds     {         get => _seconds;         set => _seconds = value;     } } 

속성의 get 및 set 접근자가 private 지원 필드의 값 설정 또는 검색 이외의 다른 작업을 수행하지 않는 간단한 사례의 경우 자동 구현 속성에 대한 C# 컴파일러의 지원을 활용할 수 있습니다. 다음 예제에서는 Hours를 자동 구현 속성으로 구현합니다.

C#
class TimePeriod2 {     public double Hours { get; set; } }

 

 

=================================

=================================

=================================

 

 

 

출처: https://mrw0119.tistory.com/15

 

1. C++의 Set(), Get()

C++로 클래스를 만들면 보통 데이터의 은닉성을 위해
변수를 Private이나 Protected로 선언하고, 

Set()과 Get() 함수로 변수를 읽고 쓰고 한다.

 

 

 

 


문제는.. 클래스의 변수가 많아질수록 Set(), Get() 함수로

 도배되어져서 가독성도 떨어지고,


변수를 더 추가할 때마다 매번 Set(), Get() 함수를 작성해주어야하는 불편함이 있다.
은닉성은 지킬 수 있다지만, 상당히 번거롭고 귀찮은 작업이다.


2. C#의 프로퍼티

C#에서는 이를 단순화하는 프로퍼티(Property)라는 변수를 제공한다.
C++의 클래스를 C#의 프로퍼티로 작성하면 다음과 같다.

 


( value라는 변수는 미리 예약된 변수로 멤버변수에 대입하는 값이 자동으로 들어간다. )
C++에서 사용하던 set(), get() 함수를 뭐 나름 단순화시키긴 했다지만..

 

뭐 그닥.. 다른건 없는것 같다.;;;


그래서인지 C# 3.0부터는 이를 더 단순화할 수 있는 자동구현(?) 프로퍼티를 제공한다.


3. 자동구현 프로퍼티

 


변수에 set; get; 만 넣어주면 알아서 set(), get() 함수를 자동 구현해준다. 
그래서 자동구현 프로퍼티!

게다가 set을 빼고 get만 넣어주면 아주 쉽게 

멤버변수를 읽기전용으로도 사용할수 있다.

 

 

 

반응형

 

728x90

 

 

 


4. 프로퍼티 변수 초기화

 

이뿐 아니라 객체 생성시에 손쉽게 프로퍼티 변수를 초기화할 수 있다는 편리함까지 제공한다.
클래스내에 프로퍼티 변수가 선언되어 있다면 

 

생성자를 작성하지 않아도 객체 생성시에 초기화가 가능하며,

 

또한 원하는 프로퍼티만 골라서 초기화를 해줄 수 있다. 다음 예제를 참고하자.

 

 

 

 

 

 

이정도면 보기에도 심플하고, 사용하는데도 상당히 편리하다.

 

참으로 훌륭하지 아니한가?ㅎ

 

 


※ 

인터페이스나 추상클래스를 상속받는 클래스를 정의하는 경우,


인터페이스나 추상클래스 내의 

프로퍼티는 메소드와 같이 반드시 정의해주어야 한다.

 

 

 



출처: https://mrw0119.tistory.com/15 [Game Developer W]

 

 

 

=================================

=================================

=================================

 

 

 

출처: https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/how-to-declare-and-use-read-write-properties

 

 

속성은 개체 데이터에 대한 액세스가 보호, 제어, 확인되지 않을 위험 없이 공용 데이터 멤버의 편리함을 제공합니다. 이를 위해 기본 데이터 멤버의 값을 할당하고 검색하는 특수 메서드인 접근자가 사용됩니다. set접근자를 통해 데이터 멤버를 할당할 수 있으며, get 접근자는 데이터 멤버 값을 검색합니다.

이 샘플에서는 Name(string) 및 Age(int)의 두 속성이 있는 Person 클래스를 보여 줍니다. 두 속성 모두 get 및 set 접근자를 제공하므로 읽기/쓰기 속성으로 간주됩니다.

예제

C#
class Person {     private string name = "N/A";     private int age = 0;      // Declare a Name property of type string:     public string Name     {         get         {             return name;         }         set         {             name = value;         }     }      // Declare an Age property of type int:     public int Age     {         get         {             return age;         }          set         {             age = value;         }     }      public override string ToString()     {         return "Name = " + Name + ", Age = " + Age;     } }  class TestPerson {     static void Main()     {         // Create a new Person object:         Person person = new Person();          // Print out the name and the age associated with the person:         Console.WriteLine("Person details - {0}", person);          // Set some values on the person object:         person.Name = "Joe";         person.Age = 99;         Console.WriteLine("Person details - {0}", person);          // Increment the Age property:         person.Age += 1;         Console.WriteLine("Person details - {0}", person);          // Keep the console window open in debug mode.         Console.WriteLine("Press any key to exit.");         Console.ReadKey();     } } /* Output:     Person details - Name = N/A, Age = 0     Person details - Name = Joe, Age = 99     Person details - Name = Joe, Age = 100 */ 

강력한 프로그래밍

이전 예제에서 Name 및 Age 속성은 public이며, get 및 set 접근자를 모두 포함합니다. 이 경우 모든 개체가 이러한 속성을 읽고 쓸 수 있습니다. 그러나 때로는 접근자 중 하나를 제외하는 것이 좋습니다. 예를 들어 set 접근자를 생략하면 속성은 읽기 전용이 됩니다.

C#
public string Name {     get     {         return name;     } } 

또는 하나의 접근자를 공개적으로 노출하고 다른 접근자를 private 또는 protected로 설정할 수 있습니다.자세한 내용은 비대칭 접근자 접근성을 참조하세요.

속성이 선언되면 클래스의 필드처럼 사용할 수 있습니다. 이 경우 다음 문과 같이 속성의 값을 가져오고 설정할 때 자연스러운 구문을 사용할 수 있습니다.

C#
person.Name = "Joe"; person.Age = 99; 

속성 set 메서드에 특수 value 변수를 사용할 수 있습니다. 이 변수에는 사용자가 지정한 값이 포함됩니다. 예를 들면 다음과 같습니다.

C#
name = value; 

Person 개체의 Age 속성을 증가하기 위한 정리된 구문은 다음과 같습니다.

C#
person.Age += 1; 

개별 set 및 get 메서드를 사용하여 속성을 모델링한 경우 동등한 코드가 다음과 같이 표시될 수 있습니다.

C#
person.SetAge(person.GetAge() + 1);    

다음 예제에서는 ToString 메서드가 재정의되었습니다.

C#
public override string ToString() {     return "Name = " + Name + ", Age = " + Age; } 

ToString이 프로그램에서 명시적으로 사용되지 않고 기본적으로 WriteLine 호출에 의해 호출됩니다.

 

 

 

=================================

=================================

=================================

 

 

반응형


관련글 더보기

댓글 영역