반응형
sealed는 **“상속 불가”**를 뜻해요.
즉 public sealed class ImageGrabbedEventArgs : EventArgs 라면, 이 클래스를 다른 클래스가 상속(derive)할 수 없습니다.
왜 쓰나요?
- 설계 의도 고정: 이벤트 페이로드 형태를 바꾸지 않도록 방지(파생형으로 변형 금지).
- 안전성: 파생 클래스가 동작을 바꾸어 역호환/버그를 유발하는 것을 차단.
- 성능 이점: JIT가 가상 호출을 줄이고(inlining 등) 최적화할 여지가 생김.
- 간단한 데이터 전달용(EventArgs 계열)은 보통 불변 + sealed로 두는 게 흔한 패턴.
특징 요약
- sealed class → 상속 금지 (하지만 인터페이스 구현은 가능).
- sealed는 클래스에 붙이면 상속을 막고, 메서드에 붙이면 override된 메서드를 그 이후로 더 이상 override 못 하게 막습니다.
간단 예시
public sealed class ImageGrabbedEventArgs : EventArgs
{
public byte[] Buffer { get; }
public int Camera { get; }
public ImageGrabbedEventArgs(byte[] buffer, int camera)
{
if (buffer == null) throw new ArgumentNullException(nameof(buffer));
Buffer = buffer;
Camera = camera;
}
}
// 아래 코드는 컴파일 오류 (sealed 이므로 상속 불가)
public class MyArgs : ImageGrabbedEventArgs { } // ERROR
메서드에 쓰는 경우:
public class Base
{
public virtual void DoWork() { }
}
public class Child : Base
{
public sealed override void DoWork() { /* 고정 */ }
}
public class GrandChild : Child
{
// public override void DoWork() { } // ERROR: sealed로 더 이상 override 불가
}
이 클래스에 sealed를 써야 할까?
- Yes 권장: 이벤트 인자처럼 단순 데이터 전달용이며 동작 확장이 필요 없는 타입은 sealed가 적합합니다(의도 명확 + 안정성 + 미세 성능 이점).
- No 고려: 향후 서브클래싱으로 변형/확장할 필요가 있다면 sealed를 빼세요(대신 인터페이스 도입을 더 권장).
반응형
'C#' 카테고리의 다른 글
error. 이벤트핸들러 이름 충돌 (0) | 2025.09.22 |
---|---|
volatile는 멀티스레드에서 “가벼운 동기화”를 위한 읽기/쓰기 가시성 보장 장치 (0) | 2025.09.19 |
왜 IDisposable을 구현하나요? (0) | 2025.09.19 |
“직접 델리게이트 콜백” → “.NET 표준 이벤트 패턴(Event + EventArgs)” (0) | 2025.09.19 |
C#의 readonly 키워드 (0) | 2025.09.19 |
null-coalescing assignment 연산자(??=) 가 C# 8.0에서 추가된 문법이라, C# 7.3 컴파일러로는 사용할 수 없다는 뜻입니다. (0) | 2025.09.11 |
VisionThread/EmguVision 라이브·검사 공통 파이프라인 리팩토링 (풀코드) (0) | 2025.09.10 |
EmguImage 안에 IInputArray를 반환하는 getter (0) | 2025.09.09 |