C#/이것이 C#이닀

25. μ˜€λ²„λΌμ΄λ”©κ³Ό λ‹€ν˜•μ„± virtual, override

Rainbow🌈Coder 2022. 2. 11. 15:07
728x90

μš”μ•½: λ‹€ν˜•μ„±μ΄λž€ 객체가 μ—¬λŸ¬ ν˜•νƒœλ₯Ό κ°€μ§ˆ 수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€.

λ‹€ν˜•μ„±μ€ μ›λž˜ ν•˜μœ„ ν˜•μ‹ λ‹€ν˜•μ„±μ˜ 쀀말이닀.

μžμ‹ μœΌλ‘œλΆ€ν„° 상속받아 λ§Œλ“€μ–΄μ§„ νŒŒμƒν΄λž˜μŠ€λ₯Ό 톡해 λ‹€ν˜•μ„±μ„ μ‹€ν˜„ν•œλ‹€.

μ˜€λ²„λΌμ΄λ”©μ€ νŒŒμƒν΄λž˜μŠ€κ°€ κΈ°λ°˜ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„λœ ν•¨μˆ˜λ₯Ό μž¬μ •μ˜ν•˜λŠ” 것이닀.

μ˜€λ²„λΌμ΄λ”©μ„ 톡해 λ‹€ν˜•μ„±μ΄ μ‹€ν˜„λœλ‹€.

 

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λ‹€ν˜•μ„±μ€ 객체가 μ—¬λŸ¬ ν˜•νƒœλ₯Ό κ°€μ§ˆ 수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€.

 

λ‹€ν˜•μ„±μ€ μ›λž˜ ν•˜μœ„ ν˜•μ‹ λ‹€ν˜•μ„±μ˜ 쀀말이닀.

 

λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν•œ κ°€μ§€ 쑰건이 ν•„μš”ν•˜λ‹€.

 

κ·Έ 쑰건은 λ°”λ‘œ μ˜€λ²„λΌμ΄λ”©μ„ ν•  λ©”μ†Œλ“œκ°€ virtual ν‚€μ›Œλ“œλ‘œ ν•œμ •λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 것이닀.

 

μ˜€λ²„λΌμ΄λ”©μ„ ν•˜λŠ” μΈ‘μ—μ„œλŠ” 기반 ν΄λž˜μŠ€μ— μ„ μ–Έλ˜μ–΄ 있던 λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•˜κ³  μžˆμŒμ„ μ»΄νŒŒμΌλŸ¬μ— μ•Œλ €μ•Ό ν•˜λ―€λ‘œ override둜 ν•œμ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

 

μ–΄λ–€ λ©”μ†Œλ“œκ°€ ν–₯ ν›„ μ˜€λ²„λΌμ΄λ”©μ΄ 될지 μ•ˆ 될지λ₯Ό νŒλ‹¨ν•œλŠ 것은 깊이 μƒκ°ν• μˆ˜λ‘, 또 많이 κ²½ν—˜ν• μˆ˜λ‘ 쒋은 닡을 μ–»κΈ°λŠ” ν•˜μ§€λ§Œ 곡식은 μ—†λ‹€.

차후에 μ—…κ·Έλ ˆμ΄λ“œκ°€ μžˆμ„ κ²ƒμœΌλ‘œ κ³ λ €λ˜λŠ” λ©”μ†Œλ“œλŠ” virtual둜 μ„ μ–Έν•˜κ³ 

μž¬μ •μ˜ν•  λ•Œ override ν‚€μ›Œλ“œλ₯Ό μž‘μ„±ν•΄μ£Όλ„λ‘ ν•˜μž.

 

 

<private둜 μ„ μ–Έν•œ λ©”μ†Œλ“œλŠ” μ˜€λ²„λΌμ΄λ”© ν•  수 μ—†λ‹€.>

private둜 μ„ μ–Έλœ λ©€λ²„λŠ” μ–΄μ°¨ν”Ό νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ 보이지도 μ•ŠλŠ”λ‹€.

 

같은 이름, 같은 ν˜•μ‹, 같은 맀개 λ³€μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ μ„ μ–Έν–ˆλ‹€ ν•˜λ”λΌλ„ μ»΄νŒŒμΌλŸ¬λŠ” 기반 클래슀의 λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•œλ‹€κ³  μƒκ°ν•˜μ§€ μ•Šκ³  μ „ν˜€ μ—†μ—ˆλ˜ λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•œλ‹€κ³  κ°„μ£Όν•  것이닀.

 

 

