제로의영역

8.5 추상 클래스 본문

C#

8.5 추상 클래스

아이큐제로 2019. 6. 26. 18:02

* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.

* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.

 

1. 정의: 구현을 가질 수 있지만 인스턴스(객체)를 가질 수 없는 미완성 클래스로 상속받는 클래스들이 지켜야 하는 규칙을 정해주는 클래스

 

2. 용도: 추상 클래스를 사용하는 다른 제작자가 그 기능을 정의하도록 강제하여 파생클래스나 오버라이딩을 사용할 수 있도록 하게 하기 위해 사용.(팀 프로젝트나 다른 코드를 가져와 사용할 경우 혼선을 줄이는데 중요함)

 

3. 특징

 (1) 구현을 가질 수 있음

 (2) 인스턴스를 가질 수 없음

 (3) 한정자를 명시하지 않으면 모든 메소드가 private으로 선언

 (4) 추상 메소드를 가짐

 

   1) 추상 메소드의 정의: 추상 클래스가 인터페이스의 역할도 할 수 있게 해주는 장치

   2) 추상 메소드의 용도: 파생 클래스에서 반드시 구현하도록 강제함.(추상 클래스를 상속하는 클래스들이 반드시 이 메소드를 갖고 있을 거라는 "약속")

   3) 추상 메소드의 특징: C# 컴파일러에 의해 반드시 public, protected, internal, protected internal 한정자 중 하나로 수식 될 것을 강요.

   4) 사용법

    A. 선언(생성): 한정자+abstract+반환형식+메소드이름( )

    B. 구현

     (A) 추상 클래스의 파생 클래스(자식 클래스)에서 사용

     (B) 구현: 한정자+override+반환형식+메소드 이름( )

 

 (5) 다른 추상 클래스를 상속하여 사용 가능: 자식 추상 클래스는 부모 추상 클래스의 추상 메소드를 구현하지 않아도 됨. 추상 메소드는 인스턴스를 생성할 클래스에서 구현.

 

4. 사용법

 (1) abstract 한정자 + class + 클래스 이름

 (2) 파생클래스(자식클래스)에서 상속받아 사용함.

 

예제)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ex8._4
{
    abstract class AbstractBase                                     //추상 클래스
    {
        protected void PivateMethodA()                              //구현(메소드)
        {
            Console.WriteLine("AbstractBase.PrivateMethodA()");
        }
        public void PublicMethodA()                                 //구현(메소드)
        {
            Console.WriteLine("AbstractBase.PublicMethodA()");
        }
        public abstract void AbstractMethodA();                     //추상 메소드(abstract 확인):파생클래스에서는 무조건 구현해야함
    }

    class Derived:AbstractBase                                      //추상 클래스를 상속받은 파생클래스
    {
        public override void AbstractMethodA()                      //추상 메소드 구현(override 확인)
        {
            Console.WriteLine("Derived.AbstractMethodA()");
            PivateMethodA();
        }
    }

    class MainProgram
    {
        static void Main(string[] args)
        {
            AbstractBase obj = new Derived();                       //파생클래스를 가리키는 객체 obj 생성
            obj.AbstractMethodA();                                  //추상메소드 구현
            obj.PublicMethodA();                                    //상속받은 추상클래스의 메소드 구현
        }
    }
}

 실행결과

Derived.AbstractMethodA()
AbstractBase.PrivateMethodA()
AbstractBase.PublicMethodA()