Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/C#] 프로퍼티 (Property) 본문

Programming/C#

[Programming/C#] 프로퍼티 (Property)

scii 2020. 9. 11. 15:24

* Python의 property, setter 데코레이션과 똑같다고 생각하면 된다.

객체 지향 언어라면 모름지기 "은닉성"을 표현할 수 있어야 한다. 객체의 데이터가 의도하지 않게 오염되는 것을 방지해야 하니까. C++나 Java에서는 private과 protected 접근 한정자를 이용해서 클래스 내의 필드를 외부에서 보이지 않게 감추고, 이 필드에 접근하는 메소드들을 public으로 따로 제공한다. C# 언어도 이 방법을 그대로 사용할 수 있지만, C# 언어는 이보다 더 우아한 장치를 제공한다. 그것이 바로 프로퍼티(Property)이다.

프로퍼티를 이용하는 이유? 은닉성과 편의성

예를 들어 다음과 같은 클래스가 있다고 해보자. 이 클래스는 int 형식 myField를 private로 갖고 있다.

class MyClass
{
    private int myField;
}

GetXXX()와 SetXXX() 메소드를 클래스에 추가하여 myField에 접근할 수 있다.

class MyClass
{
    private int myField;
    public int GetMyField() { return myField; }
    public void SetMyField(int newVal) { myField = newVal; }
}

그리고 이 클래스의 객체는 다음과 같이 사용할 것이다.

Myclass obj = new MyClass();
obj.SetMyField(3);
Console.WriteLine(obj.GetMyField());

이 코드가 잘못된 코드라는 이야기는 아니다. 컴파일도 문제없이 잘 되고, 원하는 대로 은닉성을 지키면서 필드를 읽고 쓰고 있다. C++, Java 프로그래밍 언어에서는 이것이 완벽한 정석이라고 할 수 있다. 다만 C# 언어에서는 더 우아한 장치를 제공하기 때문에 아무래도 이런 방식은 지양해야한다.

프로퍼티 문법

class 클래스이름
{
    데이터형식 필드이름;
    접근한정자 데이터형식 프로퍼티이름
    {
        get
        {
            return 필드이름;
        }
        
        set
        {
            필드이름 = value;
        }
    }
}

프로퍼티 선언 문법에서 get {...}과 set {...}을 일컬어 접근자(accessor) 라고 한다.

  • get 접근자 : 필드로부터 값을 읽어온다.
  • set 접근자 : 필드에 값을 할당한다.

set 접근자 안에 있는 value 키워드를 보자. 이 키워드는 선언한 적이 없지만, C# 컴파일러는 set 접근자의 암묵적 매개 변수로 간주하므로 아무 문제를 삼지 않는다.

class MyClass 
{
    private int myField;
    
    public int MyField
    {
        get
        {
            return myField;
        }
        
        set
        {
            myField = value;
        }
    }

이제 MyClass의 객체는 '=' 할당 연산자를 통해 myField 필드에 데이터를 저장하고 읽어올 수 있게 되었다.

MyClass obj = new MyClass();
obj.MyField = 3;
Console.WriteLine(obj.MyField);

읽기 전용

class MyClass 
{
    private int myField;
    
    public int MyField
    {
        get
        {
            return myField;
        }
    }
}

set 접근자를 구현하지 않으면 해당 프로퍼티는 읽기 전용이된다.

쓰기 전용

문법적으로 아무 문제가 없다. 하지만 사용전에 신중히 생각해야 한다. 내가 만든 클래스를 사용할 프로그래머들에게 쓰기 전용 프로퍼티의 용도와 동작 결과를 확인할 수 있는 방법을 알려주어야 한다. 그렇지 않으면 그 프로퍼티는 코드를 관리하기 어렵게 만드는 하나의 원인이 될 가능성이 높아진다.

프로퍼티를 이용한 예제

using System;
using System.Data;

namespace CSharpExample
{
    class BirthdayInfo
    {
        private string name;
        private DateTime birthday;

        // 프로퍼티 생성
        public string Name
        {
            get
            {
                return name;
            }

            set
            {
                name = value;
            }
        }

        public DateTime Birthday
        {
            get
            {
                return birthday;
            }

            set
            {
                birthday = value;
            }
        }

        // 읽기 전용 프로퍼티
        public int Age
        {
            get
            {
                return new DateTime(DateTime.Now.Subtract(Birthday).Ticks).Year;
            }
        }
    }

    class MainApp
    {
        static int Main(string[] args)
        {
            BirthdayInfo birth = new BirthdayInfo();
            birth.Name = "후후";
            birth.Birthday = new DateTime(1991, 6, 28);

            Console.WriteLine($"Name: {birth.Name}");
            Console.WriteLine($"Birthday: {birth.Birthday.ToShortDateString()}");
            Console.WriteLine($"Age: {birth.Age}");

            return 0;
        }
    }
}


/* 결과

Name: 후후
Birthday: 1991-06-28
Age: 30

*/
Comments