A. 오버라이딩과 다형성
다형성(Polymorphism) : 객체가 여러 형태를 가질 수 있음을 의미한다.
오버라이딩(Overriding) : 메소드 재정의
다형성은 원래 하위 형식 다형성(Subtype Polymorphism)의 준말이다. 다시말해 자신으로부터 상속받아 만들어진 파생클래스를 통해 다형성을 실현한다.
이때, 오버라이딩은 virtual 키워드를 통해 부모클래스에서 정의되고, 자식클래스에서 override 키워드를 통해 재정의한다.
class ArmorSuite
{
public virtual void Initialize()
{
Console.WriteLine("Armored");
}
}
class IronMan : Armorsuite
{
public override void Initialize()
{
base.Initialize();
Console.WriteLine("IronMan");
}
}
class WarMachine : ArmorSuite
{
public override void Initialize()
{
base.Initialize();
Console.WriteLine("WarMachine");
}
}
* 주의할점 : private으로 선언된 메소드는 오버라이딩 할수없다.
-> 파생클래스에서 부모의 private메소드는 보이지도않기때문에, 같은이름, 같은형식, 같은매개변수를 이용해서 선언해도 컴파일러는 부모클래스의 메소드를 재정의한다고 생각하지 않으므로.
B. 메소드 숨기기
부모클래스에 메소드정의시 오버라이딩이 될지 안될지 모르기때문에 virtual 안넣었을경우, 자식클래스에서 메소드 오버라이딩을 하려면 new 한정자로 수식한다. (생성자의 new 연산자와는 완전히 다름)
메소드 숨기기는 메소드 오버라이딩과 같아보이지만 차이점이 존재한다. 이름 그대로 메소드를 숨기고있을뿐이므로 다음과 같이 객체 선언시 부모객체의 메소드가 실행된다.
class Base
{
public void MyMethod()
{
Console.WriteLine("Base.MyMethod()");
}
}
class Derived : Base
{
public new void MyMethod()
{
Console.WriteLine("Drived.MyMethod()");
}
}
static void main(string[] args)
{
Derived dr = new Derived();
dr.MyMethod(); // Drived.MyMethod()가 출력됨
Base base2 = new Derived();
base2.MyMethod(); // 숨겨져있던 Base.MyMethod()가 출력됨
}
C. 오버라이딩 봉인하기
클래스를 상속이 안되게 봉인하는것처럼 메소드도 오버라이딩 되지않도록 봉인할 수 있다.
class Base
{
public virtual void SealMe()
{
}
}
class Derived : Base
{
public sealed override void SealMe() { } //sealed
}
class WantToOverride : Derived
{
public override void SealMe() //여기서 컴파일 에러 발생
{
}
}
오버라이딩한 메소드는 파생클래스의 파생클래스에서도 자동으로 오버라이딩이 가능하므로, 이런 상황을 막으려면 sealed 한정자를 사용한다.
'C# 공부 > C# 기본 문법' 카테고리의 다른 글
인터페이스 (선언과 사용법, 상속, 다중상속) (0) | 2020.07.26 |
---|---|
클래스 - 4 (중첩클래스, 분할클래스, 확장메소드, 구조체, 튜플) (0) | 2020.07.25 |
클래스 - 2 (this(), 접근한정자, 상속, base키워드, is/as, 기반/파생 클래스간 형변환) (0) | 2020.07.24 |
클래스 - 1 (Static, 얕은/깊은 복사) (0) | 2020.07.23 |
메소드(Method) - 2 (오버로딩, 가변길이 매개변수, 명명된 매개변수, 선택적 매개변수, 로컬함수) (0) | 2020.07.23 |