컴퓨터프로그래밍/C#

C# - 메소드 메소드 재정의(override), 숨기기

zelkova 2016. 11. 27. 07:46


<목차로 돌아가기>


  메소드 재정의(override)


※ override와 overload를 햇갈리지 말자.


메소드 재정의(override)는 상속 관계의 클래스 사이에서 부모클래스의 메소드를 자식클래스가 부모의 메소드를 받아서 다른 형태로 바꾸어 사용하는 것을 말한다.


사용방법은 아래와 같다.

//부모클래스가 애래와 같이 있다면

class parent

{

   public virtual void Name()

   {

      Console.WriteLine("부모의 메소드");

   }

}


// 자식클래스에서 상속받아 메소드를 재정의해서 사용

class Child : parent

{

   public override void Name()

   {

      Console.WriteLine("자식의 메소드");

   }

}



예제)

  1.  using System;
  2.  using System.Collections.Generic;
  3.  using System.Linq;
  4.  using System.Text;
  5.  using System.Threading.Tasks;

  6.  namespace ConsoleApplication2
  7.  {
  8.     public class Parent
  9.     {
  10.         public virtual void Name()
  11.         {
  12.             Console.WriteLine("부모의 유산");
  13.         }
  14.     }
  15.     class FirstChild : Parent
  16.     {
  17.         public override void Name()
  18.         {
  19.             Console.WriteLine("첫째 : 내꺼임");
  20.         }
  21.     }
  22.     class SecondChild : Parent
  23.     {
  24.         public override void Name()
  25.         {
  26.             Console.WriteLine("둘째 : ㅈ까 내꺼야");
  27.         }
  28.     }
  29.     class Application
  30.     {
  31.         static void Main(string[] args)
  32.         {
  33.             Parent parent = new Parent();
  34.             FirstChild firstChild = new FirstChild();
  35.             SecondChild secondChild = new SecondChild();

  36.             parent.Name();
  37.             firstChild.Name();
  38.             secondChild.Name();
  39.         }
  40.     }
  41.  }


결과)



가상메소드를 작성할때 주의할점

ㆍ가상메소드는 static으로 선언하지 못한다.(객체를 생성해야되서 안됨)

ㆍ가상메소드는 private 접근지정자로 선언하지 못한다.



  메소드 숨기기


파생(자식) 클래스에서 메소드를 재정의하려는 의도가 아니고 새로운 메소드를 추가했는데, 우연치않게 기반 클래스의 가상 메소드, 혹은 일반 메소드와 중복되는 이름을 포함할 수도 있다. 이럴 때 new 키워드를 사용해서 해결한다.


    public class Parent

    {

        public void Name()

        {

            Console.WriteLine("부모의 유산");

        }

    }

    class FirstChild : Parent

    {

        public void Name()

        {

            Console.WriteLine("첫째 : 내꺼임");

        }

    }


상속하고 같은이름의 메소드가 존재시 아래와 같은 경고가 뜸


이를 해결하기 위해서 아래와 같이 new를 자식클래스의 메소드앞에 쑤셔넣어주면 됨. 


    public class Parent

    {

        public void Name()

        {

            Console.WriteLine("부모의 유산");

        }

    }

    class FirstChild : Parent

    {

        new public void Name()

        {

            Console.WriteLine("첫째 : 내꺼임");

        }

    }



반응형

'컴퓨터프로그래밍 > C#' 카테고리의 다른 글

C# - 확장클래스, 분할메소드, 중첩클래스  (0) 2016.11.28
C# - 추상클래스  (0) 2016.11.27
C# - 상속  (0) 2016.11.25
생성자와 소멸자  (0) 2016.11.25
접근제한자와 this  (0) 2016.11.24