C#/C# 기본

[C#] 프로퍼티

로파이 2021. 10. 8. 21:09

클래스의 필드에 안전하게 접근하는 방법과 수정하는 방법을 제공한다.

    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