본문 바로가기
c#

[c#] 인터페이스 사용법 및 예제

by devjh 2020. 8. 3.
반응형

1. 인터페이스란

 

인터페이스란 추상클래스와 굉장히 유사합니다.

 

인터페이스에서 몸체없는 메서드를 만들어주고

 

클래스들에서 상속받아서 사용하곤 합니다.

 

단 상속받은 클래스들은 인터페이스의 멤버를 반드시 구현해줘야 합니다.

 

흔히 규격을 만들때 사용한다고 합니다.

 

아규먼트 패싱을 하는데 주로 사용하며 layer 간 연결을 해주는 역할을 하기도 하며

 

고수준의 것이 저수준의 것에 의존하지 않게 하기 위해 사용하기도 합니다.

 

추상클래스와의 차이점은

 

추상클래스는 다중상속을 지원하지 않지만 인터페이스는 다중상속을 지원하며, 인터페이스 자체로 인스턴스 생성이 안된다는 특징이 있습니다.

 

저는 참조변수를 통일 시켜 결합도를 낮추는데 쓰는 방법을 예제로 만들어 봤습니다.

 

2. 예제

namespace InterfaceEx
{
    class Program
    {
        static void Main(string[] args)
        {
            Person myPerson = new Person();
            Lion myLion = new Lion();
            Camel myCamel = new Camel();

            myPerson.Eat();
            myLion.Eat();
            myCamel.Eat();

            Console.WriteLine();

            MyEatFunc(myPerson);
            MyEatFunc(myLion);
            MyEatFunc(myCamel);
        }

        private static void MyEatFunc(object obj)
        {
            IAnimal target = obj as IAnimal;
            if (target != null)
            {
                target.Eat();
            }
        }
    }

    class Person : IAnimal
    {
        public void Eat()
        {
            Console.WriteLine("밥을 먹습니다.");
        }
    }

    class Lion : IAnimal
    {
        public void Eat()
        {
            Console.WriteLine("고기를 먹습니다.");
        }
    }

    class Camel
    {
        public void Eat()
        {
            Console.WriteLine("풀을 먹습니다.");
        }
    }

    interface IAnimal
    {
        void Eat();
    }
}

예제코드입니다.

 

MyEatFunc에서는 매개변수로 받아온 obj를 IAnimal로 형변환 해줍니다.

 

여기서 인터페이스를 상속받지 않은 객체는 형변환에 실패하여 Eat메서드가 수행되지 않습니다.(낙타)

 

즉 해당메서드는 IAnimal를 상속받은 클래스의 객체는 어떤객체든 매개변수로 넣고 사용할 수 있습니다.

 

이러한 과정을 인터페이스를 통해 결합도를 낮췄다 라고도 합니다.

 

3. 결과

 

 

인터페이스를 사용하지 않은 예(아규먼트 패싱을 하지 않은 예)입니다.

private static void MyEatFunc(Person target)
{
    target.Eat();
}

private static void MyEatFunc(Lion target)
{
    target.Eat();
}

private static void MyEatFunc(Camel target)
{
    target.Eat();
}

오버로딩을 통해 메서드를 3배로 늘렸습니다

 

메서드 안에서 해야할 일이 많다면 코드의 길이도 3배로 늘어나야 합니다.

 

 

private static void MyEatFunc(object obj)
{
    Person target1 = obj as Person;
    if(target1 != null)
    {
    	target1.Eat();
    }

    Lion target2 = obj as Lion;
    if (target2 != null)
    {
	target2.Eat();
    }

    Camel target3 = obj as Camel;
    if (target3 != null)
    {
    	target3.Eat();
    }
}

형변환이 되는지를 확인해서 하나의 메서드에서도 구현이 가능합니다.

 

메서드는 한개지만 역시 세번의 로직을 구현해줘야됩니다.

반응형

댓글