Language/C#

[C#] 프로퍼티(Property) / 인덱서(Indexer)

마탁이 2020. 12. 26. 16:54

 - 프로퍼티는 필드와는 달리 Validation을 할 수 있고, 읽기/쓰기 전용과 같은 제한을 할 수 있다.

 - 객체 지향 관점에서는 불필요한 정보를 숨길 수 있는 정보 은닉의 효과도 가져온다.

 

1. 프로퍼티 선언

 - 프로퍼티는 get/set 구문을 사용하여 선언한다.

 - get/set 구문에는 public, private와 같은 접근 제한자 설정이 가능하다.

 

    public class Employee
    {
        private int birthYear;
        private string name;

        public int BirthYear
        { 
            get
            {
                return this.birthYear;
            }
            set
            {
                // validation
                if(value < 1900)
                {
                    throw new ArgumentException("Error");
                }

                this.birthYear = value;
            }
        }

        public string Name
        {
            get
            {
                return this.name;
            }
            set
            {
                this.name = value;
            }
        }
    }

 

2. 자동 구현 프로퍼티

 - 특별한 로직이 없다면 C# 3.0 부터 지원하는 자동 구현 프로퍼티를 사용하면 보다 간결한 코드를 작성할 수 있다.

 - 자동 구현 프로퍼티는 별도 구문 없이 get/set 으로만 선언을 하며 반드시 get/set이 한 쌍으로 존재해야 한다.

 - 만약 읽기 전용일 경우는 set 구분의 접근 제한자를 private로 선언해 주면 된다.

 

    public class Employee
    {
        public int birthYear { get; private set; }
        public string name { get; set; }

    }

3. 인덱서(Indexer)

 - 프로퍼티가 클래스의 필드처럼 사용되는 것처럼 인덱서는 클래스 자체를 배열과 같이 사용할 수 있도록 선언하는 것.

 - String 클래스처럼 인덱스를 통해 값에 접근할 수 있다.

 - 선언은 this 구분에 get/set 프로퍼티를 정의해 주면 된다.

 

using System;
using System.Linq;

namespace SqlerCSharp
{

    // Generic
    public class Product<T>
    {
        public T[] ProductItem;

        // 기본 생성자일 경우 기본 배열 크기 설정
        public Product() : this(10) { }

        public Product(int size)
        {
            this.ProductItem = new T[size];
        }

        public T this[int index]
        {
            get
            {
                return ProductItem[index];
            }
            set
            {
                ProductItem[index] = value;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Product<string> item = new Product<string>();
            item[0] = "꿀과메기";
            item[1] = "새우깡";
            item[2] = "자갈치";

            Console.WriteLine("item[0] : {0}", item[0]);
            Console.WriteLine("item[{0}] : {1}", item.ProductItem.Count() - 1,
                item[item.ProductItem.Count() -1]);
            
            
        }
    }
}

 

<인덱서>

'Language > C#' 카테고리의 다른 글

[C#] 확장 메소드(Extension Method)  (0) 2020.12.26
[C#] ref / out / params  (0) 2020.12.26
[C#] 클래스  (0) 2020.12.26
[C#] 문자열 다루기 - StringBuilder  (0) 2020.12.23
[C#] 문자열 다루기 - string, 문자열 포맷  (0) 2020.12.23