본문 바로가기
프로그래밍 언어

C# 추상 클래스

by do_ng 2024. 3. 5.

 

추상 클래스란?

클래스처럼 구현부를 갖되 인스턴스를 만들지 못함 

 

추상 메소드를 가질 수 있는데 추상 클래스를 상속하는 클래스들이 반드시 해당 추상 메소드를 구현하도록 강제하는 부분에서 인터페이스의 "약속"에 대한 역할도 담당한다. 

 

public abstract class BaseScene : MonoBehaviour
{     
    public abstract void Clear();
}

 

public class LoginScene : BaseScene
{  
    public override void Clear()
    {
        Debug.Log("Login Scene Clear!");
    }
}
public class GameScene : BaseScene
{       
    public override void Clear()
    {
		Debug.Log("Game Scene Clear!");
    }
}

 

Scene이 다른 Scene으로 바뀌기 전에 무조건 현재 씬에 대한 정보를 메모리에서 제거하는 작업을 한다고 가정했을 때 

Clear() 라는 추상 메소드를 만들어주고 모든 Scene은 Clear()라는 메소드를 무조건 가지고 있도록 강제할 수 있다. 

 

추상 클래스가 무슨 쓸모가 있길래 왜 만들어 냈을까?

추상 메소드는 추상 클래스를 사용하는 프로그래머가 그 기능을 정의하도록 강제하는 장치이다. 

우리는 똑같은 일을 보통의 클래스를 통해서도 할 수 있다. 그냥 메소드를 선언하고 클래스에 대한 메뉴얼을 작성해서 코드와 함께 배포한다. "이 클래스는 직접 인스턴스화하지 말고 파생 클래스를 만들어서 사용하라" 그리고 "MethodA() 는 꼭 오버라이딩 해야 한다고" 라고 말해도 깜빡하고 오버라이딩 하지 않거나 실수로 추상 클래스 역할을 하는 것에 대해 인스턴스를 만들 수 있기 때문에 프로그래머들이 준수하도록 강제시킬 수 없다. 

 

이를 강제적으로 하게끔 규칙을 정해두면 일일히 설명하지 않아도 프로그래머는 그 코드만 보고 알아서 판단을 할 수 있기 때문에 추상 클래스를 사용한다.

 

 

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

public abstract class BaseScene : MonoBehaviour
{    
    public Defines.Scene SceneType
    {
        get;
        protected set;
    } = Defines.Scene.Unknown;

    // Awake는 게임 오브젝트가 비활성인 상태에서도 실행됨 
    // Start() 경우는 비활성인 상태에서 실행이 안됨 
    void Awake()
    {
        Init();
    }

    protected virtual void Init()
    {        
        Object obj = GameObject.FindObjectOfType(typeof(EventSystem));
        if (obj == null)
            Managers.Resource.Instantiate("UI/EventSystem").name = "@EventSystem";
    }

    public abstract void Clear();
}

추상 클래스는 구현부를 가진 메소드와 프로퍼티 또는 선언부만 가진 메소드를 사용할 수 있다. 

인터페이스도 메소드, 프로퍼티 .. 등을 가질 수 있지만 구현부가 없는 형태로 모두 선언부만 가질 수 있다.

 

개발의 초기 기획, 설계 단계에서는 어떤 캐릭터가 어떻게 동작하고 아직 구체적인 사항들이 정해지지 않았으니까 추상 클래스를 사용하기 보다 인터페이스로 기본 뼈대를 잡는식으로 진행한다고 생각한다.

'프로그래밍 언어' 카테고리의 다른 글

C# 프로퍼티  (0) 2024.03.03
C# 상수와 열거형  (0) 2024.02.29
C# reflection  (0) 2024.02.28
객체지향 프로그래밍(OOP) 개념정리  (0) 2024.01.25
C# Delegate(대리자)  (0) 2023.11.10