먼저 키워드를 다루기 전에 배경을 서술해보자
(이하 메서드는 함수라고 칭할 것임. 엄연히 메서드가 클래스 내 함수를 칭하긴 하나, 나한텐 함수라는 말이 더 입에 잘 달라붙는다)

1) 다형성
2) 그래서 new 키워드는 뭔데?
3) 그럼 override는 뭔데?
4) new와 override 결과물이 달라지는 마법
5) new와 override 차이
1) 다형성
객체지향 언어의 특징 중 하나로, 동일한 함수가 상황에 따라 다르게 사용되는 기법이다
그 방법으로 오버로딩과 오버라이딩이 있으며, 오버로딩은 함수 이름은 같되, 입력받는 매개변수를 다르게 하여 각각 다르게 처리하는 것이다. (이는 계산기 프로그램을 만들때 사용하는 기법인듯 하다)
오버라이드는 부모 클래스를 상속받는 자식 클래스에서, 부모 함수를 갈아끼워 쓰는 방법이다. 부모 함수에 virtual이나 abstract 키워드가 있으면, 자식 함수에서 override하여 함수를 다시 작성해줘야 한다.
오버라이딩에는 override 키워드가 주로 언급되는데, new 키워드도 같이 다뤄보려고 한다
2) 그래서 new 키워드는 뭔데?
new 키워드는 부모 클래스에 쓰여진 함수를 가려준다.(hide)
아래의 코드 예시를 봐보자
using System;
class Parent {
public void Output() {
Console.WriteLine("내가 니 부모다");
}
}
class Son : Parent {
public new void Output() {
Console.WriteLine("그럼 전 아들이겠네요");
}
}
class Program {
public static void Main() {
Parent p = new Parent();
p.Output();
Son s = new Son();
s.Output();
}
}
<출력>
내가 니 부모다
그럼 전 아들이겠네요
부모 클래스에서 정의된 Output 함수를 상속받은 자식 클래스에서 new 키워드를 사용해, 원본 부모함수의 내가 니 부모다를 가릴 수 있다.
그런데 혹여나 자식 함수에서 new 키워드를 빼먹으면...?
<출력>
Main.cs(10,17): warning CS0108: `Son.Output()' hides inherited member `Parent.Output()'.
Use the new keyword if hiding was intended
Main.cs(4,17): (Location of the symbol related to previous warning)
Compilation succeeded - 1 warning(s)
내가 니 부모다
그럼 전 아들이겠네요
친절하게 작동은 되지만 경고가 든다
'너가 부모 함수를 숨길 의도가 있었다면 new 키워드를 붙이렴' 라는 뜻이다
3) 그럼 override는 뭔데?
override 키워드는 부모 클래스에 쓰여진 함수를 갈아끼운다.("over"ride)
예시로 위에 new로 작성했던 코드를 override로 바꿔보았다
using System;
class Parent {
public virtual void Output() {
Console.WriteLine("내가 니 부모다");
}
}
class Son : Parent {
public override void Output() {
Console.WriteLine("그럼 전 아들이겠네요");
}
}
class Program {
public static void Main() {
Parent p = new Parent();
p.Output();
Son s = new Son();
s.Output();
}
}
<출력>
내가 니 부모다
그럼 전 아들이겠네요
아까 new 키워드의 코드로 작성했던 결과물과 별반 다르지 않아 보인다
숨기기와 갈아끼우기의 차이는 있어도, 사람 맨눈으로 보이기엔 결과물은 또이또이한 듯 하다
그런데 혹여나 자식 함수에서 override 키워드를 빼먹으면...?
Main.cs(10,17): warning CS0114: `Son.Output()' hides inherited member `Parent.Output()'.
To make the current member override that implementation, add the override keyword.
Otherwise add the new keyword
Main.cs(4,25): (Location of the symbol related to previous warning)
Compilation succeeded - 1 warning(s)
내가 니 부모다
그럼 전 아들이겠네요
우리의 친절한 C#씨는 작동해주나 경고를 준다
'자식 클래스에서 해당 함수를 갈아끼우고 싶으면 override 키워드를 쓰시고, 그렇지 않으면 new 키워드를 붙여서 구분 좀 해주십쇼' 라는 뜻이다
사실 결과물만 보면 별반 다르지 않다.. 그렇다면 새로 할당하는 객체를 다르게 작성하며 그 차이점을 알아볼 필요가 있다

4) new와 override 결과가 달라지는 마법
메인 함수에서 새로 생성되는 객체를 조금 다르게 적어보려 한다.
Parent p = new Parent();
p.Output();
Son s = new Son();
s.Output();
이 아니라,
Parent p = new Son();
p.Output();
으로, Parent p = new Parent()처럼 선언 타입과 실제 타입이 다르면 차이점을 확인할 수 있다!
using System;
class Parent {
public void Output() {
Console.WriteLine("내가 니 부모다");
}
}
class Son : Parent {
public new void Output() {
Console.WriteLine("그럼 전 아들이겠네요");
}
}
class Program {
public static void Main() {
Parent p = new Son();
p.Output();
}
}
<출력>
내가 니 부모다
new 키워드로 작성했을 때는 부모 함수의 것이 출력된다
using System;
class Parent {
public virtual void Output() {
Console.WriteLine("내가 니 부모다");
}
}
class Son : Parent {
public override void Output() {
Console.WriteLine("그럼 전 아들이겠네요");
}
}
class Program {
public static void Main() {
Parent p = new Son();
p.Output();
}
}
<출력>
그럼 전 아들이겠네요
override 키워드로 작성했을 때는 자식 함수의 것이 출력된다
new 키워드: 부모 출력
override 키워드: 자식 출력
인 셈이다.
5) new와 override 차이
new는 선언 타입(=참조 타입, 왼쪽)을 기준으로, Override는 실제 타입(=객체 타입, 오른쪽)을 기준으로 한다.
Parent p = new Son();
new는 Parent가 기준이고 Override는 Son이 기준이다.
new는 왼쪽 Parent 기준으로, Parent에 정의된 기능까지만 허용한다.
Parent.Output()과 Son.Output()은 완전히 다른 별개의 함수이기 때문에, 참조 타입에 따라 호출 대상이 결정된다.
반면에 override는 오른쪽 Son이라는 실제 객체 타입을 보고, 실행할 함수를 결정하는 것이다
그러한 점에서 override가 추상 혹은 가상함수를 정말로 교체한다는 점에 더 가깝다. new는 키워드만 사용한다면 일반함수를 간단히 교체하는데 편하기 때문에 이쪽에 유용할 것 같다

참고 사이트:
Difference between new and override
Wondering what the difference is between the following: Case 1: Base Class public void DoIt(); Case 1: Inherited class public new void DoIt(); Case 2: Base Class public virtual void DoIt(); Ca...
stackoverflow.com
'Study' 카테고리의 다른 글
| [자료구조] 양방향 연결리스트 (0) | 2026.03.07 |
|---|---|
| [자료구조] 단방향 연결리스트 (0) | 2026.03.06 |
| [C++] Call by reference vs Call by Value 시간복잡도 (0) | 2026.01.08 |
| [C++] Array와 Pointer (0) | 2025.02.05 |
| [그래픽스] 벡터의 내적과 외적을 이해해보자 (0) | 2025.01.23 |