프로그래밍 관련/C#

C# 강좌 21편. 프로퍼티(Property)

LAYER6AI 2012. 10. 20. 00:03


1. 프로퍼티(Property)


프로퍼티(Property)는 속성이란 의미를 가지고 있습니다. 이 프로퍼티를 사용하게 되면, 속성 값을 반환하거나 새 값을 할당할 수 있습니다. 우리가 클래스를 하나 만들다가 필드를 public으로 선언할지, private으로 선언할지 고민하시는 분들이 간혹 있습니다. public으로 선언하려 했다가는, 이 필드가 어느순간 잘못된 값으로 지정되어 프로그램이 제대로 동작하지 않을지도 모릅니다. 이번엔 private로 선언하자니, 접근하는 방법이 public보다 까다로워 여간 귀찮은게 아닙니다. 이렇게 은닉성과 편의성을 고려하다, 편의를 버리고 private로 선언했다고 해봅시다.

    class MyClass
    {
        private int Field;
        public int GetField() { return Field; }
        public void SetField(int Field) { this.Field = Field; }
    }
..

위의 코드를 보시면, Field의 값을 얻어오거나 수정할때 GetField, SetField 메소드를 이용하죠? 그런데 C# 에서는 프로퍼티라는 기능을 제공하여 상당히 간단히 구현할 수 있습니다. 프로퍼티에는 get 속성 접근자와, set 접근자가 있습니다. 아래는 프로퍼티 기본 선언 형식입니다.

    class 클래스명
    {
        데이터타입 필드명;
        접근한정자 데이터타입 프로퍼티명
        {
            get
            {
                return 필드명;
            }
            set
            {
                필드명 = value;
            }
        }
    }
...

여기서 보이는 get 속성 접근자는 위에서 구현한 GetField 메소드를 대체합니다. 즉, 속성 값을 반환하는데 사용되며, set 접근자는 SetField 메소드를 대체, 새 값을 할당하는데 사용합니다. 살펴보니, 필드와 메소드 기능을 모두 담당하죠? 한가지 더 알아두실 점이 있다면 굳이 get, set를 다 써야할 필요는 없고 어느 한가지만 사용하여도 문제가 없습니다. get 접근자만을 사용하면 읽어올 수 밖에 없고, set 접근자만을 사용하면 쓸수 밖에 없습니다. get과 set을 둘다 쓰면 읽고 쓸수 있는거죠. 그럼 이제, 예제를 하나 보도록 합시다.

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

namespace ConsoleApplication45
{
    class Student
    {
        private string name;
        private int age;

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                if (value.Length > 3)
                    Console.WriteLine("이름은 3자 이상 넘을 수 없습니다.");
                else
                    name = value;
            }
        }
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                age = value;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();

            student.Age = 13;
            student.Name = "로버트 할리";
            student.Name = "김철수";

            Console.WriteLine("저의 이름은 " + student.Name + "이고, 나이는 " + student.Age + "살 입니다.");
        }
    }
}

결과:

이름은 3자 이상 넘을 수 없습니다.

저의 이름은 김철수이고, 나이는 13살 입니다.

계속하려면 아무 키나 누르십시오 . . .


코드를 보시면 11~12행에 private로 선언한 name, age 필드가 있고, 14~27행에는 Name 프로퍼티가, 28~38행에는 Age 프로퍼티가 있습니다. Name 프로퍼티 안을 살펴보면 get 접근자 내에는 그저 name 값을 반환하는 것이며, set 접근자 내에는 value의 길이가 3을 초과하면 "이름은 3자 이상 넘을 수 없습니다."라는 메세지가 출력됩니다. 45행에서는 student 객체를 만들고, 47~49행에서 프로퍼티를 통해 private 필드에 접근합니다. 그리고 51행에서는 프로퍼티를 통해 값을 얻어왔습니다. (여기서 value는 매개 변수와 같습니다. 프로퍼티는 변수가 아닌 메소드입니다.)


프로퍼티, 참으로 간편하고 유용하죠? 오늘 강좌는 여기서 마치려고 합니다. 수고하셨습니다.


다음 강좌는 파일 입출력(File Input/Output)에 대해 배워보도록 하겠습니다.