.NET/C#

[C#] C#과 OOP(Object-Oriented Programming) - 5. 속성(Property)과 인덱서(Indexer)

클리엘 2022. 6. 24. 11:48
728x90

5. 속성(Property)과 인덱서(Indexer)

 

● 속성(Property)

 

속성은 특정 값을 설정할 때 메서드처럼 호출하고 값을 가져오는 경우 Field처럼 호출하여 사용할 수 있도록 하는 것으로 해당 기능을 구현하기 위한 구문이 간소화될 수 있습니다.

namespace mylibrary;
public class Car
{
    public int Speed
    {
        get;
        set;
    }

    public int RPM => Speed * 2;
}

예제에서는 Speed와 RPM이라는 2개의 Property를 정의하였습니다. Speed는 값을 읽는 get과 값을 설정하는 set으로 인해 int형식의 값을 설정하고 가져올 수 있고 RPM은 Speed에서 *2를 연산한 결과만을 읽을 수 있는 Property가 되었습니다.

using mylibrary;

Car sedan = new();
sedan.Speed = 80;

Console.WriteLine($"{sedan.RPM}");
//160

Speed는 C# 6 버전 이후부터 두루 사용 가능한 전통적인 Property의 정의방식으로 구현된 것이며 RPM은 람다식을 이용한 방식입니다. 만약 RPM을 Speed버전으로 구현하게 된다면 아래와 같이 할 수 있을 것입니다.

public int RPM
{
    get {
        return Speed * 2;
    }
}

Speed에서 구현된 get과 set은 각각 값의 설정과 확인을 의미하는 것인데 C#초기에는 별도의 변수를 만들고 get과 set에서 실제 값이 적용되도록 해야 하지만

int speed;

public int Speed
{
    get
    {
        return speed;
    }
    set
    {
        speed = value;
    }
}

단순히 get과 set을 설정하는 것만으로 compiler에서 자동으로 위와 같은 처리를 진행해 주므로 좀 더 편리하게 get과 set을 사용할 수 있는 것입니다. 그러나 자동적으로 처리되는 부분은 위의 예제까지이며 뭔가 값을 설정하거나 가져오는 데 있어서 특별한 처리를 해야 한다면 get과 set에서 해당 부분을 직접 구현해야 합니다.

int speed;

public int Speed
{
    get
    {
        return speed;
    }
    set
    {
        if (value > 80)
            throw new Exception("제한 속도 초과!");

        speed = value;
    }
}

● 인덱서

 

인덱서는 속성을 배열로서 사용할 수 있도록 해주는 장치입니다.

string[] passengers = { "홍길동", "홍길순", "홍길영", "홍길석" };
public string this[int index]
{
    get {
        return passengers[index];
    }
}

따라서 배열과 완전히 같은 방식으로 속성에 접근할 수 있습니다.

Car sedan = new();

Console.WriteLine($"첫번째 승객 : {sedan[0]}");
Console.WriteLine($"두번째 승객 : {sedan[1]}");
Console.WriteLine($"세번째 승객 : {sedan[2]}");
Console.WriteLine($"네번째 승객 : {sedan[3]}");
//첫번째 승객 : 홍길동
//두번째 승객 : 홍길순
//세번째 승객 : 홍길영
//네번째 승객 : 홍길석
728x90