가상이나 추상 인터페이스 같은 키워드를 사용하여 클래스 구조를 잡다보면 너무 복잡해지고 다른
사람이 내가 만든 클래스를 사용하다보면 혼란을 가져오게 됩니다. 물론 클래스 설계가 잘 되어있고
해당 문서가 있다면 더 좋겠지만, 개발하면서 이런 문서까지 만든다는 것은 쉽지 않은게 사실입니다.
따라서 이런 문제를 조금이나마 해결하기 위해 사용하는 sealed class에 대해서 알아보겠습니다.
sealed는 한국말로 “봉인된”이라는 뜻을 갖고 있죠. 즉 클래스를 봉인시키는 키워드 입니다. 상속으
로 부터 봉인시키는 것입니다. 만약에 어떤 클래스에 sealed 키워드가 있다면 더 이상 상속이 불가능
하다는 것을 표현하는 것입니다. 그리고 이 sealed는 클래스 뿐 아니라 속성이나 함수에서도 사용이
가능합니다. 클래스에 sealed가 없고 함수나 속성에 sealed가 있다면 해당 클래스를 상속 받은 클래
스에서는 함수나 속성을 재정의 하는 것이 불가능합니다.
public abstract class BaseCharacter
{
public double Hp { get; set; }
public double Mp { get; set; }
public virtual void Attack()
{
// 공격한다.
}
public virtual void Stop()
{
// 멈춘다.
}
public abstract void Skill_Q();
public abstract void Skill_W();
public abstract void Skill_E();
public abstract void Skill_R();
}
이 BaseCharacter를 상속받은 CharacterA코드
public class CharacterA : BaseCharacter
{
public sealed override void Attack()
{
// 추가적인 Attack 관련 행동
base.Attack();
}
public sealed override void Stop()
{
// 추가적인 Stop 관련행동
base.Stop();
}
public override void Skill_E()
{
throw new NotImplementedException();
}
public override void Skill_Q()
{
throw new NotImplementedException();
}
public override void Skill_R()
{
throw new NotImplementedException();
}
public override void Skill_W()
{
throw new NotImplementedException();
}
}
만약에 CharacterA를 상속받아 만든 다른 케릭터의 경우 Attack과 Stop에 대한 기능은 재정의가 불가
능하게 됩니다. 이런 식으로 한 클래스안에서도 다양하게 기능을 제한할 수 있기 때문에 여러 사람들
이 함께 작업을 하는 경우 실수를 줄이고 처음 설계된 구조로 개발하는데 도움이 됩니다.