c# 인터페이스(interface)와 추상 클래스(abstract)의 차이점

2024. 9. 18. 18:18c#

인터페이스와 추상 클래스의 차이점

C#에서 객체지향 프로그래밍(OOP)을 이해할 때, 인터페이스(interface)추상 클래스(abstract)는 중요한 개념입니다. 이 두 가지 개념은 상속 관계에서 특정한 기능을 정의하고 강제하는 역할을 하지만, 그 사용 목적과 구현 방식에서 큰 차이가 있습니다. 이번 포스팅에서는 인터페이스추상 클래스의 차이점에 대해 살펴보고, 각 개념이 어떤 상황에서 적합한지 알아보겠습니다.


1. 추상 클래스란?

추상 클래스는 구체적인 객체를 생성할 수 없는 클래스로, 일반적으로 상속받은 클래스가 공통적으로 가져야 할 기능을 정의하는 데 사용됩니다. 추상 클래스는 구체적인 구현과 함께 추상 메서드를 포함할 수 있습니다.

추상 클래스의 특징

  • 인스턴스화 불가능: 추상 클래스는 직접 객체를 생성할 수 없습니다. 상속받은 클래스에서만 인스턴스를 만들 수 있습니다.
  • 추상 메서드 포함: 추상 클래스는 추상 메서드를 포함할 수 있으며, 이를 상속받는 하위 클래스에서 구체적인 구현을 제공합니다.
  • 일부 구현 포함 가능: 추상 클래스는 구체적인 메서드도 포함할 수 있으며, 상속받는 클래스는 이들을 그대로 사용할 수 있습니다.

2. 추상 클래스 선언

C#에서 추상 클래스는 abstract 키워드를 사용하여 선언합니다. 추상 클래스는 상속받는 클래스가 공통적으로 가져야 할 속성이나 메서드를 정의할 수 있습니다.

추상 클래스 선언 예제

public abstract class Animal
{
    public string Name { get; set; }

    // 추상 메서드
    public abstract void MakeSound();

    // 일반 메서드
    public void Sleep()
    {
        Console.WriteLine($"{Name} is sleeping.");
    }
}

위 코드에서 Animal 클래스는 추상 클래스이며, MakeSound라는 추상 메서드를 포함하고 있습니다. 이 메서드는 구체적인 구현이 없고, 이를 상속받는 클래스에서 구현해야 합니다. 반면, Sleep 메서드는 일반 메서드로 구현이 포함되어 있으며, 이를 상속받은 클래스에서 그대로 사용할 수 있습니다.


3. 추상 메서드

추상 메서드는 추상 클래스 내에서 선언되며, 구현부 없이 메서드 시그니처만 정의됩니다. 추상 메서드를 포함한 클래스는 반드시 추상 클래스여야 하며, 이 메서드는 상속받는 하위 클래스에서 구현되어야 합니다.

추상 메서드 선언 예제

public abstract class Shape
{
    // 추상 메서드
    public abstract double GetArea();
}

위 코드에서 Shape 클래스는 추상 클래스이며, GetArea라는 추상 메서드를 포함하고 있습니다. 이 메서드는 상속받는 모든 구체적인 도형 클래스에서 구현되어야 합니다.


4. 추상 클래스 상속 및 구현

추상 클래스를 상속받는 클래스는 추상 클래스에 포함된 모든 추상 메서드를 반드시 구현해야 합니다.
추상 클래스의 다른 일반 메서드는 필요에 따라 재정의하거나 그대로 사용할 수 있습니다.

추상 클래스 구현 예제

public class Dog : Animal
{
    // 추상 메서드의 구현
    public override void MakeSound()
    {
        Console.WriteLine("Bark!");
    }
}

public class Cat : Animal
{
    // 추상 메서드의 구현
    public override void MakeSound()
    {
        Console.WriteLine("Meow!");
    }
}

위 코드에서 Dog 클래스와 Cat 클래스는 Animal 추상 클래스를 상속받으며, MakeSound라는 추상 메서드를 각각 구현하고 있습니다. 이를 통해 각 클래스는 자신만의 구체적인 동작을 정의할 수 있습니다.


5. 추상 클래스와 인터페이스의 차이점

추상 클래스와 인터페이스는 모두 상속 구조에서 상위 클래스와 하위 클래스 간의 계약을 정의하지만, 몇 가지 차이점이 있습니다.

비교 항목 추상 클래스(abstract) 인터페이스(interface)
인스턴스화 불가능 (상속을 통해서만 사용 가능) 불가능 (구현을 통해서만 사용 가능)
구현 포함 가능 여부 구체적인 메서드 구현 포함 가능 구현을 포함할 수 없음 (C# 8.0 이후 기본 메서드 가능)
상속 가능 여부 클래스는 하나의 추상 클래스만 상속 가능 여러 인터페이스를 동시에 구현 가능
사용 목적 공통된 기본 기능과 추상 메서드를 제공 클래스가 따라야 할 일관된 계약 정의

선택 기준

  • 기본 기능을 제공하면서도 확장할 클래스가 필요한 경우: 추상 클래스 사용.
  • 다중 상속이나 구체적인 구현이 필요 없는 계약만 정의할 경우: 인터페이스 사용.

6. 추상 클래스의 장점

  1. 코드 재사용성: 공통된 기능을 상속받는 모든 클래스에서 재사용할 수 있습니다.
  2. 구체적인 기본 동작 제공: 추상 클래스는 일반 메서드를 포함하여, 상속받는 클래스들이 기본 동작을 재사용하거나 재정의할 수 있습니다.
  3. 유연한 설계: 추상 메서드를 통해 하위 클래스가 공통된 계약을 따르도록 강제하면서도, 각 클래스가 구체적인 동작을 독립적으로 구현할 수 있습니다.

7. 추상 클래스와 메서드 사용 시나리오

추상 클래스와 메서드를 사용하는 주요 시나리오는 다음과 같습니다:

  1. 공통된 기능이 있지만, 구체적인 구현은 달라야 할 때:
    • 예: 여러 동물 클래스에서 공통된 동작(잠자기, 먹기)을 공유하면서, 구체적인 행동(울음소리, 움직임)을 달리 구현할 수 있습니다.
  2. 계층 구조에서 일부 기능은 미리 제공하고, 일부는 자식 클래스에 맡길 때:
    • 예: Shape 추상 클래스에서 면적을 구하는 메서드를 자식 클래스에서 구체화하는 경우.
  3. 일관된 인터페이스를 제공하면서도 다양한 구현을 허용하고자 할 때:
    • 예: 다양한 종류의 결제 수단 클래스에서 공통된 ProcessPayment 메서드를 제공하면서도, 구체적인 결제 로직은 카드, 페이팔, 암호화폐 등에 맞춰 다르게 구현할 수 있습니다.

 

추상 클래스와 메서드는 객체지향 프로그래밍의 강력한 도구로, 상속 구조를 통해 코드의 재사용성을 높이고, 확장 가능하고 유지보수하기 쉬운 코드를 작성할 수 있습니다. 추상 클래스를 사용하면 공통된 기능을 상속받는 모든 클래스에서 재사용하면서도, 각 클래스에 맞는 구체적인 기능을 자유롭게 구현할 수 있습니다. 프로젝트에서 공통된 동작이 필요한 경우 추상 클래스를 적극 활용하여 코드의 일관성과 유지보수성을 높여보세요.