C# new 대 override

Muhammad Maisam Abbas 2024년2월16일
  1. C#의 new 키워드
  2. C#의 override 키워드
C# new 대 override

이 자습서에서는 C#에서 new 키워드와 override 키워드의 차이점에 대해 설명합니다.

C#의 new 키워드

new 키워드는 C#에서 매우 일반적입니다. 일반적으로 연산자, 수정자 및 제약 조건의 세 가지 고유한 위치에서 사용할 수 있습니다.

new 키워드의 가장 인기 있는 첫 번째 용도는 C#에서 클래스 개체를 만들고 해당 클래스 생성자를 호출하는 연산자입니다. new 키워드를 사용하면 intfloat와 같은 값 유형 객체가 스택 내부에 생성되고 사용자 정의 클래스와 같은 참조 유형 객체는 힙 내부에 생성됩니다.

연산자로 new 키워드를 활용하면서 명심해야 할 점으로는 메모리를 객체에 할당할 뿐 이전에 동일한 범위에 의존했던 메모리를 파괴하지 않으며 C#에 있는 new 키워드의 기능을 무시할 수 없다는 점이다.

둘째, new 키워드를 수정자로 사용하는 동안 파생 클래스에서 상속된 기본 클래스 멤버를 숨깁니다. 이전 명령문은 상속된 클래스 구성원의 새 정의를 재정의하거나 선언하는 대신 new 키워드가 기본 클래스에서 해당 구성원의 이전 정의를 대체함을 의미합니다.

new 키워드의 세 번째 사용은 이전 두 가지에 비해 상대적으로 흔하지 않습니다. new 키워드를 제약 조건으로 사용하는 동안 일반 형식에는 추가 매개 변수 없이 공용 생성자가 있어야 한다고 지정합니다.

이 접근 방식의 단점은 추상 유형과 함께 사용할 수 없다는 것입니다.

이 자습서에서는 파생 클래스에서 기본 클래스의 정의를 숨기기 위해 new 키워드를 수정자로 사용합니다. C#에서 컴파일러는 기본적으로 상속된 함수의 정의를 암시적으로 숨깁니다.

다음 코드 조각은 new 키워드를 사용하여 파생 클래스에서 상속된 함수의 정의를 명시적으로 숨길 수 있는 방법을 보여줍니다.

public class BaseClass {
  public virtual void fun() {
    Console.WriteLine("Base class");
  }
}

public class DerivedClass : BaseClass {
  public new void fun() { Console.WriteLine("Derived class");
}
public static void Main(string[] args) {
  BaseClass b = new BaseClass();
  DerivedClass d = new DerivedClass();
  BaseClass bd = new DerivedClass();
  b.fun();
  d.fun();
  bd.fun();
}
}

출력:

Base class
Derived class
Base class

처음 두 개체의 출력은 매우 간단합니다. BaseClass 개체 b는 기본 클래스 내부의 fun() 함수를 참조하고 DerivedClass 개체 d는 파생 클래스 내부의 fun() 함수를 참조합니다.

파생 클래스의 참조를 기본 클래스 bd의 객체에 할당하고 fun() 함수를 호출하면 매우 흥미로운 일이 발생합니다. 기본 클래스 내부의 fun() 함수는 이번에도 여전히 실행됩니다.

이는 기본 클래스 내부에 fun() 함수를 구현하는 것이 파생 클래스에서 숨겨져 있기 때문입니다.

new 키워드를 사용하지 않고도 동일한 목표를 달성할 수 있습니다. 다음 코드 스니펫은 new 키워드를 사용하지 않고 동일한 목표를 달성하는 방법을 보여줍니다.

public class BaseClass {
  public virtual void fun() {
    Console.WriteLine("Base class");
  }
}

public class DerivedClass : BaseClass {
  public void fun() {
    Console.WriteLine("Derived class");
  }
  public static void Main(string[] args) {
    BaseClass b = new BaseClass();
    DerivedClass d = new DerivedClass();
    BaseClass bd = new DerivedClass();
    b.fun();
    d.fun();
    bd.fun();
  }
}

출력:

Base class
Derived class
Base class

출력은 이전 접근 방식과 동일합니다. 여기서 유일한 차이점은 이번에는 클래스 멤버를 명시적으로 숨기려면 new 키워드를 사용하라는 컴파일러 경고가 표시된다는 것입니다.

새 키워드가 없는 컴파일러 경고

C#의 override 키워드

C#에서 override 수정자는 기본 클래스에서 상속된 메서드를 확장합니다. override 키워드는 기본 클래스에서 상속된 virtual 메소드의 새로운 구현을 제공합니다.

여기서 주목해야 할 한 가지는 override 키워드를 사용하여 비가상 또는 정적 메소드를 확장할 수 없다는 것입니다. 기본 클래스의 함수는 가상이거나 추상이거나 다른 상위 클래스에 의해 재정의되어야 합니다.

이전 예제의 컨텍스트에서 다음 코드 조각은 override 수정자를 사용하여 기본 클래스에서 상속된 virtual 함수의 기능을 확장하는 방법을 보여줍니다.

public class BaseClass {
  public virtual void fun() {
    Console.WriteLine("Base class");
  }
}

public class DerivedClass : BaseClass {
  public override void fun() {
    Console.WriteLine("Derived class");
  }
  public static void Main(string[] args) {
    BaseClass b = new BaseClass();
    DerivedClass d = new DerivedClass();
    BaseClass bd = new DerivedClass();
    b.fun();
    d.fun();
    bd.fun();
  }
}

출력:

Base class
Derived class
Derived class

처음 두 개체의 출력은 매우 간단합니다. BaseClass 개체 b는 기본 클래스 내부의 fun() 함수를 참조하고 DerivedClass 개체 d는 파생 클래스 내부의 fun() 함수를 참조합니다.

new 키워드와의 실제 차이점은 파생 클래스의 참조를 기본 클래스 bd의 객체에 할당하고 fun() 함수를 호출할 때 나타납니다. 앞의 두 예제와 달리 이번에는 파생 클래스의 fun() 함수가 호출됩니다.

override 키워드는 가상 함수의 자식 구현을 부모 개체에 표시하는 데 사용되는 반면 new 키워드는 부모 클래스 개체에서 자식 구현을 숨기는 데 사용됩니다.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

관련 문장 - Csharp Keyword