본문 바로가기

Programming/CSharp

C#의 Property(속성)

반응형

C#에서는 기본으로 제공하는 Property라는 것이 있습니다.

기존의 C++이나 JAVA 같은 경우에는 Property와 같은 역할을 하는 것이 Getter와 Setter라는 함수입니다.

객체의 속성을 나타내는 멤버 변수는 대부분 private 내지는 protected 형식으로 정의가 됩니다.

하지만, 이렇게 되면 외부에서는 직접 접근이 불가능합니다.

이럴 때, Getter와 Setter를 사용해서 값을 수정하고 가져오게 됩니다.

기존에는 클래스가 int x와 int y를 갖고 있을 때,

이 값을 가져올 때는 GetX()를 사용하고 SetX()를 생성해서 값을 입력할 때 사용합니다.

해당 클래스를 사용하는 입장이나 작성하는 입장이나 굉장히 불편한 방법입니다.

그래서 C#에서는 Property라는 것을 기본적으로 지원해줍니다.

(Visual C++의 경우에는 __declspec을 이용해서 구현이 가능합니다.)

예제를 한 번 보도록 하겠습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
    class MyPoint
    {
        private int x;
        private int y;
        
        public int X
        {
            get
            {
                return x;
            }
            set
            {
                if (0 <= value)
                    x = value;
            }
        }

        public int Y
        {
            get
            {
                return y;
            }
            set
            {
                if (0 <= value)
                    y = value;
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyPoint ptNew = new MyPoint();
            ptNew.X = 5;
            ptNew.Y = 10;

            Console.WriteLine("X : {0}, Y : {1}", ptNew.X, ptNew.Y);
        }
    }
}

public int X, public int Y가 Property입니다.

get은 우리가 생각하는 GetX() 함수이고, set은 SetX()와 같은 함수입니다.

소문자인 x, y 멤버 변수는 private으로 외부 노출을 막았고 대신 대문자 X, Y로 Property를 만들었습니다.

value라는 키워드가 보이는데 이것은 SetX(int newX); 라는 메소드가 있을 때, newX라는 역할을 해줍니다.

즉, x에 새로 대입할 값을 의미합니다.

사용 방법은 읽을 때는 객체명.X 의 형태로 가능하고 쓸 때도 역시 객체명.X = 값; 형태로 가능합니다.

public int x로 선언한 것과 동일하게 작동이 가능해진 겁니다.

Property의 장점은 Getter나 Setter 함수 없이 public으로 선언하는 것과 같은 형태로 값을 사용할 수 있다는 점입니다.

하지만 이렇게 public으로 선언한 것과 같은 기능만 하면 Property는 사실 필요가 없을 수도 있습니다.

Property의 장점은 get만 가능하거나, set만 가능하게 작성할 수도 있다는 것입니다.

그리고 새로운 값을 받을 때, 범위 체크가 가능하다는 것입니다.

보시면 set 내부에는 0보다 작은 값은 x나 y값으로 넣지 않는 것을 알 수 있습니다.

위의 예제에서는 음수가 입력되면 갑이 대입되지 않습니다.

실행 결과는 다음과 같습니다.

property는 클래스를 더 편리하게 사용할 수 있게 해주는 문법입니다.


반응형