본문 바로가기

C# 공부/C# 기본 문법

추상 클래스 (클래스와 인터페이스의 사이)

abstract 키워드로 선언되며, 추상 클래스는 인터페이스와는 달리 "구현" 을 가질 수 있다.

하지만, 클래스와는 달리 인스턴스는 만들 수 없다.(인터페이스와 동일) 즉, 인터페이스와 클래스의 사이.

구현된 메소드를 가질 수 있지만, 추상 메소드(Abstract Method)도 가질수있어서 인터페이스의 역할도 할 수 있게 한다.

+) 추상메소드는 구현시 override 키워드를 사용한다.

추상 클래스의 모든 메소드는 한정자를 명시하지 않을시 private 이며, C#컴파일러가 public, protected, internal, protected internal 중 하나로 수식될것을 강요한다. 

* 추상클래스를 사용하는 이유

추상 클래스를 사용하는 프로그래머가 그 기능을 정의하도록 강제하는 기능을한다. 

일반 클래스를 통해서도 매뉴얼을 통해 "이 클래스는 직접 인스턴스화 하지 말고 파생클래스를 만들어 사용해야한다. 그리고 MethodA()와 MethodB()를 꼭 오버라이딩 해야 합니다."라는 식으로 안내는 할수있지만, 강제시킬수는 없다.

하지만 추상 클래스를 이용한다면 내가만든 추상클래스를 사용하는 모든 프로그래머가 파생클래스를 만들어야 하며 모든 추상메소드를 구현해야하는것이 강제된다. 

(이러한 측면에서 추상메소드가 없는 추상클래스는 문법적 하자가 없지만 별 의미가 없는 코드다.)

abstract class AbstractBase
{
    protected void PrivateMethodA() //구현메소드
    {
        Console.WriteLine("AbstractBase.PriateMethodA()");
    }

    public void PublicMethodA()
    {
        Console.WriteLine("AbstractBase.PublicMEthodA()");
    }

    public abstract void AbstractMethodA();//추상메소드
}

class Derived : AbstractBase
{
    public override void AbstractMethodA() //추상메소드는 구현시 오버라이드사용
    {
        Console.WriteLine("Derived.AbstractMethodA()");
        PrivateMethodA();
    }
}

class Program
{
    static void Main(string[] args)
    {
        AbstractBase obj = new Derived();
        obj.AbstractMethodA();
        obj.PublicMethodA();
    }
}