πŸ’» Programming Language/C#

15. μΈν„°νŽ˜μ΄μŠ€(Interface) 이해

S.Honey 2022. 4. 6. 09:27
namespace InterfaceEx
{

    interface IMyInterfaceA
    {
        void output();
    }

    interface IMyInterfaceB
    {
        void output();
    }

    class MyClass : IMyInterfaceA,  IMyInterfaceB // 닀쀑 상속
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();

            IMyInterfaceA ia = new MyClass();
            ia.output();

            IMyInterfaceB ib = new MyClass();
            ib.output();

        }

        void IMyInterfaceA.output() 
        // 닀쀑상속을 톡해 κ°€μ Έμ˜¨ ν΄λž˜μŠ€λ“€μ˜ λ©”μ†Œλ“œλͺ…이 κ°™μ€κ²½μš°μ—λŠ” `클래슀.λ©”μ†Œλ“œ()` ν˜•νƒœλ₯Ό μ΄μš©ν•œλ‹€.
        {
            Console.WriteLine("InterfaceA");
        }

        void IMyInterfaceB.output()
        {
            Console.WriteLine("InterfaceB");
        }
    }
}

μΈν„°νŽ˜μ΄μŠ€(Interface) μ„ μ–Έ

interface ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©

interface μΈν„°νŽ˜μ΄μŠ€λͺ…
{
    λ°˜ν™˜ν˜•μ‹ λ©”μ†Œλ“œλͺ…(λ§€κ°œλ³€μˆ˜);
    ...
}

  • 닀쀑상속을 톡해 κ°€μ Έμ˜¨ ν΄λž˜μŠ€λ“€μ˜ λ©”μ†Œλ“œλͺ…이 κ°™μ€κ²½μš°μ—λŠ” 클래슀.λ©”μ†Œλ“œ() ν˜•νƒœλ₯Ό μ΄μš©ν•œλ‹€.

  • μΈν„°νŽ˜μ΄μŠ€μ—μ„œλŠ” ν•„λ“œλ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.
    • (이벀트, λ©”μ†Œλ“œ, ν”„λ‘œνΌν‹°λ§Œμ„ λ©€λ²„λ‘œ κ°€μ§„λ‹€.)

  • μΈν„°νŽ˜μ΄μŠ€μ˜ λ©€λ²„λŠ” λͺ¨λ‘ public μ ‘κ·ΌκΆŒν•œμœΌλ‘œ μ„€μ •λœλ‹€.
    • λ”°λΌμ„œ μ ‘κ·Ό μ œν•œμž(private, protected λ“±)λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€. => public도 μ•ˆμ¨μ£ΌλŠ”κ²Œ μ’‹μŒ (public μ‚¬μš©μ‹œ 경고뜸 ^^;)

  • μΈν„°νŽ˜μ΄μŠ€λŠ” μΌμ’…μ˜ λͺ…μ„Έμ„œμ΄λ‹€.
    • λͺ…μ„Έμ„œλ₯Ό 보고 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λŠ” μΌμ’…μ˜ μ„€λͺ…μ„œ

  • μΈν„°νŽ˜μ΄μŠ€λŠ” κ΅¬ν˜„λΆ€(λͺΈν†΅)κ°€ μ—†λŠ” 좔상멀버(이벀트, λ©”μ†Œλ“œ, ν”„λ‘œνΌν‹° λ“±)λ₯Ό κ°€μ§„λ‹€.

  • μΈν„°νŽ˜μ΄μŠ€λŠ” 닀쀑 상속이 κ°€λŠ₯ν•˜λ‹€.
    • κ°„ν˜Ή 문제점이 λ°œκ²¬λ λ•Œκ°€ μžˆμœΌλ‹ˆ μ‘°μ‹¬ν•˜μž.

  • μΈν„°νŽ˜μ΄μŠ€λŠ” λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속 받을 수 μžˆλ‹€.(= μΈν„°νŽ˜μ΄μŠ€κ°„μ— 상속도 κ°€λŠ₯ν•˜λ‹€.)
    • ν΄λž˜μŠ€μ—μ„œλ„ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속받을 수 있고, κ΅¬μ‘°μ²΄μ—μ„œλ„ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속 받을 수 μžˆλ‹€.

  • 기본적으둜 μΈν„°νŽ˜μ΄μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†λ‹€.
namespace MultiInheritanceEx
{
    class A
    {
        public void Output()
        {
            Console.WriteLine("A의 좜λ ₯");
        }

    }

    class B
    {
        public void Output()
        {
            Console.WriteLine("B의 좜λ ₯");
        }
    }

