봉인 클래스(Sealed Class)
클래스가 다른 클래스에 상속되는 것을 원하지 않을 때 해당 클래스를 봉인 클래스(Sealed Class)로 선언할 수 있습니다. 봉인 클래스는 sealed 키워드로 선언합니다.
// 봉인 클래스입니다.
sealed class Parent { }
// 봉인 클래스는 상속될 수 없습니다.
class Child : Parent { }
class Program
{
static void Main(string[] args)
{
}
}
실행 결과
위 예제에서 sealed 키워드를 사용하여 밀봉 클래스 Parent를 만들었습니다. 밀봉 클래스는 다른 클래스에 상속될 수 없으므로 컴파일 에러가 발생합니다.
봉인 클래스 특징
- 봉인 클래스와 추상 클래스는 다릅니다.
- 봉인 클래스는 추상 메서드를 가질 수 없습니다.
- 다른 클래스에 상속될 수 없으므로 상속 계층에서 최하위 클래스여야 합니다.
- 봉인 클래스는 상속을 피하거나 제한하기 위해 고안되었습니다.
- sealed 키워드는 클래스뿐만 아니라 메서드, 프로퍼티에 사용할 수 있습니다.
봉인 메서드(Sealed Method)
부모 클래스에 정의된 클래스를 자식 클래스에서 재정의할 수 없는 경우 봉인 메서드(Sealed Method)라고 합니다. 클래스에서 메서드가 가상(virtual)으로 선언되면 자식 클래스가 메서드를 재정의할 수 있습니다.
class class1
{
public virtual void show()
{
Console.WriteLine("class1의 show() 메서드");
}
}
class class2 : class1
{
public override void show()
{
Console.WriteLine("class2의 show() 메서드");
}
}
class class3 : class2
{
public override void show()
{
Console.WriteLine("class3의 show() 메서드");
}
}
class1의 show() 메서드가 가상 메서드(Virtual Method)로 선언되었으므로 자식 메서드에서 재정의할 수 있습니다.
하지만, 다음 예제처럼 class2의 show() 메서드를 봉인 메서드로 선언하면 class2의 하위 클래스는 show() 메서드를 더 이상 재정의할 수 없습니다.
class class1
{
public virtual void show()
{
Console.WriteLine("class1의 show() 메서드");
}
}
class class2 : class1
{
public sealed override void show()
{
Console.WriteLine("class2의 show() 메서드");
}
}
class class3 : class2
{
public override void show()
{
Console.WriteLine("class3의 show() 메서드");
}
}
class Program
{
static void Main(string[] args)
{
class3 obj = new class3();
obj.show();
}
}
실행 결과
추상 클래스와 차이점
- 추상 클래스에는 추상 및 비추상 메서드가 존재하지만, 봉인 클래스에는 추상 및 가상 메서드가 존재할 수 없습니다.
- 추상 클래스는 직접 인스턴스화할 수 없습니다. 하지만, 봉인 클래스는 인스턴스를 생성할 수 있습니다.
- 추상 클래스를 사용하기 위해서는 확장된 클래스를 만들어야 합니다. 하지만, 봉인된 클래스에서 확장된 클래스를 만드는 것은 불가능합니다.
- 추상 클래스는 상속 계층 구조에서 최하위 클래스가 될 수 없지만, 봉인 클래스는 최하위 클래스여야 합니다.
정리
- 봉인 클래스는 확장이 불가능한 클래스입니다.
- 봉인 메서드는 자식 클래스에서 재정의할 수 없습니다.
반응형
'C#' 카테고리의 다른 글
[C#]메서드 숨기기(Method Hiding) (0) | 2022.05.16 |
---|---|
[C#]가상 메서드(Virtual Method), Virtual 키워드 (0) | 2022.05.16 |
[C#]구조체(Struct) (0) | 2022.05.15 |
[C#]this 키워드 (0) | 2022.05.09 |
[C#]접근 제한자(Access Modifier) - public, private, protected (0) | 2022.05.08 |
댓글