NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 17-11. 봉인 클래스와 맴버. (Sealed)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 오늘은 sealed(봉인) 한정자에 대해서 알아보도록 하겠습니다. 이 키워드는 자주 사용되지 않는 "한정자"지만, 그래도 어떤 용도로 사용되며 의미가 무엇인지는 알고 있어야 합니다.

     

    sealed 한정자는 2가지 용도로 사용됩니다. 클래스에 사용될 때는 다른 클래스가 상속받지 않도록 합니다. 클래스의 맴버에 사용될 때는 Base Class의 가상 메서드나 속성을 재정의하는 메서드 또는 속성을 재정의하지 못하도록 합니다. 좀 더 쉽게 말해서 sealed 한정자를 이용하여 클래스 또는 클래스의 맴버를 봉인하게 되면, 이를 상속받거나 재정의 할 수 없게된다는 의미입니다. 참고로, 구조체는 암시적으로 봉인되므로 상속할 수 없습니다.

     

    아래 예제를 통해 봉인 클래스와 맴버에 대해서 이해할 수 있습니다.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace SealedClass
    {
        abstract class Regressor
        {
            abstract public void Step();
     
            abstract public void Step2();
     
            virtual public void Model()
            {
                // 분석 모델은 기본 형식을 가진다.        
            }
        }
     
        sealed class LinearRegressor : Regressor
        {
            public override void Step()
            {
                throw new NotImplementedException();
            }
     
            public override void Step2()
            {
                throw new NotImplementedException();
            }
        }
     
        class RotateRegressor : Regressor
        {
            public override void Step()
            {
                throw new NotImplementedException();
            }
     
            public override void Step2()
            {
                throw new NotImplementedException();
            }
     
            public sealed override void Model()
            {
                base.Model();
            }
        }
     
        class DoubleLinearRegressor : LinearRegressor { }
     
        class PhotoModelRegressor : RotateRegressor
        {
            public override void Step() { base.Step(); }
            public override void Step2() { base.Step2(); }
            public override void Model() { base.Model(); }
        }
    }

     

     

    위 코드는 컴파일 에러가 발생됩니다. 아래 그림처럼 sealed 한정자를 사용했기 때문에 더이상 LinearRegressor를 확장하거나 수정할 수 없게됩니다. 보통 이렇게 클래스를 봉인하는 이유는 파생 클래스에서 수정되거나 확장되면 어떠한 결과를 초래할지 예상할 수 없는 경우입니다. 또는, 이미 완벽하게 구현되어 더이상 기능을 확장할 필요가 없을 때도 사용되곤 합니다. 대부분 민감한 부분에 제한적으로 사용하고 있는데, IO가 일어나는 로깅이나 소켓, Database Factory등등에 사용됩니다.

    4jFIya1.png

     

     

    클래스의 멤버에 사용되면 파생된 클래스에서 재정의할 수 없도록합니다. 이는 파생된 클래스에서 멤버를 숨기기도 합니다. 이 때 숨긴 메서드를 만들려면 new를 사용할 수 있습니다. 기본 클래스(Base Class)에서 너무 많은 기능을 제공한다던가 유사한 이름의 기능을 가진 많은 메소드가 있을 때 혼란을 방지하기 위해 멤버를 봉인하기도 합니다.

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.