자동속성(Auto-Implemented Properties)/가상속성(Virtual Properties)
< 자동속성(Auto-Implemented Properties) >
클래스 내에 데이터 필드를 선언하고 이를 접근하기 위한 메서드를 작성하는 것은 매우 일반적인 일이다. 이렇게 필드에 대한 접근 제어를 하기 위해 getter와 setter를 사용한다. 이렇게 필드와 이를 제어하는 메서드를 함께 묶어 속성(Property)이라 부른다.
public class Coffee
{
private string _name; // 필드
public string Name // 속성
{
get { return _name; } // getter
set { _name = value; } // setter
}
}
그러나 이와 같은 방식은 코드의 중복성을 증가시키고 가독성을 낮추는 문제가 있다. 그래서 이를 해결하기 위해 자동속성(Auto-Implemented Properties)이라는 개념을 도입했다.
public class Coffee
{
public string Name { get; set; }
}
자동속성을 사용하면 필드는 컴파일러에 의해 자동으로 생성되며, getter와 setter 메서드도 자동으로 생성된다. 이는 코드의 중복성을 줄이고 가독성을 높여 준다.
자동속성은 특히 데이터 전송 객체(Data Transfer Object, DTO)나 데이터 모델 클래스 등의 작성에 주로 사용된다. 이들 클래스는 데이터를 저장하고 전달하는 역할을 하는데, 이때 개별 필드에 대해 별도의 로직 없이 단순히 데이터를 저장하거나 반환하는 작업이 주로 이루어지기 때문에 자동속성을 사용하면 매우 효율적이다.
[주의사항]
자동속성은 필드에 대해 별도의 로직이 없을 때 사용하는 것이 좋다. 필드의 값을 가져오거나 설정하는 과정에서 별도의 검증 로직이나 계산이 필요한 경우에는 일반 속성을 사용하는 것이 좋다.
자동속성은 기본적으로 public으로 선언되지만, 필요에 따라 접근 제어자를 변경할 수 있다. 하지만 get과 set에 대해 별도의 접근 제어자를 지정할 수도 있으니 이 점을 주의해야 한다. 예를 들어, 다음과 같이 속성을 선언할 수 있다.
public class Coffee
{
public string Name { get; private set; } // 외부에서는 읽기만 가능하고, 클래스 내에서만 값 설정 가능
}
< 가상속성(Virtual Properties) >
가상속성은 상속받은 클래스에서 재정의(Override)할 수 있는 속성이다. 이는 다형성(Polymorphism)의 한 형태로, 같은 이름의 속성이지만 각각의 클래스에서 다른 동작을 수행하도록 하는 것이 가능해진다.
public class Vehicle
{
public virtual string Name { get; set; } = "Vehicle";
}
public class Car : Vehicle
{
public override string Name { get; set; } = "Car";
}
이 경우, Vehicle 객체의 Name 속성은 "Vehicle"을 반환하고, Car 객체의 Name 속성은 "Car"을 반환한다. 가상속성은 이와 같이 상위 클래스에서 정의한 속성을 하위 클래스에서 필요에 따라 다르게 동작하도록 할 때 사용한다.
[주의사항]
하위 클래스에서 속성을 재정의할 때는 반드시 override 키워드를 사용해야 한다.
virtual 키워드를 사용하면 해당 속성이나 메서드는 재정의될 수 있음을 의미한다. 따라서 virtual 키워드를 사용할 때는 하위 클래스에서 이를 재정의할 가능성을 염두에 두고 설계해야 한다.
virtual 키워드를 사용할 경우, 실행 시간에 적절한 메서드나 속성이 호출되기 때문에 약간의 성능 손실이 발생할 수 있다. 따라서 성능이 중요한 상황에서는 이를 고려해야 한다.