일부 다른 언어들도 마찬가지겠지만 보통 정보 은닉과 캡슐화를 위해 필드를 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 예외를 던집니다. 이를 통해 유효하지 않은 값이 설정되는 것을 방지하고, 객체의 안전성을 보장할 수 있습니다.
'Program Language > C#' 카테고리의 다른 글
Part3. C# 실력 다지기(1. 제네릭 메소드 이해하기) (20) | 2023.03.15 |
---|---|
Part2. C# 기초 다지기(14. params 키워드) (22) | 2023.03.11 |
Part2. C# 기초 다지기(12. 인수 전달 방법) (13) | 2023.03.02 |
Part2. C# 기초다지기(11. 메서드 오버로딩) (16) | 2023.02.28 |
Part2. C# 기초 다지기(10. 클래스의 구성) (11) | 2023.02.24 |
댓글