아카이빙/C#

[C#] 오버라이딩

셩님 2018. 6. 18. 06:41

[C#] 오버라이딩

  • 객체지향의 특징인 다형성(Polymorphism)

  • 같은 이름을 갖는 메소드를 오버라이딩하여 새롭게 구현할 수 있다.

1. virtual-override

class Cat
{
   public virtual void Init()
  {
       Console.WriteLine("고양이다냥!");
  }
}

class CatBlack : Cat
{
   public override void Init()
  {
       base.Init();
       Console.WriteLine("턱시도를 입었다냥");
  }
}

class CatCheese : Cat
{
public override void Init()
  {
       base.Init();
       Console.WriteLine("치즈냥이지롱!");
  }
}
  • 오버라이딩할 메소드는 virtual 로 선언.

  • 상속받은 클래스에서는 override 키워드를 활용해서 메소드를 오버라이딩할 수 있다.

  • 기반 클래스의 메소드를 실행하려면 base.메소드명()을 쓰자.


테스트

class MainApp
{
   static void Main()
  {
       Cat cat = new Cat();
       cat.Init();

       Console.WriteLine();
       CatBlack catBlack = new CatBlack();
       catBlack.Init();

       Console.WriteLine();
       CatCheese catCheese = new CatCheese();
       catCheese.Init();
  }
}

결과

고양이다냥!

고양이다냥!
턱시도를 입었다냥

고양이다냥!
치즈냥이지롱!

2. 메소드 숨기기

  • 메소드를 오버라이딩 하려면 virtual로 선언되어있어야 한다.

  • 그런데, 애초에 설계 단계에서부터 이 메소드가 오버라이딩이 될지 안될지를 알기는 어렵다.

  • 나중에 기존의 Base 클래스의 메소드를 수정하지 않고 오버라이딩을 하고 싶다면, new 한정자를 사용하면 된다.

class Cat
{
   public void Init()
  {
       Console.WriteLine("고양이다냥!");
  }
}

class CatBlack : Cat
{
   public new void Init()
  {
       base.Init();
       Console.WriteLine("턱시도를 입었다냥");
  }
}

class CatCheese : Cat
{
public new void Init()
  {
       base.Init();
       Console.WriteLine("치즈냥이지롱!");
  }
}
  • 결과는 virtual-override 를 사용했을 때와 같다.


3. 오버라이딩 봉인하기

  • virtual로 선언된 가상 메소드를 봉인할 수 있다.

  • Cat을 상속받은 CatBlack 클래스에서는 Init 메소드를 오버라이딩하여 사용할 수 있다.

  • 나중에 CatBlack을 상속받은 클래스가 Init 메소드를 잘 못 오버라이딩하여 오작동할 위험이 있다면 미리 봉인해놓는 게 좋다.

class Cat
{
   public virtual void Init()
  {
       Console.WriteLine("고양이다냥!");
  }
}

class CatBlack : Cat
{
   public sealed override void Init()
  {
       base.Init();
       Console.WriteLine("턱시도를 입었다냥");
  }
}

class CatBlackAndWhite : CatBlack
{
   // 컴파일 에러!! because it is sealed.
public override void Init()
  {
       base.Init();
       Console.WriteLine("나는 누구인가!");
  }
}

참조

  • 뇌를 자극하는 C# 5.0 프로그래밍, 박상현, 한빛미디어


'아카이빙 > C#' 카테고리의 다른 글

[C#] 구조체  (0) 2018.06.18
[C#] 확장 메소드 (Extension Method)  (0) 2018.06.18
[C#] 형변환과 is, as  (0) 2018.06.18
[C#] this() 생성자  (0) 2018.06.18
[C#] 얕은 복사와 깊은 복사  (0) 2018.06.18