📌 메서드 오버라이드
자식클래스에서 부모클래스로부터 상속받은 부모의 메서드를 재정의하여 사용하는 것
- . 부모클래스에서는 오버라이드를 가능하게 하기 위해 'virtual' 이라는 예약어를 메서드 앞에 붙인다.
- . 자식클래스에서는 재정의하여 사용하고 싶으면 'override' 라는 예약어를 메서드 앞에 붙인다.
virtual, override 사용예제
using System;
// 기본 클래스
public class Animal
{
// 가상 메서드
public virtual void MakeSound()
{
Console.WriteLine("동물이 소리를 내고 있습니다.");
}
}
// 파생 클래스
public class Dog : Animal
{
// 부모 클래스의 가상 메서드를 재정의
public override void MakeSound()
{
Console.WriteLine("강아지가 왈왈 짖고 있습니다.");
}
}
class Program
{
static void Main()
{
// 다형성을 통해 파생 클래스의 메서드 호출
Animal myDog = new Dog();
myDog.MakeSound(); // "강아지가 왈왈 짖고 있습니다."
}
}
이 예제에서 Animal 클래스에는 virtual로 선언된 MakeSound 메서드가 있습니다. 그리고 Dog 클래스에서는 이 메서드를 override 키워드를 사용하여 재정의하고 있습니다. Main 메서드에서는 Animal 형식의 변수에 Dog 객체를 할당하고, 다형성을 이용하여 MakeSound 메서드를 호출하면 실제 객체인 Dog 클래스의 메서드가 실행됩니다.
new 키워드
new 키워드를 사용한 메서드 선언은 상속 관계에서 부모 클래스의 메서드를 숨기고 새로운 메서드를 정의하는 데 사용됩니다. 아래는 new 키워드를 사용하여 메서드를 선언하는 간단한 예제입니다:
using System;
class Animal
{
public void ShowDetails()
{
Console.WriteLine("일반 동물입니다.");
}
}
class Dog : Animal
{
public new void ShowDetails()
{
Console.WriteLine("강아지입니다.");
}
}
class Program
{
static void Main()
{
Animal myAnimal = new Dog();
myAnimal.ShowDetails(); // "일반 동물입니다." 출력
Dog myDog = new Dog();
myDog.ShowDetails(); // "강아지입니다." 출력
}
}
base 키워드 사용법
자식클래스의 함수는 base 키워드를 사용해 부모 클래스의 함수를 호출할 수 있음.
ㄴ abstract와는 달리 자식클래스에서 구현은 선택이다(구현 안 하면 부모의 함수 사용)
using System;
// 부모 클래스
public class Shape
{
// 가상 메서드
public virtual void Draw()
{
Console.WriteLine("도형을 그립니다.");
}
}
// 자식 클래스
public class Square : Shape
{
// 부모 클래스의 메서드를 호출하고 새로운 동작 추가
public override void Draw()
{
base.Draw(); // 부모 클래스의 Draw 메서드 호출
Console.WriteLine("그리고 사각형을 그립니다.");
}
}
class Program
{
static void Main()
{
// 다형성을 통해 자식 클래스의 메서드 호출
Shape squareShape = new Square();
squareShape.Draw();
// 출력:
// "도형을 그립니다."
// "그리고 사각형을 그립니다."
}
}
이 예제에서 Shape 클래스에는 Draw라는 가상 메서드가 있습니다. Square 클래스에서는 base 키워드를 사용하여 부모 클래스의 Draw 메서드를 호출하고, 이어서 새로운 동작을 추가하고 있습니다. Main 메서드에서는 다형성을 이용하여 Square 객체에 대해 메서드를 호출하고 결과를 확인할 수 있습니다.
주의사항
virtual 한정자는 static, abstract, private 한정자와 함께 사용할 수 없습니다.
using System;
// 컴파일 오류가 발생하는 예제
// 부모 클래스
public class MyBaseClass
{
// static 키워드와 함께 virtual 사용 불가
// static virtual void MyStaticVirtualMethod() { }
// abstract 키워드와 함께 virtual 사용 불가
// abstract virtual void MyAbstractVirtualMethod();
}
// 자식 클래스
public class MyDerivedClass : MyBaseClass
{
// private 키워드와 함께 virtual 사용 불가
// private virtual void MyPrivateVirtualMethod() { }
}
class Program
{
static void Main()
{
// 이 코드는 컴파일 오류를 발생시킵니다.
}
}
이 예제에서 MyBaseClass는 virtual 키워드와 함께 static, abstract, private 키워드를 사용하려고 시도했습니다. 하지만 이러한 조합은 허용되지 않으며 컴파일 오류가 발생합니다.
📌 주의해야 할 점
부모를 상속한 상태에서 같은 메서드가 있을 때 메소드 호출하는 방식이 다른 경우가 있는데 이유는 아래와 같습니다
- k.MadeWhere(); - Korea 클래스 호출:
- MadeWhere 메서드는 Maker 클래스에서 선언되어 있지만, Korea 클래스에서 오버라이드되어 있습니다.
- 따라서 k가 실제로 참조하는 객체인 Korea 클래스의 MadeWhere 메서드가 호출됩니다.
- k.Warehouse(); - Maker 클래스 호출:
- Warehouse 메서드는 Maker 클래스에서 선언되어 있고, Korea 클래스에서는 오버라이드되지 않았습니다.
- 따라서 k가 Maker 타입의 참조 변수이고, 호출하는 메서드가 오버라이드되지 않았으므로 Maker 클래스의 Warehouse 메서드가 호출됩니다.
이렇게 요약하면, MadeWhere는 오버라이드된 메서드로 인해 실제 객체의 타입을 따르고, Warehouse는 오버라이드되지 않았기 때문에 부모 클래스의 메서드를 호출하는 것입니다.
'정리필요' 카테고리의 다른 글
C# 일반화 메서드 정리 (2) | 2024.03.08 |
---|---|
C# 연산자 오버로딩 (일 + 일 = 귀요미) (1) | 2024.03.08 |
C# 추상화 .... 추상클래스 개념 정리 .... (2) | 2024.03.06 |
C# 배열 초기화 하는 여러 방법 (0) | 2024.03.06 |
C# 값형식 vs 참조형식 (0) | 2024.03.06 |