언리얼 C++ 모던객체지향 설계 Review

myeongrangcoding·2023년 12월 1일

SectionTwoReview

인터페이스, 컴포지션

  • 클래스 설계
    • MyGameInstance: 객체 생성, 로그를 통해 동작 확인.
    • Person
      • 멤버: Name, Subscribe 컴포지션, Getter(), Setter().
    • WatchInterface
      • 멤버: DoWatch().
    • Subscriber: Person 상속, WatchInterface 상속.
      • 멤버: DoWatch() override.
    • Staff: Person 상속
  • 목표
    • 인테페이스를 사용해서 프레임웍을 구축, 컴포지션 기법 사용.

// Fill out your copyright notice in the Description page of Project Settings.


#include "MyGameInstance.h"
#include "Subscriber.h"
#include "Staff.h"
#include "Subscribe.h"

UMyGameInstance::UMyGameInstance()
{
	OTTName = TEXT("이OTT");
}

void UMyGameInstance::Init()
{
	Super::Init();

	OTTName = TEXT("넷플릭스");

	USubscriber* Subscriber1 = NewObject<USubscriber>();
	Subscriber1->SetName(TEXT("이구독자1"));
	USubscriber* Subscriber2 = NewObject<USubscriber>();
	Subscriber2->SetName(TEXT("이구독자2"));

	UStaff* Staff1 = NewObject<UStaff>();
	Staff1->SetName(TEXT("이관리자1"));

	UE_LOG(LogTemp, Log, TEXT("============================"));

	IWatchInterface* WatchInterface = Cast<IWatchInterface>(Subscriber1);
	if (WatchInterface)
	{
		const USubscribe* OwnSubscribe = Subscriber1->GetSubscribe();
		ESubscribeType SubscribeType = OwnSubscribe->GetSubscribeType();

		UE_LOG(LogTemp, Log, TEXT("%s님이 소유한 구독 종류 %d"), *Subscriber1->GetName(), SubscribeType);
		UE_LOG(LogTemp, Log, TEXT("%s님은 콘텐츠를 시청할 수 있습니다."), *Subscriber1->GetName());
		WatchInterface->DoWatch();
	}

	WatchInterface = Cast<IWatchInterface>(Subscriber2);
	if (WatchInterface)
	{
		const USubscribe* OwnSubscribe = Subscriber2->GetSubscribe();
		ESubscribeType SubscribeType = OwnSubscribe->GetSubscribeType();

		const UEnum* SubscribeEnumType = FindObject<UEnum>(nullptr, TEXT("/Script/SectionTwoReview.ESubscribeType"));
		check(SubscribeEnumType);

		FString SubscribeMetaData = SubscribeEnumType->GetDisplayNameTextByValue((int64)SubscribeType).ToString();
        
		UE_LOG(LogTemp, Log, TEXT("%s님이 소유한 구독 종류 %s"), *Subscriber1->GetName(), *SubscribeMetaData);
		UE_LOG(LogTemp, Log, TEXT("%s님은 콘텐츠를 시청할 수 있습니다."), *Subscriber2->GetName());
		WatchInterface->DoWatch();
	}

	WatchInterface = Cast<IWatchInterface>(Staff1);
	if (WatchInterface)
	{
		UE_LOG(LogTemp, Log, TEXT("%s님은 콘텐츠를 시청할 수 있습니다."), *Staff1->GetName());
		WatchInterface->DoWatch();
	}
	else
	{
		UE_LOG(LogTemp, Log, TEXT("%s님은 콘텐츠를 시청할 수 없습니다."), *Staff1->GetName());
	}

	UE_LOG(LogTemp, Log, TEXT("============================"));
}


델리게이트

  • 클래스 설계
    • SubscribeInfo: 콘텐츠 제작자.
    • MyGameInstance: 발행자.
    • Subscriber: 구독자.
    • Person(Subscriber)는 SubscribeInfo에 대한 헤더를 포함하지 않고, SubscribeInfo도 마찬가지고 cpp나 헤더에 Person(Subscriber) 관련된 헤더를 포함하지 않는다.
      • 둘은 완전히 개별적으로 구현한다.
  • 목표
    • 시스템(SubscriberInfo)에서 구독 정보를 변경하면은 알림 구독한 구독자들에게 변경 내용을 자동으로 전달.
// Fill out your copyright notice in the Description page of Project Settings.


#include "MyGameInstance.h"
#include "Subscriber.h"
#include "Staff.h"
#include "SubscribeInfo.h"

UMyGameInstance::UMyGameInstance()
{
	OTTName = TEXT("이OTT");
}

void UMyGameInstance::Init()
{
	Super::Init();
	OTTName = TEXT("넷플릭스");

	SubscribeInfo = NewObject<USubscribeInfo>(this);

	UE_LOG(LogTemp, Log, TEXT("============================"));

	USubscriber* Subscriber1 = NewObject<USubscriber>();
	Subscriber1->SetName(TEXT("구독자1"));
	USubscriber* Subscriber2 = NewObject<USubscriber>();
	Subscriber2->SetName(TEXT("구독자2"));
	USubscriber* Subscriber3 = NewObject<USubscriber>();
	Subscriber3->SetName(TEXT("구독자3"));

	SubscribeInfo->OnChanged.AddUObject(Subscriber1, &USubscriber::GetNotification);
	SubscribeInfo->OnChanged.AddUObject(Subscriber2, &USubscriber::GetNotification);
	SubscribeInfo->OnChanged.AddUObject(Subscriber3, &USubscriber::GetNotification);

	SubscribeInfo->ChangeSubscribeInfo(OTTName, TEXT("변경된 구독 정보"));

	UE_LOG(LogTemp, Log, TEXT("============================"));
}

profile
명랑코딩!

0개의 댓글