C# 프로퍼티(Property)

선비Sunbei·2023년 1월 9일
0

C#

목록 보기
7/18
post-thumbnail

Property

다른 언어에는 없는 Property라는 것이 존재한다.
기존에 데이터를 은닉시키고 조건을 만족할 때만 get과 set을 하기 위해서는 다음과 같이 사용해야 할 것이다.

        class Data
        {
            private int data;

            public void setData(int data)
            {
                this.data = data;
            }
            public int getData()
            {
                return data;
            }
        }

그런데 이를 좀 더 간편하게 사용하기 위해서 나온 것이 프로퍼티이다.

using System;

namespace Study11
{
    class Program
    {
        class Data
        {
            private int mDataA;
            private int mDataB;
            private int mDataC;
            private int mDataD;

            public int DataA
            {
                get
                {
                    Console.WriteLine("Data A의 값을 불러왔습니다.");
                    return mDataA;
                }
                set
                {
                    mDataA = value;
                    Console.WriteLine("Data A의 값이 설정되었습니다.");
                }
            }
            public int DataB
            {
                get
                {
                    Console.WriteLine("Data B의 값을 불러왔습니다.");
                    return mDataB;
                }
                set
                {
                    if (value >= 3)
                    {
                        Console.WriteLine("Data B의 값이 설정되었습니다.");
                        mDataB = value;
                    }
                    else
                    {
                        Console.WriteLine("Data B의 값을 3이상으로 설정해주세요.");
                    }
                }
            }
            public int DataC
            {
                get
                {
                    Console.WriteLine("Data C의 값을 불러왔습니다.");
                    return mDataC;
                }
                set
                {
                    if (value >= 10)
                    {
                        Console.WriteLine("Data C의 값이 설정되었습니다.");
                        mDataC = value;
                    }
                    else
                    {
                        Console.WriteLine("Data C의 값을 10이상으로 설정해주세요.");
                    }
                }
            }
            public int DataD
            {
                get
                {
                    Console.WriteLine("Data D의 값을 불러왔습니다.");
                    return mDataD;
                }
                set
                {
                    if (value >= 100)
                    {
                        Console.WriteLine("Data D의 값이 설정되었습니다.");
                        mDataD = value;
                    }
                    else
                    {
                        Console.WriteLine("Data D의 값을 100이상으로 설정해주세요.");
                    }
                }
            }
        }
        static void Main(string[] args)
        {
            Data data = new Data();

            data.DataA = 0;
            Console.WriteLine($"Data A: {data.DataA}\n");
            data.DataB = 0;
            Console.WriteLine($"Data B: {data.DataB}\n");
            data.DataB = 5;
            Console.WriteLine($"Data B: {data.DataB}\n");
            data.DataC = 20;
            Console.WriteLine($"Data C: {data.DataC}\n");
            data.DataD = 99;
            Console.WriteLine($"Data D: {data.DataD}\n");
            data.DataD = 101;
            Console.WriteLine($"Data D: {data.DataD}\n");

        }
    }
}

다음과 같이 일반적으로 필드명으로 변수를 노출시키면 잘못된 사용으로 설계가 망가질 수 있는 것을 방지하기 위해서 getter와 setter를 사용한다. 그런데 일일히 setter와 getter 함수를 각각 만들어 호출하여 사용하면 귀찮아지기 때문에 setter와 getter처럼 조건을 걸 수 있으면서 하나의 변수로 get과 set이 되게끔 하려는게 property의 목적이다.
구조는 아래와 같다.
value라는 키워드를 써서 =을 통해 들어오는 우항의 값을 얻어올 수 있다.

    private 자료형 필드명;
    접근제어자 자료형 프로퍼티명
    {
        get
        {
            return 필드명;
        }
        set
        {
            필드명 = value;
        }
    }
]

자동구현 프로퍼티

C# 7.0 버전 이상부터는 return 필드명과, 필드명 = value를 사용하는 것도 귀찮기 때문에 더 간단하게 하기위해 자동으로 프로퍼티를 만들어준다.
사용법은 다음과 같다.

using System;

namespace Study12
{
    class Program
    {
        class Data
        {
            public int MData { get; private set; } = 10;
        }
        static void Main(string[] args)
        {
            Data data = new Data();
            Console.WriteLine($"{data.MData}"); 
        }
    }
}

일반 변수를 선언하듯이 선언 후에 대괄호와 함께 get과 set 키워드를 사용하면 된다.
추가적으로 get과 set에 접근제어자를 설정할 수 있는데 몇가지 조건이 존재한다.
1. 데이터를 선언할 때 사용한 접근제어자보다 더 영향력이 낮은 접근제어자를 사용해야 한다. (오류코드 : CS0273)
ex>

        class Data
     {
         public int MData {public get; set; } = 10;
         // public get으로 인해 에러 발생
     }
  1. get과 set에 둘다 접근제어자를 설정할 수 없다. (오류코드 : Cs0274)
    물론 둘다 설정할 필요도 없다. 둘 중 가장 권한이 낮은(public에 가까운) 것을 자료형의 접근제어자로 설정 후 높은(private에 가까운) 것을 get 또는 set에 설정하면 문제 없기 때문이다.

0개의 댓글