추상화에 대한 개념 정리이다
추상화란 복잡한 것을 단순하게 표현하는 것이다.
즉, 공통된 특징만 뽑아서 클래스를 설계하는 것이다.
인터페이스와 추상 클래스는 얼핏보면 비슷해 보이지만 다른 구조를 가지고 있다.
추상 클래스 (abstruct)
추상 클래스는 구현이 강제 된다.
필드,생성자, 메소드를 멤버로 가질 수 있다.
인터페이스와 달리 상속은 하나만 가능하다.
즉, 인터페이스는 약속만 하는것이고, 추상 클래스는 일부 구현 + 일부 강제화 된다.
공통기능이 있을 때
여러 클래스에서 비슷한 동작을 공유할 때, 중복을 줄이고 싶을 때 사용한다.
(예시 : 몬스터, 보스 -> 모두 데미지를 받거나 죽는 기능이 필요하다.)
유지보수가 쉬워진다
새로운 오브젝트를 추가할 때, 추상 클래스나 인터페이스 덕분에 코드를 많이 수정할 필요 없다.
유닛 테스트, 의존성 분리에 유리
공격하는 로직만 테스트하고 싶을 때 IAttackable로 분리해두면, 실제 오브젝트 없이도 테스트 가능.
public abstract class Enemy
{
public void Move()
{
// 공통 이동
Debug.Log("앞으로 이동!");
}
public abstract void Attack(); // 추상 메서드: 자식이 반드시 구현해야 함
public virtual void Die()
{
Debug.Log("기본 죽는 연출");
}
}
public class Orc : Enemy
{
public override void Attack() // abstract는 반드시 override
{
Debug.Log("도끼로 공격!");
}
public override void Die() // virtual은 선택사항. override 안 해도 OK
{
Debug.Log("으악! 으어억!!");
}
}
기본 동작은 있지만 자식이 바꿔도 되는 메소드
즉, 기본은 제공하되 유연성을 주고 싶을 때
예시) Die() 같은 건 대부분 공통되지만, 보스만 특별한 연출 or 플레이어 연출 -> virtual
추상화는 "개념"이고, abstract/interface/virtual 은 각각 그걸 실현하는 방법이다.
abstruct는 강제, virtual은 기본제공 + 선택적 재정의로 구분 하면 된다.
덕분에 추상화에 대해 더 잘 알게 되었어요!