๐ฉ ์ปดํฌ์ง์
- ๊ฐ์ฒด ์งํฅ ์ค๊ณ์์ ์์์ด ๊ฐ์ง Is-A ๊ด๊ณ๋ง ์์กดํด์๋ ์ค๊ณ์ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์
- ์ปดํฌ์ง์ ์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์์ Has-A ๊ด๊ณ๋ฅผ ๊ตฌํํ๋ ์ค๊ณ ๋ฐฉ๋ฒ
- ์ปดํฌ์ง์ ์ ํ์ฉ : ๋ณตํฉ์ ์ธ ๊ธฐ๋ฅ์ ๊ฑฐ๋ํ ํด๋์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ค๊ณํ๋๋ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์
๐ SOLID (์ข์ ๊ฐ์ฒด์งํฅ ์ค๊ณ ํจํด์ ์ ์ํ๊ธฐ ์ํ ๋ชจ๋ ๊ฐ์ฒด ์ค๊ณ ๊ธฐ๋ฒ)
๋จ์ผ ์ฑ ์ ์์น Single Responsibility Principle : ํ๋์ ๊ฐ์ฒด๋ ํ๋์ ์๋ฌด๋ง ๊ฐ์ง๋๋ก ์ค๊ณํ๋ค.
๊ฐ๋ฐฉ ํ์ ์์น Open-Closed Principle : ๊ธฐ์กด์ ๊ตฌํ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋๋ก ์ค๊ณํ๋ค.
๋ฆฌ์ค์ฝํ ์นํ ์์น Liskov Substitution Principle : ์์ ๊ฐ์ฒด๋ฅผ ๋ถ๋ชจ ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํด๋ ์๋์ ๋ฌธ์ ์์ ์ ๋๋ก ์์์ ๋จ์ํ ์ฌ์ฉํ๋ค.
์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น Interface Segregation Design : ๊ฐ์ฒด๊ฐ ๊ตฌํํด์ผ ํ ๊ธฐ๋ฅ์ด ๋ง๋ค๋ฉด ์ด๋ค์ ์ฌ๋ฌ ๊ฐ์ ๋จ์ํ ์ธํฐํ์ด์ค๋ค๋ก ๋ถ๋ฆฌํด ์ค๊ณํ๋ค.
์์กด์ฑ ์ญ์ ์์น Dependency Injection Principle : ๊ตฌํ๋ ์ค๋ฌผ๋ณด๋ค ๊ตฌ์ถํด์ผ ํ ์ถ์์ ๊ฐ๋ ์ ์์กดํ๋ค.
๋ชจ๋ ๊ฐ์ฒด ์ค๊ณ ๊ธฐ๋ฒ์ ํต์ฌ์ ์์์ ๋จ์ํํ๊ณ ,
๋จ์ํ ๊ธฐ๋ฅ์ ๊ฐ์ง ๋ค์์ ๊ฐ์ฒด๋ฅผ ์กฐํฉํด ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์๋ค.
๐ ์ปดํฌ์ง์ ์ค๊ณ ์์
1. ํ๊ต ๊ตฌ์ฑ์ ์์คํ ์ ์ค๊ณ ์์
- ํ๊ต ๊ตฌ์ฑ์์ ์ํด ์ถ์ ์ฆ์ ๋ง๋ค๊ธฐ๋ก ํ๋ค. ์ถ์ ์ฆ์ Person์์ ๊ตฌํํด ์์์ํฌ ๊ฒ์ธ๊ฐ? ์๋๋ฉด ์ปดํฌ์ง์ ์ผ๋ก ๋ถ๋ฆฌํ ๊ฒ์ธ๊ฐ?
2. Person์์ ์ง์ ๊ตฌํํด ์์์ํค๋ ๊ฒฝ์ฐ์ ๋ฌธ์
- ์๋ก์ด ํํ์ ๊ตฌ์ฑ์์ด ๋ฑ์ฅํ๋ค๋ฉด(์๋ฅผ ๋ค์ด ์ถ์ ์ฆ์ด ์๋ ์ธ๋ถ ์ฐ์์) Person์ ์์ ํ ๊ฒ์ธ๊ฐ?
- ์์ ํด๋์ค Person์ ์์ ํ๋ฉด, ํ์ ํด๋์ค๋ค์ ๋์์ ๋ฌธ์ ์์์ ๋ณด์ฅํ ์ ์๋๊ฐ?
3. ๋ฐ๋ผ์ ์ค๊ณ์ ์ผ๋ก ์ถ์ ์ฆ์ ์ปดํฌ์ง์ ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
4. ๊ทธ๋ ๋ค๋ฉด ์ปดํฌ์ง์ ์ผ๋ก๋ง ํฌํจ์ํค๋ฉด ๋ชจ๋ ๊ฒ์ด ํด๊ฒฐ๋ ์ ์๋๊ฐ?
ํ๊ต ๊ตฌ์ฑ์์์ ์ฆ๋ช ํ๋ ์ถ์ ์ฆ ์นด๋์ ๋ถ์ฌ
- ํ์, ๊ต์ฌ, ์ง์ ๋ชจ๋๊ฐ ์์ ์ง๋๊ณ ์์
- ํฅํ ํ์ฅ์ฑ์ ๊ณ ๋ คํด ์ปดํฌ์ง์ ์ผ๋ก ๊ตฌํํจ
๐ฉ ์ธ๋ฆฌ์ผ ์์ง์์์ ์ปดํฌ์ง์ ๊ตฌํ ๋ฐฉ๋ฒ
- ํ๋์ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ์๋ ํญ์ ํด๋์ค ๊ธฐ๋ณธ ์ค๋ธ์ ํธ CDO๊ฐ ์๋ค.
- ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๊ฐ์ ์ปดํฌ์ง์ ์ ์ด๋ป๊ฒ ๊ตฌํํ ๊ฒ์ธ๊ฐ?
- ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ์ ๋ค๋ฅธ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ฅผ ์กฐํฉํ ๋ ๋ค์์ ์ ํ์ง๊ฐ ์กด์ฌํ๋ค.
- ๋ฐฉ๋ฒ1 : CDO์ ๋ฏธ๋ฆฌ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํด ์กฐํฉํ๋ค (ํ์์ ํฌํจ)
- ๋ฐฉ๋ฒ2 : CDO์ ๋น ํฌ์ธํฐ๋ง ๋ฃ๊ณ ๋ฐํ์์์ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํด ์กฐํฉํ๋ค (์ ํ์ ํฌํจ)
- ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ ๋ ์ปดํฌ์ง์
์ ๋ณด๋ฅผ ๊ตฌ์ถํ ์ ์๋ค.
- ๋ด๊ฐ ์์ ํ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ฅผ Subobject๋ผ ํ๋ค.
- ๋๋ฅผ ์์ ํ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ฅผ Outer๋ผ ํ๋ค.
- ํด๋์ค ๊ธฐ๋ณธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ฑ์ ์ฝ๋๋ฅผ ์ฌ์ฉํด ๋ณต์กํ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ ์ ์๋ค.
- ์ธ๋ฆฌ์ผ C++์ด ์ ๊ณตํ๋ ํ์ฅ ์ด๊ฑฐํ์ ์ฌ์ฉํด ๋ค์ํ ๋ฉํ ์ ๋ณด๋ฅผ ๋ฃ๊ณ ํ์ฉํ ์ ์๋ค.
๐ Subobject๊ฐ ํ์์ ํฌํจ์ธ์ง ์ ํ์ ํฌํจ์ธ์ง์ ๋ฐ๋ผ์ ์ ํํ๋ฉด ๋๋ค.
์ : ์์ฑ์ ์ฝ๋
ํ : ๋ฐํ์์์ ์์ฑ๋๋ API๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ
๐ MyGameInstance(cpp)
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyGameInstance.h"
#include "Student.h"
#include "Teacher.h"
#include "Staff.h"
#include "Card.h"
UMyGameInstance::UMyGameInstance() // ์์ฑ์ ์ฝ๋
{
SchoolName = TEXT("๊ธฐ๋ณธํ๊ต"); // CDO์ ๊ธฐ๋ณธ๊ฐ ์ค์
}
void UMyGameInstance::Init()
{
Super::Init();
UE_LOG(LogTemp, Log, TEXT("=========="));
TArray<UPerson*> Persons = { NewObject<UStudent>(), NewObject<UTeacher>(), NewObject<UStaff>()};
for (const auto Person : Persons) {
const UCard* OwnCard = Person->GetCard();
check(OwnCard); // if๋ฌธ ๋์
ECardType CardType = OwnCard->GetCardType();
// UE_LOG(LogTemp, Log, TEXT("%s๋์ด ์์ ํ ์นด๋ ์ข
๋ฅ %d"), *Person->GetName(), CardType);
// enum์ ๋ฉํ์ ๋ณด ์ถ๋ ฅ
const UEnum* CardEnumType = FindObject<UEnum>(nullptr, TEXT("/Script/UnrealComposition.ECardType"));
if (CardEnumType) {
FString CardMetaData = CardEnumType->GetDisplayNameTextByValue((int64)CardType).ToString();
UE_LOG(LogTemp, Log, TEXT("%s๋์ด ์์ ํ ์นด๋ ์ข
๋ฅ %s"), *Person->GetName(), *CardMetaData);
}
}
UE_LOG(LogTemp, Log, TEXT("=========="));
}
๐ Card(h, cpp)
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Card.generated.h"
UENUM()
enum class ECardType : uint8
{
Student = 1 UMETA(DisplayName = "For Student"),
Teacher UMETA(DisplayName = "For Teacher"),
Staff UMETA(DisplayName = "For Staff"),
Invalid
};
/**
*
*/
UCLASS()
class UNREALCOMPOSITION_API UCard : public UObject
{
GENERATED_BODY()
public:
UCard();
ECardType GetCardType() const { return CardType; }
void SetCardType(ECardType InCardType) { CardType = InCardType; }
private:
UPROPERTY()
ECardType CardType;
UPROPERTY()
uint32 Id;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "Card.h"
UCard::UCard()
{
CardType = ECardType::Invalid;
Id = 0;
}
'โ๏ธ ์์ง > ๐ซ ์ธ๋ฆฌ์ผ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Unreal] ์ธ๋ฆฌ์ผ ์ปจํ ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ1 - Array์ Set (0) | 2024.05.04 |
---|---|
[Unreal] ๋ธ๋ฆฌ๊ฒ์ดํธ (0) | 2024.05.04 |
[Unreal] ์ธํฐํ์ด์ค (0) | 2024.05.03 |
[Unreal] ํต์ ๋ฉ๊ฐ์ค์บ (1) | 2024.05.01 |
[Unreal] ์์ํด์ ์ธ๋ฆฌ์ผ2022 ์ ๋ฆฌ (1) | 2024.05.01 |