C# sealed 클래스와 메서드: 상속/오버라이딩 제한으로 코드 안전성·성능 높이기
C# sealed 클래스와 메서드 이해하기
이 가이드는 sealed 키워드로 C#에서 상속과 메서드 오버라이딩 제한하는 법을 실전 코드 예제와 함께 설명합니다.
Sealed 클래스 (Sealed Class)
C#에서 sealed 키워드는 클래스 상속 금지. 봉인된 클래스는 파생 타입 가질 수 없음.
예제:
using System;
namespace SealedClass {
sealed class Animal { }
// sealed 클래스 상속 시도 → 컴파일 에러
class Dog : Animal { }
class Program {
static void Main (string [] args) {
Dog d1 = new Dog();
Console.ReadLine();
}
}
}
컴파일러 에러:
error CS0509: 'Dog': cannot derive from sealed type 'Animal'
Sealed 메서드 (Sealed Method)
가상 메서드 오버라이드 시 추가 오버라이딩 방지하려면 override 앞에 sealed 접두사.
예제:
using System;
namespace SealedClass {
class Animal {
public virtual void MakeSound() {
Console.WriteLine("Animal Sound");
}
}
class Dog : Animal {
// 봉인된 오버라이드
sealed public override void MakeSound() {
Console.WriteLine("Dog Sound");
}
}
class Puppy : Dog {
// sealed 메서드 재오버라이드 시도 → 컴파일 에러
public override void MakeSound() {
Console.WriteLine("Puppy Sound");
}
}
class Program {
static void Main (string [] args) {
Puppy d1 = new Puppy();
Console.ReadLine();
}
}
}
결과 에러:
error CS0239: 'Puppy.MakeSound()': cannot override inherited member 'Dog.MakeSound()' because it is sealed
팁: 다단계 상속 체인에서 오버라이드된 메서드 봉인으로 추가 오버라이딩 차단.
왜 Sealed 클래스 사용하는가?
- 보안과 무결성 – Sealed 클래스 확장 불가로 동작 예측 가능, 서브클래스에 의한 변조 방지.
- 성능 – 런타임이 서브클래스 없음 알면 sealed 타입 더 적극 최적화 가능.
- 정적 유틸리티 타입 – 많은 라이브러리 sealed 클래스로 정적 멤버 제공(예: System.Drawing의
Pens).
예: Pens 클래스는 표준 색상용 미리 구성된 Pen 인스턴스 제공:
Pen bluePen = Pens.Blue; // 파란색 펜 표현
Pens이 sealed라 정적 멤버가 다른 타입에 의해 오버라이드/변경 불가.