가상이나 추상 인터페이스 같은 키워드를 사용하여 클래스 구조를 잡다보면 너무 복잡해지고 다른 사람이 내가 만든 클래스를 사용하다보면 혼란을 가져오게 됩니다. 물론 클래스 설계가 잘 되어있고 해당 문서가 있다면 더 좋겠지만, 개발하면서 이런 문서까지 만든다는 것은 쉽지 않은게 사실입니다. 따라서 이런 문제를 조금이나마 해결하기 위해 사용하는 sealed class에 대해서 알아보도록 하겠습니다. 이전에 가상, 추상에 대한 포스팅과 인터페이스에 대한 포스팅은 아래 있으니까 참고하세요.
https://math-development-geometry.tistory.com/40
https://math-development-geometry.tistory.com/39
C# - interface 인터페이스 사용법과 원리
인터페이스는 상속 받을 클래스에 기능이나 속성을 지정하는 역할을 합니다. 일반적인 상속관계와 비슷하다고 볼 수 있지만 살짝 다른 개념입니다. 우선 C#에서는 C++과 다르게 하나의 부모 클래스만 상속 받을 수..
math-development-geometry.tistory.com
sealed는 한국말로 "봉인된"이라는 뜻을 갖고 있죠. 즉 클래스를 봉인시키는 키워드인데요. 상속으로부터 봉인시키는 것입니다. 만약에 어떤 클래스에 sealed 키워드가 있다면 더 이상 상속이 불가능하다는 것을 표현하는 것입니다. 그리고 이 sealed는 클래스 뿐 아니라 속성이나 함수에서도 사용이 가능합니다. 클래스에 sealed가 없고 함수나 속성에 sealed가 있다면 해당 클래스를 상속 받은 클래스에서는 함수나 속성을 재정의 하는 것이 불가능합니다. 한번 코드를 통해서 알아보도록 하겠습니다.
추상, 가상에 대한 포스팅해서 사용했던 예제인데요. 롤 캐릭터를 구현하는 방법을 예시로 만들었습니다.

추상 클래스로 BaseCharacter가 있고 저번 시간에 없었던 Hp와 Mp가 추가되었습니다. 이제 이 BaseCharacter를 상속 받아서 다양한 캐릭터를 구현해주었었죠. CharacterA에 대해서 코드를 보도록 하겠습니다.

이번 예제에서는 저번과 다르게 Attack과 Stop 함수에 sealed 라는 키워드가 추가된 것을 볼 수 있죠. 만약에 CharacterA를 상속받아 만든 다른 캐릭터의 경우 Attack과 Stop에 대한 기능은 재정의가 불가능하게 됩니다. 이런 식으로 한 클래스안에서도 다양하게 기능을 제한할 수 있기 때문에 여러 사람들이 함께 작업을 하는 경우 실수를 줄이고 처음 설계된 구조로 개발하는데 도움이 됩니다. 사실 제가 지금까지 개발을 하면서 sealed를 사용하는 사람들을 잘 못 봤는데요. sealed는 구조가 확실히 잡힌 프로젝트이거나 확실히 봉인 시켜줘야할 필요가 있다면 사용하는 것이 장기적으로 볼때 좋아요. 상속이 여러번 일어나면서 계층이 깊어지게 되면 나중에 코드를 구현하는 사람 입장에서는 어디까지 재정의를 해야하는지 파악하기 쉽지 않고, 불필요한 기능까지 구현을 하기 때문에 문제가 생길 수 있습니다. 따라서 구조를 잡는 입장에서 확실하게 sealed를 사용하는 습관을 가지면 좋을 것 같네요.
'C# Programming' 카테고리의 다른 글
C# - 디자인 패턴 - 싱글톤 패턴 (Singleton Pattern) (1) | 2019.07.31 |
---|---|
C# - Design Pattern / 디자인 패턴의 종류와 간단한 정리 (0) | 2019.07.30 |
C# - 추상 클래스, 가상 클래스 - abstract, virtual 사용법 (2) | 2019.07.11 |
C# - interface 인터페이스 사용법과 원리 (0) | 2019.07.10 |
C# - ConcurrentBag 사용법, 안전하게 데이터 관리하기 (0) | 2019.07.09 |