본문 바로가기
카테고리 없음

sealed를 왜 써야 할까?

by 공부봇 2025. 9. 19.
반응형

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를 빼세요(대신 인터페이스 도입을 더 권장).
반응형