Inheritance
상속(Inheritance)은 캡슐화(Encapsulation), 다형성(Polymorphism), 추상화(Abstraction)과 함께 객체 지향 프로그래밍의 세 가지 주요 특성 중 하나이다. 상속을 사용하면 다른 클래스에 정의된 동작을 재정의하여 사용하는 것이기에 재사용성이 좋으며, 확장 및 수정이 용이하다. 멤버가 상속되는 클래스를 기본 클래스 라고 하며, 이를 상속하는 클래스를 파생 클래스 라고 한다.
C#의 상속은 단일상속(하나의 클래스가 단일 클래스에서만 상속할 수 있음)이며, 전이적이라는 특징을 가지고 있다.예를 들어 class C가 class B로부터 파생되고, class B는 class A에서 파생되었다고 가정하자. 이 경우 class C 는 class A와 B 모두에서 상속을 받는 셈이다.
C# 클래스에서 상속하려면 : (콜론) 기호를 사용한다.
class Vehicle
{
public string brand = "Ford";
public void honk()
{
Console.WriteLine("Tuut, tuut!");
}
}
class Car : Vehicle // Vehicle 클래스를 상속받는 Car 클래스
{
public string modelName = "Mustang";
}
class Program
{
static void Main(string[] args)
{
Car myCar = new Car(); // Car 객체 생성
myCar.honk(); // 기본 클래스인 Vehicle에서 호출
Console.WriteLine(myCar.brand + " " + myCar.modelName);
}
}
Overriding VS Overloading
간단히 정의하면 오버로딩은 새로운 메소드를 정의하는 것이고, 오버라이딩은 상속받은 기존의 메소드를 재정의하는 것이다.
❓ How to Override?
1. new
class Vehicle
{
public void honk()
{
Console.WriteLine("Tuut, tuut!");
}
}
class Car : Vehicle
{
public new void honk()
{
Console.WriteLine("Beep, Beep!");
}
}
기본 클래스와 파생 클래스 양쪽에 honk 메소드가 존재하나, 기본 메소드를 파생 메소드가 덮어쓰게 되어, 실행 결과가 Car의 honk로 나오게된다.(Overriding) 이때, 재정의한 함수 앞에는 new 키워드를 붙여준다.
2. virtual, override
class Vehicle
{
public virtual void honk()
{
Console.WriteLine("Tuut, tuut!");
}
}
class Car : Vehicle
{
public override void honk()
{
Console.WriteLine("Beep, Beep!");
}
}
new 키워드는 파생 클래스의 메소드에만 작성해주는 방법이었다면 virtual과 override 키워드는 조금 더 명시적으로 오버라이딩을 표시할 수 있다. 기본 클래스의 메소드에는 virtual, 파생 클래스의 메소드에는 override 키워드를 붙여 두 클래스간의 관계가 상속이며 오버라이딩 되었음을 직접적으로 보여준다.
3. abstract, override
abstract class Vehicle
{
public abstract void honk();
}
class Car : Vehicle
{
public override void honk()
{
Console.WriteLine("Beep, Beep!");
}
}
virtual / override 키워드와 비슷하게 양쪽 모두에게 키워드를 명시해준다. virtual 키워드와의 가장 큰 차이점은 abstract를 사용한 메소드는 불완전하여 파생 클래스에서 반드시 재정의를 해주어야한다는 것이다. 기본 클래스에서는 여러 파생 클래스에서 공유하여 사용할 공통적인 정의를 마련해주는 역할을 한다.
상속을 받는 클래스에서 반드시 재정의하도록 유도하고 싶을 때, Interface(인터페이스) 를 사용할 수도 있다. abstract와 비슷하지만 멤버변수를 사용할 수 없다.
'Unity' 카테고리의 다른 글
(Unity6) Script Template (0) | 2025.01.08 |
---|