추상 클래스란?
클래스처럼 구현부를 갖되 인스턴스를 만들지 못함
추상 메소드를 가질 수 있는데 추상 클래스를 상속하는 클래스들이 반드시 해당 추상 메소드를 구현하도록 강제하는 부분에서 인터페이스의 "약속"에 대한 역할도 담당한다.
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 |