[C#]overloadingκ³Ό overriding

JagΒ·2023λ…„ 4μ›” 22일

C#

λͺ©λ‘ 보기
4/5
post-thumbnail

πŸ“Œμ˜€λ²„λ‘œλ”©(Overloading)κ³Ό μ˜€λ²„λΌμ΄λ”©(Overriding)

처음 ν”„λ‘œκ·Έλž˜λ°ν•  λ•Œ μ‰½κ²Œ ν˜Όλ™ν•˜λŠ” 단어가 λ°”λ‘œ μ˜€λ²„λ‘œλ“œ(Overload)와 μ˜€λ²„λΌμ΄λ“œ(Override) μž…λ‹ˆλ‹€.

✍🏻 μ˜€λ²„λ‘œλ”©(Overloading)

  • μ˜€λ²„λ‘œλ”©(Overloading) : λ§€κ²¨λ³€μˆ˜λ₯Ό λ‹¬λ¦¬ν•˜μ—¬ 같은 μ΄λ¦„μ˜ ν•¨μˆ˜λ₯Ό μ—¬λŸ¬ 개λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. "닀쀑 μ •μ˜"라고도 ν•©λ‹ˆλ‹€.

λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜(Signature) : λ©”μ„œλ“œ 이름 + λ§€κ°œλ³€μˆ˜ 정보(개수 및 νƒ€μž… 정보)

  • λ©”μ„œλ“œ 이름은 κ°™μ•„μ•Ό 함.
  • λ§€κ°œλ³€μˆ˜ 정보(개수 및 νƒ€μž… 정보)λŠ” 달라야 함.

πŸ”§ μ˜€λ²„λ‘œλ”©(Overloading) 예제

class Test
	{
        static void Main(string[] args)
        {
            var over = new OverLoadingTest();
            over.test();
            over.test(1, 3);
            over.test(3.3f);

        }
    }
    
public class OverLoadingTest
    {
        public void test()
        {
            Console.WriteLine("λ§€κ°œλ³€μˆ˜ μ—†μŒ");
        }
        public void test(int a , int b)
        {
            Console.WriteLine($"λ§€κ°œλ³€μˆ˜ : {a} , {b}");
        }

        public void test(double d)
        {
            Console.WriteLine($"doubleν˜• λ§€κ°œλ³€μˆ˜ : {d}");
        }
    }

✍🏻 μ˜€λ²„λΌμ΄λ”©(Overriding)

  • μ˜€λ²„λΌμ΄λ”©(Overriding) : λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 이미 λ§Œλ“  λ©”μ†Œλ“œλ₯Ό λ™μΌν•œ μ΄λ¦„μœΌλ‘œ μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ‹€μ‹œ μ •μ˜("μž¬μ •μ˜")ν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€.
    λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œλŠ” virtual ν‚€μ›Œλ“œλ‘œ ν•œμ •λ˜μ–΄ μžˆμ–΄μ•Ό ν•˜κ³  μ˜€λ²„λΌμ΄λ”© ν•˜λŠ” μžμ‹ 클래슀의 λ©”μ†Œλ“œλŠ” override ν‚€μ›Œλ“œλ‘œ ν•œμ •ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€.

🎈 virtual VS astract

virtual

  • virtual ν‚€μ›Œλ“œλŠ” 정적 클래슀λ₯Ό μ œμ™Έν•œ λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œ μ‚¬μš© κ°€λŠ₯.
  • virtual ν‚€μ›Œλ“œλ‘œ μ •μ˜ν•œ μ†μ„±μ΄λ‚˜ λ©”μ„œλ“œλŠ” 본문을 μ •μ˜ν•  수 있음.
  • μ ‘κ·Ό ν•œμ •μžλŠ” public, interanl, protected (private μ‚¬μš© λΆˆκ°€)
  • μžμ‹ ν΄λž˜μŠ€μ—μ„œ ν•¨μˆ˜ μž¬μ •μ˜κ°€ μ„ νƒμ μœΌλ‘œ 이루어짐

abstract

  • abstract ν‚€μ›Œλ“œλŠ” μ„ μ–Έν•˜λŠ” ν΄λž˜μŠ€λ„ λ°˜λ“œμ‹œ abstract ν΄λž˜μŠ€μ—¬μ•Ό 함.
  • abstract ν‚€μ›Œλ“œλ‘œ μ •μ˜ν•œ μ†μ„±μ΄λ‚˜ λ©”μ„œλ“œλŠ” 본문을 μ •μ˜ν•  수 μ—†μŒ.
  • μ ‘κ·Ό ν•œμ •μžλŠ” public, interanl, protected (private μ‚¬μš© λΆˆκ°€)
  • μžμ‹ ν΄λž˜μŠ€μ—μ„œ ν•¨μˆ˜ μž¬μ •μ˜κ°€ ν•„μˆ˜λ‘œ 이루어짐

πŸ”§ μ˜€λ²„λΌμ΄λ”©(Overriding) 예제

#01. virtual + override
class Test
  {
      static void Main(string[] args)
      {
          Gun gWeapon = new Gun();
          gWeapon.name = "ShotGun";
          gWeapon.damage = 23;
          gWeapon.type = "샷건";

          gWeapon.Print();


          Weapon wWeapon = new Gun();
          wWeapon.name = "DEagle";
          wWeapon.damage = 7;
          //wWeapon.type = "ꢌ총"; λΆ€λͺ¨μ˜ 클래슀 λ©€λ²„λ§Œ μ ‘κ·Ό κ°€λŠ₯
          wWeapon.Print();

      }
  }


public class Weapon
  {
      public String name;
      public int damage;

      public virtual void Print()
      {
          Console.WriteLine($"이 무기의 이름은 {name} , λ°λ―Έμ§€λŠ” {damage} μž…λ‹ˆλ‹€.");
      }
  }

  public class Gun : Weapon 
  {
      public String type;

      public override void Print()
      {
          Console.WriteLine($"이 무기의 이름은 {name} , λ°λ―Έμ§€λŠ” {damage} μž…λ‹ˆλ‹€.");
          Console.WriteLine($"이 λ¬΄κΈ°λŠ” {type} μž…λ‹ˆλ‹€.");
      }
  }

λΆ€λͺ¨ κ°œμ²΄μ— μžμ‹ μΈμŠ€ν„΄μŠ€λ₯Ό 담은 wWeapon은 μžμ‹ ν΄λž˜μŠ€μ— μžˆλŠ” λ³€μˆ˜ type값을 μ°Έμ‘°ν•˜λ €κ³  ν•˜λ©΄ 찾을 수 μ—†λ‹€λŠ” 였λ₯˜κ°€ λ‚©λ‹ˆλ‹€.

#02. void + new void


class Test
  {
      static void Main(string[] args)
      {
          Gun gWeapon = new Gun();
          gWeapon.name = "ShotGun";
          gWeapon.damage = 23;
          gWeapon.type = "샷건";

          gWeapon.Guess();


          Weapon wWeapon = new Gun();
          wWeapon.name = "DEagle";
          wWeapon.damage = 7;
          //wWeapon.type = "ꢌ총"; λΆ€λͺ¨μ˜ 클래슀 λ©€λ²„λ§Œ μ ‘κ·Ό κ°€λŠ₯
          wWeapon.Guess();

      }
  }
public class Weapon
  {
      public String name;
      public int damage;

      public void Guess()
      {
          Console.WriteLine($"이 무기의 이름은 {name} , λ°λ―Έμ§€λŠ” {damage} 일걸??");
      }
  }

  public class Gun : Weapon 
  {
      public String type;

      public new void Guess()
      {
          Console.WriteLine($"이 무기의 이름은 {name} , λ°λ―Έμ§€λŠ” {damage} 일걸??");
          Console.WriteLine($"이 λ¬΄κΈ°λŠ” {type} 일걸??");
      }
  }

Guess λ©”μ„œλ“œ 속 μžμ‹ 클래슀 λ³€μˆ˜μΈ type이 λ“€μ–΄κ°„ Console.WriteLine(); μžμ²΄κ°€ μ•ˆλ‚˜μ˜€λŠ”λ°, 였λ₯˜μΈμ§€ λΆ€λͺ¨ κ°œμ²΄μ— μžμ‹ μΈμŠ€ν„΄μŠ€λ₯Ό 담은 wWeapon의 νŠΉμ§•μΈμ§€ μžμ„Ένžˆ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

new λŠ” λ‹€ν˜•μ„±κ³ΌλŠ” μ•„λ¬΄λŸ° 연관이 μ—†μŠ΅λ‹ˆλ‹€.
λ‹¨μˆœνžˆ μžμ‹ ν΄λž˜μŠ€μ—μ„œ μƒˆλ‘œμ΄ μ •μ˜ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€

  • μ˜€λ²„λΌμ΄λ”©μ„ ν–ˆμ„ 경우 : μžμ‹ 클래슀(Child)의 μ˜€λ²„λΌμ΄λ“œ 된 λ©”μ„œλ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.
  • new 둜 μž¬μ •μ˜ ν•  경우 : λΆ€λͺ¨ 클래슀(Parent)의 원 λ©”μ„œλ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€

πŸ”₯ κ²°λ‘ 

  • μ˜€λ²„λ‘œλ”©(Overloading) : λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜ 쀑 λ§€μ„œλ“œ 이름은 κ°™κ³ , λ§€κ°œλ³€μˆ˜μ˜ 정보(개수 및 νƒ€μž… 정보)λ₯Ό λ‹€λ₯΄κ²Œ μ •μ˜ν•œ 방법
  • μ˜€λ²„λΌμ΄λ”©(Overriding) : λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μžμ‹ 클래슀둜 상속할 λ•Œ, λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μΆ”κ°€/μ‚­μ œ/μˆ˜μ •μœΌλ‘œ μž¬μ •μ˜ ν•˜λŠ” 방법

μ˜€λ²„λΌμ΄λ”© 같은 κ²½μš°λŠ” 상황을 잘 μƒκ°ν•˜κ³  μ˜¬λ°”λ₯Έ 방법을 μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ μ’‹κ² μŠ΅λ‹ˆλ‹€.
μ œκ°€ λ°°μš°λŠ” μ±…μ—μ„œλŠ” virtual + override 방법이 κ°€μž₯ 쒋은 방법이라고 ν•©λ‹ˆλ‹€.

profile
QA Engineer

0개의 λŒ“κΈ€