클래스의 필드에 안전하게 접근하는 방법과 수정하는 방법을 제공한다.
class CLASSNAME
{
데이터 형식 FIELD_NAME;
접근한정자 데이터 형식 PROPERTY_NAME
{
get { return FIELD_NAME; }
set { FIELD_NAME = value; }
}
}
C#에서 클래스 필드를 접근하는 방법에 대해 GetXXX(), SetXXX()를 우아한 방법으로 선언할 수 있다.
- 예시
class MyClass
{
private int data;
public int Data { get { return data; } set { data = value; } }
}
값을 변경하고 싶지 않다면 get만 선언하여 읽기 전용 프로퍼티를 만들 수 있다.
class ReadOnlyClass
{
private int data;
public int Data { get { return data; } }
}
이 둘의 차이는 다음과 같이 필드를 직접 수정하는 데 있어 읽기 전용은 컴파일 에러를 발생시킨다.
MyClass mc = new MyClass();
mc.Data = 1;
ReadOnlyClass mc2 = new ReadOnlyClass();
// mc2.Data = 1; // 컴파일 에러 : 읽기 전용 (get만 선언)
자동 구현 프로퍼티
C#은 다음과 같이 프로퍼티를 선언하면 Get과 Set 메서드를 알아서 자동으로 생성해주고 필드를 선언할 필요도 없다.
또한 = 초기값으로 생성자에 초기화 코드를 작성하는 일도 덜 수 있다.
// 자동 구현 프로퍼티
public class NameCard
{
public string Name { get; set; } = "Unknown";
public string PhoneNumber { get; set; } = "010-0000-0000";
}
프로퍼티를 이용한 초기화
- new를 이용한 생성을 할 때 { } 안에 프로퍼티와 초기값을 할당하여 인스턴스화 할 수 있다.
NameCard card = new NameCard() { Name = "Sam", PhoneNumber = "010-2222-1111" };
- 읽기 전용의 경우 사용할 수 없으므로 매개변수 생성자를 따로 정의해야한다.
ReadOnlyClass mc2 = new ReadOnlyClass() { Data = 10; } // 컴파일 에러 : 할당 불가
// 클래스 정의부
public ReadOnlyClass(int data) { this.data = data; }
//...
ReadOnlyClass mc3 = new ReadOnlyClass(10);
- C# 9.0 이상에서 init 키워드를 사용하면 첫번째 라인처럼 초기화가 가능하다.
public int Data { get; init; }
//
ReadOnlyClass mc2 = new ReadOnlyClass() { Data = 10; } // ok
무명 형식
new 타입(생성자 매개변수)에서 타입 지정을 비우고 {필드 1 : 필드1 값, 필드 2 : 필드2 값,...} 이런식으로 초기화하여 사용할 수 있는데 이러한 타입은 새로운 형식을 만들어내고 var로 선언할 수 있다.
var unNamed = new { Name = "Pete", Age = "20" };
unNamed.Name = "Changed"; // 무명 형식의 속성 변경 불가능
이러한 형식은 인스턴스화 이후에 필드 값을 변경할 수 없다.
인터페이스의 프로퍼티
interface IProduct
{
string ProductName { get; set; }
}
class Product : IProduct
{
private string productName;
public string ProductName { get { return productName; } set { productName = value; } }
public void Print() { Console.WriteLine($"{ProductName}"); }
}
인터페이스의 프로퍼티는 파생 클래스에서 해당 프로퍼티를 구현해야한다. 인터페이스의 프로퍼티는 자동 구현되지 않는다.
추상클래스의 프로퍼티
abstract로 선언된 프로퍼티는 파생 클래스에서 오버라이드해야 한다.
abstract class Access
{
private static int serial = 0;
public string SerialID { get { return String.Format("{0:d5}", serial++); } }
abstract public DateTime ProductDate { get; set; }
}
class MyAccess : Access
{
public override DateTime ProductDate { get; set; }
}
프로퍼티는 필드의 접근 방법을 제공하는 기능이 단순하므로 필요한 경우가 있는지 생각해보자.
'C# > C# 기본' 카테고리의 다른 글
[C#] Generic 프로그래밍 / 예외 처리 (0) | 2021.10.12 |
---|---|
[C#] 배열 / 컬렉션 / 인덱서 (0) | 2021.10.11 |
[C#] 인터페이스와 추상 클래스 (0) | 2021.10.07 |
[C#] 클래스 (0) | 2021.10.06 |
[C#] 메서드 (0) | 2021.10.05 |