본문 바로가기
카테고리 없음

[C#] 추상 클래스와 추상 메서드의 개념과 활용 방법

by 피크인사이트 2024. 4. 15.
반응형

객체 지향 프로그래밍에서 추상 클래스와 추상 메서드는 코드의 구조화와 유연성을 증가시키는데 도움이 되는 도구입니다.

이 두 가지 개념은  객체 지향적인 설계를 구현하는 데에 필수적인 다형성과 상속의 핵심 요소입니다

 

이번 글에서는 추상 클래스와 추상 메서드의 개념과 활용 방법을 자세히 알아보겠습니다

 

<추상클래스와 추상메서드>

 

1. 추상 클래스(Abstract Class) 란?

일반적인 클래스와는 달리 추상 클래스는  한 개 이상의 추상메서드를 포함할 수 있으며, 추상 메서드는 구현이 없는 메서드로 파생 클래스에서는 반드시 구현되어야 합니다.

또한, 추상 클래스는 직접적으로 인스턴스화될 수 없고 파생 클래스를 통해 인스턴스화되어 사용됩니다.

 

추상 클래스도 일반 클래스처럼 필드, 속성과 일반 메서드를 포함할 수 있습니다.

하지만 추상 클래스 내에는 추상 메서드뿐만 아니라 구현된 메서드도 함께 존재할 수 있습니다.

이렇게 구현된 메서드는 파생 클래스에서 필요에 맞게 오버라이드하여 재정의할 수 있습니다.


2. 추상 메서드(Abstract Method) 란?

 

추상 메서드는 메서드의 선언만 하고 실제 구현이 없는 메서드를 의미합니다. 

따라서, 추상 메서드는 메서드의 시그니처만 정의되어 있고 실제 동작은 하위 클래스에서 구현되어야 합니다. 

그렇게 때문에 추상 메서드를 포함하는 클래스는 필수적으로 추상 클래스로 선언되어야 하며, 파생 클래스에서는 모든 추상 메서드를 반드시 구현하여야 합니다. 

 

하위 클래스에서 반드시 구현되어야 하는 추상 메서드는 다형성을 구현하는 데에 중요한 역할을 합니다.

추상 메서드를 통해 상위 클래스는 메서드의 동작 방식을 정의하고, 하위 클래스는 해당 동작을 실제로 구현함으로써 객체 지향적인 다형성을 구현할 수 있습니다.


3. 추상 클래스의 선언과 사용

추상 클래스(Abstract Class)를 선언하고 사용하는 방법은 다음과 같습니다 

 

// 추상 클래스 선언
abstract class Shape
{
    // 추상 메서드 선언
    public abstract double Area();

    // 구현된 메서드
    public void Display()
    {
        Console.WriteLine("Shape");
    }
}

// 추상 클래스를 상속받은 파생 클래스
class Circle : Shape
{
    private double radius;

    // 추상 메서드 구현
    public override double Area()
    {
        // 원의 넓이
         return Math.PI * radius * radius;
    }
}

 

위 예제에서는 'Shape' 추상 클래스를 정의하고 'Area' 추상 메서드를 선언하였습니다. 

이를 상속받은 'Circle' 클래스에서는 'Area' 메서드를 구현하여야 합니다. 

추상 클래스 내에는 구현된 'Display' 메서드와 추상 메서드인 'Area'가 함께 존재하고 있습니다.


4. 추상 클래스와 추상 메서드의 활용 예시

추상 클래스와 추상 메서드는 다형성을 구현하는 데에 주로 활용됩니다 

예를 들어, 여러 도형을 표현하는 Shape라는 추상 클래스를 정의하고,  각 도형에 대한 면적을 계산하는 추상 메서드 Area를 선언할 수 있습니다.

이를 상속받은 구체적인 도형 클래스에서는 각 도형에 맞는 Area 메서드를 구현하여 면적을 계산할 수 있습니다. 

abstract class Shape
{
    public abstract double Area();
}

class Circle : Shape
{
    private double radius; //radius

    public Circle(double radius)
    {
        this.radius = radius;
    }

    public override double Area()
    {
        //원의 넓이
        return Math.PI * radius * radius;
    }
}

class Rectangle : Shape
{
    private double width;
    private double height;

    public Rectangle(double width, double height)
    {
        this.width = width;
        this.height = height;
    }

    public override double Area()
    {
        return width * height;
    }
}

 

위의 예제에서는 Circle과 Rectangle 클래스가 Shape 추상 클래스를 상속받고 있으며, 각 도형 클래스에서는 추상 메서드인 Area를 구현하여 해당 도형의 면적을 계산하고 있습니다.  

 

5. 인터페이스와의 차이점

추상 클래스와 인터페이스는 모두 다형성을 구현하는 데에 사용될 수 있지만, 그 차이가 있습니다.

추상 클래스는 하위 클래스에서 반드시 구현되어야 하는 멤버(추상 메서드)를 포함할 수 있으며, 일반 메서드나 필드도 포함할 수 있습니다.

반면에 인터페이스는 구현된 메서드가 없으며, 모든 멤버가 추상적인 선언만을 포함합니다.

하나의 추상클래스만 상속받을 수 있는 클래스와 다르게 인터페이스(Interface)는 여러개를 구현할 수 있습니다.

따라서 추상 클래스는 클래스 간의 계층 구조를 나타내는 데에 주로 사용되고, 인터페이스는 클래스가 특정 기능을 제공함을 나타내는 데에 주로 사용됩니다.

 

6. Finalize 메서드와의 관계

추상 클래스 내에 정의된 추상 메서드는 하위 클래스에서 필수적으로구현되어야 합니다.

그렇지 않으면 하위 클래스 역시 추상 클래스가 되어야 하며, 이 과정을 반복하면서 추상 메서드를 구현하지 않은 클래스는 최종적으로 추상 클래스가 됩니다.

 

그러나, Finalize 메서드와의 관계에서는 예외가 있습니다.

Finalize 메서드는 가비지 컬렉션에서 개체의 소멸 전에 호출되는 메서드입니다. 

추상 클래스에는 Finalize 메서드를 정의할 수 있지만, 파생 클래스에서 Finalize 메서드를 재정의할 수 없습니다. 

이것은 파생 클래스에서 Finalize 메서드를 재정의하여 구현할 수 있는 대신 파생 클래스에서 자원의 정리나 소멸을 위한 가상 메서드를 구현하도록 권장되기 때문입니다. 

따라서 추상 클래스 내에서 Finalize 메서드를 포함하는 것은 일반적으로 권장되지 않습니다.  


마무리

추상 클래스와 추상 메서드는 객체 지향 프로그래밍에서 중요한 개념으로 다형성을 구현하고 코드의 유지보수성을 높이는 데에 큰 도움을 줍니다 

추상 클래스는 하위 클래스에서 필수적으로 구현되어야 하는 추상 메서드를 포함할 수 있으며, 다른 메서드와 필드도 함께 포함할 수 있습니다.

따라서 추상 클래스와 추상 메서드를 올바르게 활용하여 프로그램의 유연성과 확장성을 높일 수 있습니다.

반응형