C# 상속과 다형성 마스터하기: 실전 코드 예제
C#에서 상속(Inheritance)이란?
상속은 C# 객체 지향 설계의 초석입니다. 자식 클래스가 부모 클래스의 필드와 메서드를 자동으로 물려받으면서도 그 동작을 재정의하거나 확장할 수 있게 합니다. 이는 코드 재사용을 촉진하고 유지보수를 단순화하며 명확한 계층을 확립합니다.
- 부모 클래스와 자식 클래스 정의
- 자식이 부모 멤버 상속
- 자식이 상속된 동작 수정 가능
- 자식이 자체 멤버 추가 가능
C# 상속 예제
아래는 상속 구현과 protected 멤버 사용을 보여주는 단계별 시연입니다.
1단계 – 기본 클래스 수정
Tutorial.cs를 열고 Tutorial 클래스의 핵심 필드를 protected로 변경합니다:

protected를 사용하면 파생 클래스만 이 필드에 직접 접근할 수 있습니다.
2단계 – 파생 클래스 생성
기본 클래스 정의 뒤에 다음 코드를 Tutorial.cs에 추가합니다:

설명:
- 콜론(
:) 문법으로 Guru99Tutorial을 Tutorial의 자식으로 선언
RenameTutorial 메서드 추가하여 TutorialName에 새 값 할당
TutorialName이 protected이므로 Guru99Tutorial에서 명시적 선언 없이 접근 가능
3단계 – Program.cs에서 파생 클래스 사용
Program.cs 내용을 다음으로 교체합니다:

using System;
namespace DemoApplication {
public class Tutorial {
protected int TutorialID;
protected string TutorialName;
public void SetTutorial(int pID, string pName) {
TutorialID = pID;
TutorialName = pName;
}
public string GetTutorial() {
return TutorialName;
}
}
public class Guru99Tutorial : Tutorial {
public void RenameTutorial(string pNewName) {
TutorialName = pNewName;
}
static void Main(string[] args) {
Guru99Tutorial pTutor = new Guru99Tutorial();
pTutor.RenameTutorial(".Net by Guru99");
Console.WriteLine(pTutor.GetTutorial());
Console.ReadKey();
}
}
}
설명:
- 프로그램이 기본
Tutorial이 아닌 Guru99Tutorial을 인스턴스화
RenameTutorial 호출로 제목 변경
GetTutorial이 기본 클래스에 정의되어 있지만 파생 인스턴스가 직접 호출 가능
이 코드 실행 결과:

C#에서 다형성(Polymorphism)이란?
다형성은 단일 인터페이스가 서로 다른 하위 형태를 나타내게 합니다. C#에서는 주로 메서드 오버로딩이나 오버라이딩으로 나타나며, 동일한 메서드 이름이 매개변수나 컨텍스트에 따라 다양한 작업을 수행하게 합니다.
C# 다형성 예제
동일 클래스 내 메서드 오버로딩을 시연합니다.
1단계 – 기본 클래스 업데이트
Tutorial.cs를 다음처럼 수정합니다:

주요 변경사항:
SetTutorial 메서드에 두 오버로드 추가 – int와 string을 받는 것과 string만 받는 것
- 두 오버로드 모두 해당 필드에 값 할당
2단계 – Program.cs에서 테스트
Program.cs를 다음 코드로 교체합니다:
using System;
namespace DemoApplication {
class Tutorial {
public int TutorialID;
public string TutorialName;
public void SetTutorial(int pID, string pName) {
TutorialID = pID;
TutorialName = pName;
}
public void SetTutorial(string pName) {
TutorialName = pName;
}
public string GetTutorial() {
return TutorialName;
}
static void Main(string[] args) {
Tutorial pTutor = new Tutorial();
pTutor.SetTutorial(1, "First Tutorial");
Console.WriteLine(pTutor.GetTutorial());
pTutor.SetTutorial("Second Tutorial");
Console.WriteLine(pTutor.GetTutorial());
Console.ReadKey();
}
}
}
설명:
- 첫 호출은
id와 name을 두 매개변수 오버로드에 전달
- 두 번째 호출은
name만 전달하여 단일 매개변수 오버로드 호출
콘솔 출력:

고급 시나리오를 위해 GetTutorialID 메서드를 추가하여 ID를 별도로 조회할 수 있습니다.
요약
- 상속은 자식 클래스가 부모 멤버를 상속하고 확장하게 합니다.
- 다형성, 특히 메서드 오버로딩은 단일 메서드 이름이 다른 매개변수 세트에 적응하게 합니다.
- 두 개념 모두 깔끔하고 유지보수 가능하며 재사용 가능한 C# 코드에 필수적입니다.