<예제 ν”„λ‘œκ·Έλž¨>

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace Overriding
{
    class ArmorSuite
    {
        public virtual void Initialize()
        {
            WriteLine("Armored");
        }
    }
    class IronMan : ArmorSuite
    {
        public override void Initialize()
        {
            base.Initialize();
            WriteLine("Repulsor Rays Armed");
        }
    }

    class WarMachine : ArmorSuite
    {
        public override void Initialize()
        {
            base.Initialize();
            WriteLine("Double-Barrel Cannons Armed");
            WriteLine("Micro-Rocket Launcher Armed");
        }
    }
    class MainApp
    {
        static void Main(string[] args)
        {
            WriteLine("Creating ArmorSuite...");
            ArmorSuite armorSuite = new ArmorSuite();
            armorSuite.Initialize();

            WriteLine("\nCreating IronMan...");
            ArmorSuite ironman = new IronMan();
            ironman.Initialize();

            WriteLine("\nCreating WarMachine...");
            ArmorSuite warmachine = new WarMachine();
            warmachine.Initialize();
        }
    }
}

<좜λ ₯ κ²°κ³Ό>

Creating ArmorSuite...
Armored

Creating IronMan...
Armored
Repulsor Rays Armed

Creating WarMachine...
Armored
Double-Barrel Cannons Armed
Micro-Rocket Launcher Armed

 

<ν…ŒμŠ€νŠΈ μ½”λ“œ1> : μ•„λ¬΄λŸ° ν‚€μ›Œλ“œ 없이 μž¬μ •μ˜

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace Overriding
{
    class Base
    {
        public void MyMethod()
        {
            WriteLine("Base.MyMethod()");
        }
    }
    class Derived : Base
    {
        public void MyMethod()
        {
            WriteLine("Derived.MyMethod()");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            WriteLine("1...");
            Base test1 = new Base();
            test1.MyMethod();


            WriteLine("\n2...");
            Derived test2 = new Derived();
            test2.MyMethod();
        }
    }
}

<좜λ ₯ κ²°κ³Ό> μ˜λ„ν•œ λŒ€λ‘œ 좜λ ₯

1...
Base.MyMethod()

2...
Derived.MyMethod()

<ν…ŒμŠ€νŠΈ μ½”λ“œ2> νŒŒμƒ 클래슀의 μž¬μ •μ˜ λ©”μ†Œλ“œμ— new ν‚€μ›Œλ“œ μΆ”κ°€

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace Overriding
{
    class Base
    {
        public void MyMethod()
        {
            WriteLine("Base.MyMethod()");
        }
    }
    class Derived : Base
    {
        public new void MyMethod()
        {
            WriteLine("Derived.MyMethod()");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            WriteLine("1...");
            Base test1 = new Base();
            test1.MyMethod();


            WriteLine("\n2...");
            Derived test2 = new Derived();
            test2.MyMethod();
        }
    }
}

<좜λ ₯ κ²°κ³Ό> μ˜λ„ν•œ λŒ€λ‘œ 좜λ ₯

1...
Base.MyMethod()

2...
Derived.MyMethod()

<ν…ŒμŠ€νŠΈ μ½”λ“œ3> 기반 클래슀의 μž¬μ •μ˜ν•  λ©”μ†Œλ“œμ— virtual ν‚€μ›Œλ“œ μΆ”κ°€

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace Overriding
{
    class Base
    {
        public virtual void MyMethod()
        {
            WriteLine("Base.MyMethod()");
        }
    }
    class Derived : Base
    {
        public void MyMethod()
        {
            WriteLine("Derived.MyMethod()");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            WriteLine("1...");
            Base test1 = new Base();
            test1.MyMethod();


            WriteLine("\n2...");
            Derived test2 = new Derived();
            test2.MyMethod();
        }
    }
}

<좜λ ₯ κ²°κ³Ό> μ˜λ„ν•œ λŒ€λ‘œ 좜λ ₯

1...
Base.MyMethod()

2...
Derived.MyMethod()

<ν…ŒμŠ€νŠΈ μ½”λ“œ> - 컴파일 μ—λŸ¬

심각도 μ½”λ“œ μ„€λͺ… ν”„λ‘œμ νŠΈ 파일 쀄 λΉ„ν‘œμ‹œ μ˜€λ₯˜(Suppression) μƒνƒœ
였λ₯˜ CS0506 'Derived.MyMethod()': μƒμ†λœ 'Base.MyMethod()' λ©€λ²„λŠ” virtual, abstract λ˜λŠ” override둜 ν‘œμ‹œλ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ μž¬μ •μ˜ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace Overriding
{
    class Base
    {
        public void MyMethod()
        {
            WriteLine("Base.MyMethod()");
        }
    }
    class Derived : Base
    {
        public override void MyMethod()
        {
            WriteLine("Derived.MyMethod()");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            WriteLine("1...");
            Base test1 = new Base();
            test1.MyMethod();


            WriteLine("\n2...");
            Derived test2 = new Derived();
            test2.MyMethod();
        }
    }
}

