Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# virtual vs sealed vs new vs abstract 키워드 핵심 정리

C#에서 클래스와 메서드의 상속 및 재정의 동작을 제어하는 대표적인 키워드로 virtual, sealed, new, abstract가 있습니다. 각 키워드의 역할과 사용 시점을 정확히 이해하면 객체 지향 설계를 훨씬 유연하고 안전하게 할 수 있습니다.

virtual — 메서드 재정의 허용하기

virtual 키워드는 파생 클래스(자식 클래스)에서 해당 메서드를 재정의(override)할 수 있도록 허용합니다. 부모 클래스의 메서드를 자식 클래스에서 다르게 동작하게 만들고 싶다면, 부모 클래스의 메서드를 virtual로 선언해야 합니다.

즉, 다형성(polymorphism)을 구현하기 위한 기본 전제 조건이라고 할 수 있습니다.

sealed — 상속과 재정의 차단하기

클래스에 sealed 키워드를 사용하면 그 클래스는 더 이상 상속될 수 없습니다. 단, 추상(abstract) 클래스는 본질적으로 상속을 전제로 하기 때문에 sealed로 선언할 수 없습니다.

메서드 수준에서도 sealed를 적용할 수 있는데, 이 경우 해당 메서드는 더 이상 재정의되지 않습니다. 주의할 점은 sealed 메서드는 반드시 파생 클래스에 속해야 하며, 이미 override된 메서드여야 한다는 것입니다. 즉, sealed override 형태로만 사용됩니다.

public sealed override void getResult() { }

이렇게 하면 이 메서드를 상속받는 하위 클래스에서 더 이상 오버라이드할 수 없어, 의도치 않은 동작 변경을 방지할 수 있습니다.

new — 부모 메서드 숨기기(Shadowing)

new 키워드는 부모 클래스의 메서드를 재정의하는 것이 아니라, 파생 클래스에서 부모의 메서드를 숨기고(hiding) 새로운 메서드를 정의할 때 사용합니다. 이를 섀도잉(Shadowing)이라고 부릅니다.

public new string getResult()

override와 달리 new로 숨긴 메서드는 참조 타입이 부모인지 자식인지에 따라 호출되는 메서드가 달라집니다. 따라서 다형성이 필요한 경우에는 virtual + override 조합을 쓰는 것이 올바른 선택입니다.

abstract — 구현을 강제하는 추상화

abstract 키워드가 붙은 클래스는 인스턴스를 직접 생성할 수 없으며, 하나 이상의 추상 메서드를 포함할 수 있습니다. 추상 메서드는 선언만 존재하고 구현체가 없으며, 반드시 파생 클래스에서 구현해야 합니다.

abstract class Vehicle

예를 들어 Vehicle 같은 추상 클래스는 '탈것'이라는 공통 개념만 정의하고, 실제 동작 방식은 Car, Bike 등의 파생 클래스가 각자 구현하도록 강제하는 역할을 합니다.

정리

  • virtual: 자식 클래스에서 재정의 가능하도록 허용
  • sealed: 클래스의 상속 또는 메서드의 추가 재정의를 차단
  • new: 부모 메서드를 숨기고 새 메서드 정의(섀도잉)
  • abstract: 구현 없는 선언만 제공하며, 자식 클래스의 구현을 강제

네 가지 키워드의 차이를 명확히 구분해 두면 상속 구조 설계 시 발생할 수 있는 혼란과 버그를 크게 줄일 수 있습니다.