본문 바로가기

Programming/CSharp

sealed 키워드를 사용한 클래스 상속 방지

반응형

C++에서는 일반적으로 상속을 막는 방법이 없었습니다.

MFC에서는 CString을 상속해서 확장하는 것을 권하지 않고 있습니다.

(CString은 CStringT 템플릿을 사용하게 되어 있는데 소멸자가 virtual이 아닙니다.)

하지만 이것을 강제할 방법은 없었습니다.

다만 C++11 이후에 상속을 막을 수 있는 키워드가 추가 되었습니다.

다음 링크에서 확인이 가능합니다.

2014/12/21 - [Programming/C++11&14] - [C++11] final과 override

물론 생성자등을 private로 선언하거나 하면, 원하는 기능을 구현할 수는 있습니다.

하지만 C#에서는 좀 더 쉽게 상속을 막을 수 있는 장치가 마련되어 있습니다.

이렇게 무분별한 상속을 막기 위해서 C#에서는 sealed라는 키워드가 있습니다.

상속을 막는 방법은 간단합니다.

class 클래스명에서 맨 앞에 sealed를 붙여주기만 하면 됩니다.

다음과 같이 작성하면 간단하게 상속을 막을 수 있습니다.

sealed class Base

상속을 받아서 기능 확장을 한다거나 하는 것을 원천적으로 막을 수 있습니다.

다음 예제와 같이 사용하시면 됩니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
    sealed class Base
    {

    }
    /*
    class Derived : Base
    {

    }
    */

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Base 클래스가 sealed로 선언이 되었습니다.

그렇기 때문에 주석 부분을 풀게 되면 Derived가 Base를 상속받기 때문에 에러가 발생합니다.

주석을 해제하고 컴파일을 하면 다음과 같은 에러가 출력됩니다.

error CS0509: 'ConsoleApplication5.Derived': cannot derive from sealed type 'ConsoleApplication5.Base'

상속이 객체 지향의 중요한 개념이긴 하지만 불필요한 경우도 있습니다.

그런 상황에서 sealed 키워드를 사용해서 명시적으로 상속을 막을 수 있습니다.

반응형

'Programming > CSharp' 카테고리의 다른 글

String.Split으로 토큰 단위로 파싱하기  (0) 2016.01.23
C#의 Property(속성)  (0) 2014.12.26
C# 물음표 2개(??) 연산자  (0) 2014.12.25
C#의 키워드(Keywords)  (0) 2014.12.25