C#을 배운지 조금 지나면 접해볼 수 있는 개념이다. 간단하게 부모의 클래스로 부터 상속을 받은 자식 클래스 에서는 부모의 코드들을 사용할 수 있게 되는 것이다.
여기서 부모 클래스는 기반 클래스(Base Class)
자식 클래스는 파생 클래스(Derived Class)
라고 부른다
왜 상속을 해야할까?
처음 상속에 대한 개념을 배웠을 때 코드를 재활용할 수 있겠구나 정도로 인식했다.
실제로 이제 상속의 개념을 사용할 때가 되니 어떠한 장점들이 있을까 다시 한 번 정리 해본다.
이외에도 다른 장점이 있겠지만, 이정도면 사용하지 않을 이유가 없다.
팀 프로젝트에서는 AI를 관리하는 AI Agent 라는 Class가 있다. 이 Class 에서는 총 3개의 AI들을 관리 하는데 AI들마다 공통으로 필요한 부분, 각자 필요한 부분이 있다.
이번 프로젝트에서는 기능 구현하기에 급급하여 이를 구분하지 않고, 하나의 Class에서 모두 처리를 했었다.
내 경우와 같이 처리할 경우 불필요한 코드들이 메모리에 할당되어 메모리 낭비가 발생하고 있었을 것이다.
그래서 공통으로 필요한 아래 내역들은 AI Agent에 두고 나머지는 따로 관리 하고자 한다.
이렇게 필요 없이 할당 되던 녀석들을 분리하여 자식 클래스에 옮겨 두었다.
부모에서 Awak()를 통해 대부분은 처리 되지만, 아래와 같이 추가 작업이 필요한 아이들이 있어
부모의 클래스에는 Virtual, 자식의 클래스는 override 해주어 자식 클래스에서 확장하여 사용할 수 있도록 구현하였다
Vritual ? Override?
Virtual 과 Override는 C#에서 상속 관계 처리 시 사용 되는 메소드이다. 부모에서 동작하는 메소드를 자식에서 호출할 수 있게 만드는 것이다.
부모 코드
public class AIAgent : MonoBehaviour
{
protected virtual void Awake()
{
부모에서 작동할 내용
}
}
자식 코드
public class Daeri_Agent : AIAgent
{
Protected override void Awake()
{
base.Awake();
자식에서 추가로 동작할 내용
}
}
이렇게 부모에서 Awake() 를 통해 작동한 것 외에 자식에서 추가적으로 동작이 필요할 때 위와 같은 구조로 설정해주고, base.Awake()를 해주면 부모를 호출하며 부모의 기능 + 자식의 기능을 모두 수행할 수 있도록 해준다
이러한 방법을 통해 100라인 가까이 중복 되며 낭비 메모리 누수를 만들던 코드들을 정리했다.
상속이라는 개념 자체는 크게 어렵지 않아서 그냥 하면 될 거 같다. 라고 가볍게 생각하고 있었는데, 실제 정리를 하다 보니 내가 생각하는 개념과 조금 다른 부분이 있어서 기억해두기 위해 기록을 남긴다.
부모 클래스에 선언된 변수들은 자식 클래스도 가지고 있는다
Animator와 NavMeshAgent와 같이 모든 AI 들이 공통으로 사용하는 변수가 있다. 상속을 처리하기 전에는 얘들은 각자 사용되는 애들이니까 자식 클래스에서 따로 변수 선언을 하면 되겠다. 라고 생각 했지만
굳이 그럴 필요는 없었다. 부모에게 선언하고, 자식이 그 부모를 상속하면 자식에게도 부모에서 선언된 변수들이 모두 할당 된다. 오히려 부모에 선언 된 메소드 들을 수행하려면 자식에게 할당 될 경우 instance를 해야하기에 더 꼬이게 된다.
아래와 같이 단순 상속만 받아도 부모의 변수들이 추가된다.
물론 public or protected 선언된 접근제한자 들을 private으로 변경해주면 가져가지 못하게 할 수는 있다.
이론으로 이해했더라도 실제로 적용을 많이 해볼 필요가 있다는 것을 느꼈다.
열심히 유니티 공부중입니다. 내용 중 틀린 부분이 있다면 지적 부탁드립니다 :)