250x250
Rainbow🌈Coder
My dev NoteπŸ“’
Rainbow🌈Coder
전체 방문자
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기 (411)
    • 곡지사항 (0)
    • Debugger (10)
      • Visual Studio Debugger (1)
      • Chrome DevTools (3)
      • Visual Studio Code Debugger (4)
      • eclipse (1)
      • intelliJ (1)
    • OOP (2)
      • OOP (2)
    • TypeScript (54)
      • νƒ€μž…μŠ€ν¬λ¦½νŠΈ TypeScript (54)
    • Javascript (87)
      • Javascript (45)
      • Node.js (19)
      • React (5)
      • FE κ°œλ°œν™˜κ²½μ„€μ • (3)
      • React와 Node 같이 λ•Œλ €μž‘κΈ° (6)
      • next.js (2)
      • pixi.js (7)
    • λ§ˆν¬μ—… (23)
      • Html & Css (23)
    • C# (80)
      • C# (12)
      • 이것이 C#이닀 (68)
    • C++ (30)
      • c++ (27)
      • win api (3)
    • Unity (18)
      • Unity(기초) (8)
      • Unity(C#쀑급) (5)
      • μœ λ‹ˆν‹° 포톀(λ„€νŠΈμ›Œν¬) (4)
      • unity c# MyCode (1)
    • Java & Spring (29)
      • Java (11)
      • μŠ€ν”„λ§ (8)
      • Java Algorithm (9)
      • Javs Data Structures (1)
    • μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜ (15)
      • 자료ꡬ쑰 (5)
      • μ•Œκ³ λ¦¬μ¦˜ (10)
    • ν˜•μƒκ΄€λ¦¬ (15)
      • Git (11)
      • μ†ŒμŠ€νŠΈλ¦¬ (3)
    • κ·Έλž˜ν”½μŠ€ (7)
      • WebGl (7)
    • AWS (3)
      • aws (3)
    • λ¦¬λˆ…μŠ€ (5)
      • λ¦¬λˆ…μŠ€ (5)
    • μ±… 리뷰 (13)
      • ν΄λ¦°μ½”λ“œ(책리뷰) (3)
      • μœ μ§€λ³΄μˆ˜κ°€λŠ₯ν•œμ½”λ”©μ˜κΈ°μˆ C#편(책리뷰) (1)
      • λ¦¬νŒ©ν† λ§(μžλ°”μŠ€ν¬λ¦½νŠΈνŒ) (9)
    • Server (2)
      • κ²Œμž„ μ„œλ²„(λ„€νŠΈμ›Œν¬, λ©€ν‹°μ“°λ ˆλ“œ,OS) (2)
    • 섀계, 아킀텍쳐 (4)
    • 파이썬 (5)
    • λ””μžμΈνŒ¨ν„΄ (2)
    • mocha (2)
    • Jest (1)
    • Spine (1)
    • 인곡지λŠ₯ (1)
      • ν˜Όμžκ³΅λΆ€ν•˜λŠ”λ¨Έμ‹ λŸ¬λ‹+λ”₯λŸ¬λ‹ (1)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • νƒœκ·Έ
  • λ°©λͺ…둝

곡지사항

인기 κΈ€

νƒœκ·Έ

  • γ…£γ„·
  • μœ„μž„
  • μ»΄ν¬μ§€μ…˜
  • MySQL

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
Rainbow🌈Coder

My dev NoteπŸ“’

C#/이것이 C#이닀

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

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

'C# > 이것이 C#이닀' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

27. 읽기 μ „μš© ν•„λ“œ, readonly  (0) 2022.02.11
26. μ˜€λ²„λΌμ΄λ”© λ΄‰μΈν•˜κΈ°  (0) 2022.02.11
24. C# ν˜•μ‹ λ³€ν™˜ 연산을 μœ„ν•œ μ—°μ‚°μž, is와 as  (0) 2022.02.11
[쀑간점검] μ ‘κ·Όν•œμ •μž internalμ—μ„œ 같은 μ–΄μ…ˆλΈ”λ¦¬λž€  (0) 2022.02.11
23. 상속, μ½”λ“œ μž¬ν™œμš©, 기반 클래슀, νŒŒμƒ 클래슀, base, sealed  (0) 2022.02.11
    'C#/이것이 C#이닀' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • 27. 읽기 μ „μš© ν•„λ“œ, readonly
    • 26. μ˜€λ²„λΌμ΄λ”© λ΄‰μΈν•˜κΈ°
    • 24. C# ν˜•μ‹ λ³€ν™˜ 연산을 μœ„ν•œ μ—°μ‚°μž, is와 as
    • [쀑간점검] μ ‘κ·Όν•œμ •μž internalμ—μ„œ 같은 μ–΄μ…ˆλΈ”λ¦¬λž€
    Rainbow🌈Coder
    Rainbow🌈Coder
    λͺ°λΌλ„ 결ꡭ은 μ•„λŠ” 개발자, 그런 μ‚¬λžŒμ΄ 되기 μœ„ν•œ 맀일의 ν•œκ±ΈμŒ

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”