<ν…ŒμŠ€νŠΈμ½”λ“œ> 기반 클래슀 λ©”μ†Œλ“œμ— virtual ν‚€μ›Œλ“œ μΆ”κ°€ 및

νŒŒμƒ 클래슀 μž¬μ •μ˜ λ©”μ†Œλ“œμ— override ν‚€μ›Œλ“œ μΆ”κ°€

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace Overriding
{
    class Base
    {
        public virtual void MyMethod()
        {
            WriteLine("Base.MyMethod()");
        }
    }
    class Derived : Base
    {
        public override void MyMethod()
        {
            WriteLine("Derived.MyMethod()");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            WriteLine("1...");
            Base test1 = new Base();
            test1.MyMethod();


            WriteLine("\n2...");
            Derived test2 = new Derived();
            test2.MyMethod();
        }
    }
}

<좜λ ₯ κ²°κ³Ό>

1...
Base.MyMethod()

2...
Derived.MyMethod()

<λ©”μ†Œλ“œ 숨기기>

λ©”μ†Œλ“œ μˆ¨κΈ°κΈ°λŠ” μ™„μ „ν•œ λ‹€ν˜•μ„±μ„ ν‘œν˜„ν•˜μ§€ λͺ»ν•˜λŠ” ν•œκ³„κ°€ μžˆλ‹€. 

λ©”μ†Œλ“œ μˆ¨κΈ°κΈ°λž€, CLRμ—κ²Œ 기반 ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„λœ λ²„μ „μ˜ λ©”μ†Œλ“œλ₯Ό 감좔고

νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„λœ λ²„μ „λ§Œ λ³΄μ—¬μ£ΌλŠ” 것을 λ§ν•œλ‹€.

λ©”μ†Œλ“œ μˆ¨κΈ°κΈ°λŠ” νŒŒμƒ 클래슀 λ²„μ „μ˜ λ©”μ†Œλ“œλ₯Ό new ν•œμ •μžλ‘œ μˆ˜μ‹ν•¨μœΌλ‘œμ¨ ν•  수 μžˆλ‹€.

 

λ‹€μŒμ€ μ—¬λŸ¬κ°€μ§€ ν…ŒμŠ€νŠΈ μ½”λ“œμ΄λ‹€.

<1> λ©”μ†Œλ“œ 숨기기의 경우

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace Overriding
{
    class Base
    {
        public void MyMethod()
        {
            WriteLine("Base.MyMethod()");
        }
    }
    class Derived : Base
    {
        public new void MyMethod()
        {
            WriteLine("Derived.MyMethod()");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            Base baseOrDerived = new Derived();
            baseOrDerived.MyMethod(); //Base.MyMethod()
        }
    }
}

<2> 아무 ν‚€μ›Œλ“œλ„ 없을 경우

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace Overriding
{
    class Base
    {
        public void MyMethod()
        {
            WriteLine("Base.MyMethod()");
        }
    }
    class Derived : Base
    {
        public void MyMethod()
        {
            WriteLine("Derived.MyMethod()");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            Base baseOrDerived = new Derived();
            baseOrDerived.MyMethod(); //Base.MyMethod()
        }
    }
}

<3> 기반클래슀 - virtual ν‚€μ›Œλ“œ νŒŒμƒν΄λž˜μŠ€ - override ν‚€μ›Œλ“œ μžˆμ„ 경우

μ˜λ„ν•œ λŒ€λ‘œ 좜λ ₯

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace Overriding
{
    class Base
    {
        public virtual void MyMethod()
        {
            WriteLine("Base.MyMethod()");
        }
    }
    class Derived : Base
    {
        public override void MyMethod()
        {
            WriteLine("Derived.MyMethod()");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            Base baseOrDerived = new Derived();
            baseOrDerived.MyMethod(); //Derived.MyMethod()
        }
    }
}

<4> virtual ν‚€μ›Œλ“œλ§Œ μžˆμ„ 경우

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace Overriding
{
    class Base
    {
        public virtual void MyMethod()
        {
            WriteLine("Base.MyMethod()");
        }
    }
    class Derived : Base
    {
        public void MyMethod()
        {
            WriteLine("Derived.MyMethod()");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            Base baseOrDerived = new Derived();
            baseOrDerived.MyMethod(); //Base.MyMethod()
        }
    }
}
728x90