    class Program : A, B
        // C#은 이와같은 클래슀 닀쀑상속이 λΆˆκ°€λŠ₯ν•˜λ‹€. => A와 Bλ₯Ό class둜 μ„ μ–Έ
        // 단 A와 Bκ°€ μΈν„°νŽ˜μ΄μŠ€μΈ κ²½μš°μ—” 닀쀑상속이 κ°€λŠ₯ν•˜λ‹€. 
        // 
    {
        static void Main(string[] args)
        {
        }
    }
}
  • μœ„μ™€ 같이 닀쀑 클래슀λ₯Ό μƒμ†λ°›λŠ” 것은 C#μ—μ„œλŠ” λΆˆκ°€λŠ₯ν•˜λ‹€.
namespace MultiInheritanceEx
{
    interface AA
    {
        void Output();
    }

    interface BB
    {
        void Output();
    }

    class Program : AA, BB
        // C#은 이와같은 클래슀 닀쀑상속이 λΆˆκ°€λŠ₯ν•˜λ‹€. => A와 Bλ₯Ό class둜 μ„ μ–Έ
        // 단 A와 Bκ°€ μΈν„°νŽ˜μ΄μŠ€μΈ κ²½μš°μ—” 닀쀑상속이 κ°€λŠ₯ν•˜λ‹€. 
        // 
    {
        static void Main(string[] args)
        {
        }
    }
}
  • μœ„μ™€ 같이 μΈν„°νŽ˜μ΄μŠ€λ“€μ— λŒ€ν•œ 닀쀑상속은 κ°€λŠ₯ν•˜λ‹€.

μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속(interface inherits interface)


μΈν„°νŽ˜μ΄μŠ€ 상속 ν˜•μ‹
    interface μžμ‹ μΈν„°νŽ˜μ΄μŠ€ λͺ… : λΆ€λͺ¨ μΈν„°νŽ˜μ΄μŠ€ λͺ… 
    {
        ...
    }
namespace InterfaceEx2
{
    interface ParentInterface
    {
        void myMethod(string str);
    }

    interface ChildInterface : ParentInterface
    {
        void myMethod(string str, int i);
    }

    class MyClass : ChildInterface
    {
        public void myMethod(string str)
        {
            Console.WriteLine(str + "λΆ€λͺ¨ μΈν„°νŽ˜μ΄μŠ€ 호좜");
        }

        public void myMethod(string str, int i)
        {
            for (int j = 0; j < i; j++)
            {
                Console.WriteLine(str + j + "μžμ‹ μΈν„°νŽ˜μ΄μŠ€ 호좜");
            }
        }
        // μžμ‹μΈν„°νŽ˜μ΄μŠ€κ°€ μ• μ΄ˆμ— λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›μ•˜κΈ°μ— 
        // μžμ‹μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•œ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ μΈν„°νŽ˜μ΄μŠ€ λ‚΄μ˜ λ©”μ†Œλ“œ λ˜ν•œ μ •μ˜λ₯Ό ν•΄μ€˜μ•Ό ν•œλ‹€.
    }


    class Program
    {

        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            mc.myMethod("λΆ€λͺ¨");
            mc.myMethod("μžμ‹", 3);

            ParentInterface parent = new MyClass();
            parent.myMethod("parent");
        }
    }
}
Output

λΆ€λͺ¨λΆ€λͺ¨ μΈν„°νŽ˜μ΄μŠ€ 호좜
μžμ‹0μžμ‹ μΈν„°νŽ˜μ΄μŠ€ 호좜
μžμ‹1μžμ‹ μΈν„°νŽ˜μ΄μŠ€ 호좜
μžμ‹2μžμ‹ μΈν„°νŽ˜μ΄μŠ€ 호좜
parentλΆ€λͺ¨ μΈν„°νŽ˜μ΄μŠ€ 호좜
  • μ΅œμ’…μ μœΌλ‘œ μžμ‹μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›λŠ” ν΄λž˜μŠ€μ—μ„œλŠ” μžμ‹μΈν„°νŽ˜μ΄μŠ€κ°€ μ• μ΄ˆμ— λΆ€λͺ¨μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›μ•˜κΈ° λ•Œλ¬Έμ— μžμ‹μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•œ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ μΈν„°νŽ˜μ΄μŠ€ λ‚΄μ˜ λ©”μ†Œλ“œ λ˜ν•œ μ •μ˜λ₯Ό ν•΄μ€˜μ•Ό ν•œλ‹€.