[C#] virtual, override

Young·2024년 5월 28일
1

C#

목록 보기
4/9
using System;

namespace thisIsCSharp
{
    class Beverage      // 부모 - 마실 것
    {
        public virtual void Drinking()  //virtual 오버라이딩 할 메소드 하나
        {
            Console.WriteLine("뭔가 마시고 싶은데...");
        }
    }

    class Coffee : Beverage
    {
        public override void Drinking() // override 오버라이딩 받아올 거야
        {
            base.Drinking();
            Console.WriteLine("커피를 마시자!");
        }
    }

    class Lemonade : Beverage
    {
        public override void Drinking()
        {
            base.Drinking();
            Console.WriteLine("레모네이드를 마시자!");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            Console.WriteLine("목이 마르네...");
            Beverage beverage = new Beverage();
            beverage.Drinking();

            Console.WriteLine();
            
            Console.WriteLine("카페인이 부족해...");
            Beverage coffee = new Coffee();
            // Coffee coffee = new Coffee();
            coffee.Drinking();

            Console.WriteLine();

            Console.WriteLine("상큼한 게 먹고 싶어...");
            Beverage lemonade = new Lemonade();
            // Lemonade lemonade = new Lemonade();
            lemonade.Drinking();
        }
    }
}

마실 것이라는 클래스를 커피와 레모네이드가 각각 상속받고 마실 것에 있는 메소드 Drinking에 virtual 을 붙여 Drinking을 재정의하는 걸 허락해주는 것이다.

virtual이 붙어있는 메소드만 재정의 할 수 있다.
virtual은 허락을 고지하는 개념이다.
이걸 override로 재정의(오버라이딩) 하는 것이다.

재정의하기 위해서 기존 값에 접근해야 하기 때문에 private는 오버라이딩 할 수 없다.

protected로 바꾸니 override도 protected로 바꾸라고 떴고(프로젝티드를 퍼블릭으로 가져올 수는 없는 것 같았다.), 다 바꾸고 나서는 메인 메소드에서 보안수준 때문에 접근이 안 돼서 실패했다. 다른 클래스로 쓸 경우에는 퍼블릭으로 써야할 것 같다.

코드 하단에 주석 표시한 것처럼 각각 선언하게 되면 각각의 객체로 선언된다. 지금 코드에서는 두 값이 동일하기 때문에 별 상관없는데 굳이

Beverage ___ = new Lemonade(); 

이런 식으로 쓴 것은 추후 상속받는 자식 클래스들을 배열로 일괄 생성할 수 있기 때문이다. 이럴 때 같이 Beverage로 묶여 있다면 되는데 각자 Coffee 나 Lemonade로 만들면 배열로 묶는 게 안 된다.

profile
Beginner : C#

0개의 댓글