C# 추상(abstract) 클래스와 메서드

2024. 9. 18. 18:13c#

C#에서의 추상 클래스와 메서드

추상 클래스와 메서드는 C#에서 객체지향 프로그래밍(OOP)의 중요한 개념 중 하나로, 코드의 재사용성과 확장성을 높이는 데 큰 역할을 합니다. 이 포스팅에서는 C#에서 추상 클래스와 추상 메서드가 무엇인지, 그리고 이들을 사용하는 이유와 구현 방법을 알아보겠습니다.


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 메서드를 제공하면서도, 구체적인 결제 로직은 카드, 페이팔, 암호화폐 등에 맞춰 다르게 구현할 수 있습니다.

 

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