본문 바로가기
Program Language/C#

Part2. C# 기초 다지기(13. 속성)

by 토담이아빠 2023. 3. 5.

속성(Property)

 

일부 다른 언어들도 마찬가지겠지만 보통 정보 은닉과 캡슐화를 위해 필드를 private로 설정하고 public으로 게터(getter)와 세터(setter)를  제공합니다. C#도 마찬가지 방법으로 사용할 수 있지만,  속성(Property)이라는 개념을 활용하면 좀 더 편리하고 안전하게 이러한 목적을 달성할 수 있습니다.

 

정보 은닉과 캡슐화

 

C#에서 속성은 객체 지향 프로그래밍의 핵심 개념 중 하나인 정보 은닉(information hiding)을 위한 구문으로, 객체의 필드 값을 안전하고 편리하게 제어할 수 있도록 하는 방법입니다.


public class Person
{
    private string name;
    private int age;

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

    public int Age
    {
        get { return age; }
        set { age = value; }
    }
}

위의 코드에서 Person 클래스는 Name과 Age 속성을 가지고 있습니다. name 필드는 private으로 선언되어 있어서, 클래스 외부에서 접근할 수 없습니다. 대신에 Name 속성을 사용하여 값을 가져오거나 설정할 수 있습니다. 여기서 value는 C#에서 속성을 통해 값을 할당할 때 사용되는 키워드로 set 접근자에서 value 키워드를 통해 속성에 할당되는 값을 받아올 수 있습니다.

 

다음은 위 Person 클래스의 사용 예제를 보여줍니다.


internal class Program
{

    static void Main(string[] args)
    {
        Person person = new Person();
        person.Name = "Todam";
        person.Age = 1;

        Console.WriteLine("Name: " + person.Name);
        Console.WriteLine("Age: " + person.Age);
    }
}

자동 구현으로 코드 간결화

 

속성은 자동 구현을 사용할 수 있습니다. 이 방법은 get과 set 접근자를 직접 구현하지 않고, C# 컴파일러가 자동으로 구현합니다.


public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

위 코드에서 Person 클래스의 Name과 Age는 자동구현 속성으로 구현되었습니다. 이를 통해 코드의 길이를 줄일 수 있습니다.

 

추가 로직 구현

 

속성은 일반 메서드처럼 유효성 검증이나 기타 추가 로직을 넣어서 사용할 수 있습니다. 


public class Rectangle
{
    private double width;
    private double height;

    public double Width
    {
        get { return width; }
        set
        {
            if (value <= 0)
            {
                throw new ArgumentOutOfRangeException("너비는 0보다 커야합니다.");
            }
            width = value;
        }
    }

    public double Height
    {
        get { return height; }
        set
        {
            if (value <= 0)
            {
                throw new ArgumentOutOfRangeException("높이는 0보다 커야합니다.");
            }
            height = value;
        }
    }

    public double GetArea()
    {
        return Width * Height;
    }
}

속성을 사용하면 하나의 메서드에 getter와 setter가 동시에 들어 있기 때문에 별도로 구현해야하는 일반  getter, setter에 비해서 코드의 길이를 줄일 수 있어서 가독성이 좋습니다.

 

다음은 위 Rectangle 클래스를 사용하는 예제입니다.


static void Main(string[] args)
{
    Rectangle rect = new Rectangle();
    rect.Width = 0;
    rect.Height = 10;

    Console.WriteLine("Width: " + rect.Width);
    Console.WriteLine("Height: " + rect.Height);
    Console.WriteLine("Area: " + rect.GetArea());
}

[결과]

처리되지 않은 예외: System.ArgumentOutOfRangeException: 지정한 인수가 유효한 값 범위를 벗어났습니다.
매개 변수 이름: 너비는 0보다 커야합니다.
...

위 예제의 경우 Width와 Height 속성의 값이 0보다 작거나 같은 경우 ArgumentOutOfRangeException 예외를 던집니다. 이를 통해 유효하지 않은 값이 설정되는 것을 방지하고, 객체의 안전성을 보장할 수 있습니다.


댓글