공부/C#

(4) C# 기초 문법 - 프로퍼티(속성), 인덱서

샤샤샤샤 2024. 10. 16. 22:55

1. property(프로퍼티/ 속성)
자바에서는 get/set 함수를 이용해 속성값을 바꾸거나 조회한다. 이를 좀 더 쉽게 구현하도록 만든 것이 프로퍼티라고 할 수 있다.
클래스 내부, 메서드 바깥에


    public  [반환 형식] 프로퍼티 이름 {get; set; }


형식으로 선언한다. 이때 프로퍼티 이름은 속성 이름이나 논리적으로 속성을 나타내는 이름이 좋다.

class Car{
    private int wheelVar;
    
    public int Wheel{
        get{ return wheelVar;}    // 조회할때 자동 호출
        set{ wheel = value; }  // 대입할때 자동 호출
    }
}

이런 식으로 선언하면 자동으로 프로퍼티를 조회하거나 호출할때 호출된다. 즉, 프로퍼티를 필드처럼 사용 가능한 것이다.

Car car = new Car();
car.Wheel = 4;  // 프로퍼티의 set 함수 호출되어 wheelVar에 변수 자동 대입
Console.WriteLine(car.Wheel);  // 프로퍼티의 get함수 호출되어 4출력됨.

이는 워낙 많이 쓰이는 형태이기에 자동으로 구현이 가능하다.

class Car{
    private int wheelVar;
    
    public int Wheel{ get; set; } // 자동으로 구현됨
}

이처럼 코드를 적어도 자동으로 get, set 함수가 구현된다. 물론 내부적으로 로직을 추가하고 싶으면 위의 코드처럼 직접 구현해서 추가해야 한다.

C#6.0 이상부터는 자동으로 값을 초기화하는 것 역시 가능하다.

class Car{
    private int wheelVar;
    
    public int Wheel{ get; set; } = 4;  // 기본값 설정
}

사용 용도에 따라 get 이나 set 만 구현할수도 있다.
get 만 구현할 경우 읽기 전용 속성이 되며, set 만 구현하면 쓰기 전용 속성이 된다.

 

2. 인덱서
인스턴스를 배열처럼 사용할수 있게 해주는 기능이다. 객체의 속성에 마치 배열처럼 [](첨자) 로 접근 가능하도록 해주며, 구현 방식에 따라 Hashtable(자바의 Map) 처럼 접근도 가능하다.

public 반환타입 this[]{  get;  set;  } 

형태로 선언 가능하다.

class Car
{
    private string name;
    private string maker;

    public Car(string name, string maker)
    {
        this.name = name;
        this.maker = maker;
    }

    public string this[int index]
    {
        get
        {
            switch (index)
            {
                case 0: return name;
                case 1: return maker;
                default: return "잘못된 값";
            }
        }
    }
}

이렇게 작성하면 다음과 같이 접근이 가능해진다.

        Car car = new Car("벤츠", "메르세데스");
        Console.WriteLine(car[0]); // 벤츠 출력
        Console.WriteLine(car[1]); // 메르세데스 출력

이때 set 함수도 구현해서 프로퍼티처럼 값을 받을수도 있다.

class Car
{
    private string name;
    private string maker;

    public Car(string name, string maker)
    {
        this.name = name;
        this.maker = maker;
    }

    public string this[int index]
    {
        get
        {
            switch (index)
            {
                case 0: return name;
                case 1: return maker;
                default: return "잘못된 값";
            }
        }
        set
        {
            switch (index)
            {
                case 0: name = value; break;
                case 1: maker = value; break;
                default: return;

            }
        }
    }
}

이때는 아래와 같이 접근하여 속성을 바꿀수 있다.

        Car car = new Car("벤츠", "메르세데스");
        car[0] = "xxxx";
        Console.WriteLine(car[0]); // xxxx 출력

이를 이용해서 인덱서의 매개변수를 string 으로 받고, 내부적으로 hashtable 을 가지고 있거나 switch, if 같은 조건문을 작성해서 car["name"] 처럼 접근할 수 있게 구현하는 것 역시 가능하다.

class Car
{
    private string name;
    private string maker;

    public Car(string name, string maker)
    {
        this.name = name;
        this.maker = maker;
    }

    public string this[string key]
    {
        get
        {
            switch (key)
            {
                case "이름": return name;
                case "제조사": return maker;
                default: return "잘못된 값";
            }
        }
        set
        {
            switch (key)
            {
                case "이름": name = value; break;
                case "제조사": maker = value; break;
                default: return;

            }
        }
    }
}

 

 

프로퍼티와 인덱서 둘 모두 C# 에서 개발의 편의성을 위해 제공하는 예외적인 문법이다.