내일배움캠프

내일배움캠프 13일차: 인터페이스

pracumj 2024. 9. 30. 21:39

오늘의 공부 📝

오늘은 인터페이스 개념에 대해 집중적으로 학습하였다. 인터페이스는 클래스가 특정 동작을 수행할 수 있도록, 해당 동작에 대한 규약을 정의해 주는 추상화 개념이다. 인터페이스는 클래스와 달리 메서드의 구현을 포함하지 않으며, 그저 클래스가 가져야 할 메서드의 시그니처(이름, 매개변수, 반환 타입)만을 정의한다. 인터페이스는 여러 클래스들이 동일한 동작을 하도록 보장해주고, 다형성을 활용한 유연한 설계를 가능하게 해준다.

인터페이스는 특정 동작을 정의하고, 그 동작을 여러 클래스가 공통적으로 구현할 수 있도록 한다. 인터페이스 자체는 인스턴스화할 수 없으며, 클래스에서 인터페이스를 구현하여 사용할 수 있다. 한 클래스는 여러 인터페이스를 동시에 구현할 수 있어, 인터페이스를 통한 다중 상속의 효과도 얻을 수 있다.

인터페이스란?

인터페이스는 클래스와는 다르게 메서드, 속성, 이벤트 등의 시그니처만을 정의하고, 이를 구현하는 클래스에서 구체적인 동작을 정의하도록 강제하는 구조이다. 인터페이스를 사용하면 클래스 간의 결합도를 낮추고, 코드의 유연성을 높일 수 있다.

주요 특징:

    1. 메서드, 속성 시그니처만 정의:
      • 인터페이스는 메서드나 속성의 시그니처만 정의하고, 구체적인 구현은 포함하지 않는다. 즉, 메서드의 반환 타입, 이름, 매개변수만 정의하고, 그 구현은 인터페이스를 구현하는 클래스가 담당
    2. 강제된 구현:
      • 클래스가 특정 인터페이스를 구현하기로 했으면, 인터페이스에 정의된 모든 메서드와 속성을 반드시 구현해야 한다. 만약 이를 구현하지 않으면 컴파일 오류가 발생
    3. 다중 구현 가능:
      • 한 클래스는 여러 개의 인터페이스를 동시에 구현할 수 있다. 이를 통해 클래스는 다양한 역할을 수행할 수 있게 되고, 다형성을 극대화가 가능
    4. 다형성 활용:
      • 인터페이스는 다형성의 기반이 된다. 인터페이스를 통해 클래스들이 서로 다른 구현을 가지면서도 동일한 방식으로 동작할 수 있도록 보장한다. 즉, 인터페이스를 통해 동일한 메서드를 호출하더라도, 각 클래스의 특성에 따라 다른 방식으로 동작 가능인터페이스 사용 예시

인터페이스 사용 예시

// 인터페이스 정의
interface ICharacter
{
    // 공통적인 행동을 정의 (구현은 하지 않음)
    void Attack();
    void Defend();
}

// 인터페이스 구현 - 전사 클래스
class Warrior : ICharacter
{
    public void Attack() => Console.WriteLine("검을 사용한다!");
    public void Defend() => Console.WriteLine("방패를 사용한다.");
}

// 인터페이스 구현 - 마법사 클래스
class Mage : ICharacter
{
    public void Attack() => Console.WriteLine("주문을 사용한다!");
    public void Defend() => Console.WriteLine("방어막을 만든다.");
}

// 프로그램 실행 예시
class Program
{
    static void Main()
    {
        // ICharacter 타입을 통해 Warrior와 Mage를 동일한 방식으로 참조
        ICharacter warrior = new Warrior();
        ICharacter mage = new Mage();

        // 동일한 메서드를 호출하지만 각 클래스의 구현에 따라 다른 동작을 수행
        warrior.Attack(); // 출력: 검을 사용한다!
        mage.Attack();    // 출력:주문을 사용한다!

        warrior.Defend(); // 출력: 방패를 사용한다.
        mage.Defend();    // 출력: 방어막을 만든다.
    }
}

코드 설명

    • ICharacter 인터페이스: Attack, Defend, UseSkill 메서드를 정의하여 캐릭터의 기본 행동을 정의한다.
    • Warrior와 Mage 클래스: ICharacter 인터페이스를 구현하여 각각의 클래스가 ICharacter의 메서드를 구체적으로 구현한다.
    • Program 클래스: ICharacter 타입을 사용하여 Warrior와 Mage 객체를 동일한 방식으로 참조하고, 메서드를 호출한다. 메서드는 인터페이스의 시그니처에 따라 호출되지만, 각 클래스에서 구현된 방식에 따라 동작한다.

인터페이스를 사용하는 이유

    1. 클래스 간의 결합도를 낮추고 싶을 때:
      • 인터페이스는 특정 클래스가 아닌, 클래스의 동작만을 정의하기 때문에 클래스 간의 결합도를 낮출 수 있다. 이를 통해 코드의 유연성이 증가하고, 각 클래스가 독립적으로 수정될 수 있다.
    2. 다양한 클래스가 동일한 동작을 수행해야 할 때:
      • 예를 들어, 여러 캐릭터 클래스(Warrior, Mage)가 모두 Attack, Defend 등의 동작을 수행해야 한다면, 인터페이스를 통해 동일한 동작을 정의하고 이를 각 클래스에서 구현하도록 강제할 수 있다.
    3. 다중 상속이 필요한 경우:
      • C#에서는 클래스의 다중 상속을 지원하지 않지만, 인터페이스를 통해 다중 상속의 효과를 얻을 수 있다. 한 클래스가 여러 인터페이스를 구현하여 다양한 역할을 수행할 수 있다.

         

마무리 😺

처음에는 추상 클래스의 개념이 다소 헷갈렸지만, 사용 사례를 통해 공부하면서 그 구조와 목적을 명확하게 이해할 수 있었다. 특히, 공통적인 기능을 제공하면서도 특정 기능을 자식 클래스에서 반드시 구현하도록 강제하는 방식이 어떻게 유연한 설계를 가능하게 하는지 알게 되었다. 이 개념은 앞으로 객체 지향 설계에서 매우 유용하게 사용할 수 있을 것 같다. 추상 클래스를 통해 코드의 일관성과 확장성을 더욱 확보할 수 있도록 노력 해야겠다!