추상 속성(abstract property)이란 속성 접근자(getter/setter)의 실제 구현을 포함하지 않고 선언만 되어 있는 속성을 말합니다. 즉, 파생 클래스에서 반드시 override 키워드를 사용하여 해당 속성의 구현을 제공해야 합니다.
C# 추상 속성의 기본 개념
추상 속성은 일반적으로 추상 클래스(abstract class) 내부에 선언됩니다. 추상 클래스는 그 자체로 인스턴스를 생성할 수 없으며, 상속받는 자식 클래스들이 공통으로 가져야 할 멤버를 정의하는 역할을 합니다.
이번 글에서는 추상 클래스 Shape와 이를 상속받는 두 개의 파생 클래스인 Square(정사각형)와 Circle(원)을 예제로 살펴보겠습니다. 여기서 각 도형의 넓이를 나타내는 Area 속성을 추상 속성으로 선언하고, 파생 클래스마다 서로 다른 방식으로 구현합니다.
추상 클래스 Shape 선언하기
먼저 추상 속성 Area를 포함하고 있는 Shape 클래스입니다. Area 속성에는 get 접근자만 선언되어 있으며, 본문(구현)이 없다는 점에 주목하세요.
public abstract class Shape {
private string name;
public Shape(string s) {
Id = s;
}
public string Id {
get {
return name;
}
set {
name = value;
}
}
// 추상 속성: 구현 없이 선언만 존재
public abstract double Area {
get;
}
public override string ToString() {
return Id + " Area = " + string.Format("{0:F2}", Area);
}
}
파생 클래스 Circle에서 추상 속성 구현하기
Circle 클래스는 Shape를 상속받아 추상 속성 Area를 재정의(override)합니다. 원의 넓이 공식인 반지름 × 반지름 × π를 사용하여 값을 계산합니다.
public class Circle : Shape {
private int radius;
public Circle(int radius, string id) : base(id) {
this.radius = radius;
}
// 추상 속성 Area를 오버라이드하여 구현
public override double Area {
get {
return radius * radius * System.Math.PI;
}
}
}
파생 클래스 Square에서 추상 속성 구현하기
마찬가지로 Square 클래스도 Shape를 상속받아 Area 속성을 자신에게 맞게 구현합니다. 정사각형의 넓이는 한 변의 길이 × 한 변의 길이로 계산됩니다.
public class Square : Shape {
private int side;
public Square(int side, string id) : base(id) {
this.side = side;
}
// 추상 속성 Area를 오버라이드하여 구현
public override double Area {
get {
return side * side;
}
}
}
추상 속성 사용 시 핵심 포인트 정리
- 추상 속성은
abstract키워드와 함께 선언하며, 접근자에 구현 코드가 없습니다. - 추상 속성을 가진 클래스는 반드시
abstract클래스여야 합니다. - 파생 클래스는
override키워드를 사용해 추상 속성을 반드시 구현해야 하며, 그렇지 않으면 컴파일 오류가 발생합니다. - 필요에 따라
get전용 또는get/set모두를 선언할 수 있습니다. - 이처럼 추상 속성을 활용하면 동일한 인터페이스를 유지하면서 파생 클래스마다 다른 계산 로직을 유연하게 적용할 수 있습니다.
이 예제에서 ToString() 메서드를 호출하면 각 도형 객체는 자신의 이름과 함께 재정의된 Area 속성 값을 출력하게 됩니다. 이것이 바로 C#에서 추상 속성을 통해 다형성(polymorphism)을 구현하는 전형적인 패턴입니다.