:클래스의 기능을 완전히 정의하고 상속을 통한 확장을 제한하고자 할 때.
클래스의 특정 메서드 또는 속성을 재정의하지 못하도록 보호하고자 할 때.
-상속으로 계층구조가 복잡하면 나중에 새로운 상속코드를 구현하려면 어디까지 재정의를 해야하는지 파악하기어렵다. -> sealed를 사용해 해결가능
-불필요한 재정의를 제어하므로 구조가 명확해진다.
-위에 이유로 구조를 설계할때는 sealed를 적절하게 사용해야한다.
Sealed를 이용하면, 그림과 같이 봉인하여 상속이 불가능하게 된다.
public class BaseClass
{
public virtual void MethodA()
{
Console.WriteLine("BaseClass MethodA");
}
}
public sealed class SealedClass : BaseClass
{
public sealed override void MethodA()
{
Console.WriteLine("SealedClass MethodA");
}
}
//아래 코드는 오류를 발생시킨다.
public class DerivedClass : SealedClass
{
// sealed 형식의 상속 불가능
}
가상함수 MethodA를 맴버함수로 보유하고 있는 BaseClass를 상속 받은, SealedClass는 sealed 키워드를 이용하여, 재정의와 상속으로부터 보호하고 있다.
주석 처리된 DerivedClass의 정의는 오류를 발생시킨다. SealedClass는 sealed로 지정되었으므로 다른 클래스가 이를 상속하여 파생 클래스를 만들 수 없는 것이다.
①대형 프로젝트의 경우에는 계층구조가 복잡해지고, 코드가 극도로 길어진다.
②상속을 하면 안되는 클래스의 경우에 sealed 키워드를 붙인다.
③클래스뿐만 아니라, 맴버함수에도 sealed를 붙일 수 있다.
overrried로 상속받은 클래스에도 봉인해서 자식 함수가 해당 함수의 상속을 스킵하게 만들 수 있다.
④봉인된 함수를 사용하고 싶을 때, new키워드를 이용하여 새로운 함수를 만들 수있다.
이 경우에는 상속된 부모클래스의 맴버함수가 아닌, 자신이 새로이 정의한 new 함수를 사용하게 된다.
기존의 오버라이드된 함수가 아닌 별개의 함수
public new void Print2()
{
Console.WriteLine("BB::Print2()");
}
⑤abustract (추상 키워드) 와 sealed를 함께 사용할 수는 없다. (vritual과 함께도 사용불가)
추상 클래스는 반드시, 오버라이드를 해야하기 때문.
맴버 개체 또한 sealed를 사용할 수 없다.
virtual 또한 불가능하다.
하지만, override와는 함께 사용 가능하다.
override는 자식에게 상속시키는 것이 아닌, 자신이 부모로부터 상속받는 것이기 때문.