IT/UE5

언리얼 컴포지션

u149_cinderella 2025. 1. 28. 01:16

상속과 다른게 뭘까 싶어서 GPT에게 물어봤다

상속은 is-a관계

 

컴포지션은 has-a관계

 

둘 각각의 비유를 보면

 

자동차는 차량이다.

자동차는 엔진과 바퀴를 가지고 있다.

 

이런 차이가 있다

쉽지않다

가장 중요한건

이거다

 

새로운 기능 추가를 위해 상속을 해야하느냐 컴포넌트를 추가로 해결할수있느냐

 

그냥 간단하게 부모객체를 수정하면 되는거아닌가 싶은데

이 아래로도 이유를 쭉 적어놨는데 그냥 비슷비슷한 말이다 안정성이 좋지못하다는 말이다

아직 이해가 잘되지않아 질문을 하나 더해봤다

 

자식객체에서 구현하면 되지않느냐 물어봤더니

이런식으로 중복코드가 생기고 유지보수가 어려워지게 되는데

 

이렇게 "딸깍"으로 해결가능하게 해준다는 것이다

짤린 코드까지 포함해서 다시 올린다

class UDialogueComponent : public UActorComponent
{
public:
    void StartDialogue(const FString& DialogueText)
    {
        UE_LOG(LogTemp, Log, TEXT("Dialogue: %s"), *DialogueText);
    }
};

// 부모 클래스
class AParentActor : public AActor
{
protected:
    UPROPERTY()
    UDialogueComponent* DialogueComponent;

public:
    AParentActor()
    {
        DialogueComponent = CreateDefaultSubobject<UDialogueComponent>(TEXT("DialogueComponent"));
    }
};

// 자식 클래스
class ANPCActor : public AParentActor
{
public:
    void Interact()
    {
        DialogueComponent->StartDialogue(TEXT("Hello! I am an NPC."));
    }
};

class AEnemyActor : public AParentActor
{
public:
    void Interact()
    {
        DialogueComponent->StartDialogue(TEXT("Prepare for battle!"));
    }
};

부모에서는 CreateDefaultSubobject 만 생성해두고 자식에서는 기능만을 사용해주는 모습이다

 

그러면 이제 CreateDefaultSubobject가 궁금하다

물어봐보자

이걸 왜 생성해야하는가

모든 객체는 CDO가 기반이다

 

결국 거의 대부분의 경우는 CDO로 만들어줘야한다.

 

이런식으로도 작성이 가능하구나 감탄스럽다

이런거는 직접 만들면서 경험적으로 배워야해서 일단은 지식으로서 머리속 어딘가에 기억만 해두고 나중에 필요할때 다시 보자