가상이나 추상 인터페이스 같은 키워드를 사용하여 클래스 구조를 잡다보면 너무 복잡해지고 다른

사람이 내가 만든 클래스를 사용하다보면 혼란을 가져오게 됩니다. 물론 클래스 설계가 잘 되어있고

해당 문서가 있다면 더 좋겠지만, 개발하면서 이런 문서까지 만든다는 것은 쉽지 않은게 사실입니다.

따라서 이런 문제를 조금이나마 해결하기 위해 사용하는 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에 대한 기능은 재정의가 불가

능하게 됩니다. 이런 식으로 한 클래스안에서도 다양하게 기능을 제한할 수 있기 때문에 여러 사람들

이 함께 작업을 하는 경우 실수를 줄이고 처음 설계된 구조로 개발하는데 도움이 됩니다.