클래스는 상속과 다형성을 지원하는 형식을 정의합니다. 이를 통해 파생 클래스의 계층 구조를 기반으로 정교한 동작을 만들 수 있습니다. 이와 대조적으로 ‘구조체’ 형식은 보다 단순한 형식으로, 기본 용도는 데이터 값을 저장하는 것입니다.* 구조체는 기본 형식을 선언할 수 없으며, System.ValueType에서 암시적으로 파생됩니다. struct 형식에서 다른 struct 형식을 파생할 수 없으며 암시적으로 봉인됩니다.
public struct Point { public double X { get; } public double Y { get; } public Point(double x, double y) => (X, Y) = (x, y); }
‘인터페이스’는 클래스 및 구조체로 구현할 수 있는 계약을 정의합니다. 인터페이스는 메서드, 속성, 이벤트 및 인덱서를 포함할 수 있습니다. 인터페이스는 일반적으로 해당 인터페이스가 정의하는 멤버의 구현을 제공하지 않으며 단지 해당 인터페이스를 구현하는 클래스 또는 구조체에서 제공해야 하는 멤버를 지정합니다.
인터페이스는 ‘다중 상속’을 사용할 수 있습니다. 다음 예제에서 인터페이스 IComboBox는 ITextBox 및 IListBox를 둘 다 상속합니다.
interface IControl { void Paint(); } interface ITextBox : IControl { void SetText(string text); } interface IListBox : IControl { void SetItems(string[] items); } interface IComboBox : ITextBox, IListBox { }
클래스 및 구조체는 여러 인터페이스를 구현할 수 있습니다. 다음 예제에서 클래스 EditBox는 IControl 및 IDataBound를 둘 다 구현합니다.
interface IDataBound { void Bind(Binder b); } public class EditBox : IControl, IDataBound { public void Paint() { } public void Bind(Binder b) { } }
클래스 또는 구조체가 특정 인터페이스를 구현하는 경우 해당 클래스 또는 구조체의 인스턴스를 해당 인터페이스 형식으로 암시적으로 변환할 수 있습니다. 예를 들면 다음과 같습니다.
EditBox editBox = new EditBox(); IControl control = editBox; IDataBound dataBound = editBox;