Public·Private 폴더와 헤더 공개 범위 설계
5강. Public·Private 폴더와 헤더 공개 범위 설계
1. 이번 강의에서 해결할 문제
플러그인의 모든 헤더를 Public에 두면 소비 프로젝트가 내부 Scanner 구현과 Slate Widget까지 Include합니다. 이후 파일 이름이나 내부 자료구조를 바꾸는 것이 호환성 파괴가 됩니다. 반대로 외부에서 생성·상속해야 하는 타입을 Private에 두면 정상적인 사용 경로가 막힙니다.
2. 학습 목표
3. 핵심 개념
Unreal 모듈의 Public/Private 폴더는 C++ 접근 지정자가 아니라 다른 모듈에서 Header를 Include할 수 있는 범위입니다. Public Header를 변경하면 이를 소비하는 모듈이 다시 컴파일될 수 있습니다. 따라서 Public에는 인터페이스, 설정 가능한 데이터 구조와 의도된 확장 클래스만 둡니다.
ReusableInteraction/Source/ReusableInteraction/
├─ Public/
│ ├─ Interaction/Interactable.h
│ ├─ Interaction/InteractionComponent.h
│ └─ Settings/InteractionSettings.h
└─ Private/
├─ Interaction/InteractionComponent.cpp
├─ Interaction/InteractionTracePolicy.h
└─ ReusableInteractionModule.cpp
4. 단계별 실습
공개 Component는 외부가 설정하고 호출할 최소 계약만 제공합니다.
#pragma once
#include "Components/ActorComponent.h"
#include "InteractionComponent.generated.h"
UCLASS(ClassGroup=(Interaction), meta=(BlueprintSpawnableComponent))
class REUSABLEINTERACTION_API UInteractionComponent : public UActorComponent
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category="Interaction")
bool TryInteract();
protected:
UPROPERTY(EditAnywhere, Category="Interaction", meta=(ClampMin="0.0"))
float MaxDistance = 350.0f;
private:
bool FindBestTarget(FHitResult& OutHit) const;
};
InteractionTracePolicy.h는 Trace 후보 정렬을 위한 내부 Helper이므로 Private에 둡니다. 소비 프로젝트는 TryInteract와 설정값만 알고, 후보 수집 알고리즘은 계약이 아닙니다.
Public Header 리뷰 질문:
- 외부 모듈이 이 타입을 생성·상속·멤버로 보관해야 하는가?
- 노출한 타입 때문에 새 PublicDependency가 필요한가?
- 이 이름과 함수 시그니처를 다음 버전에서도 유지할 의사가 있는가?
5. 코드가 동작하는 이유
소비 모듈은 ReusableInteraction을 Build.cs 의존성으로 선언한 뒤 Public Root 기준으로 Header를 Include합니다. Private Header는 검색 경로에 노출되지 않으므로 구현 세부에 대한 우발적 의존을 컴파일 단계에서 차단합니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
Public·Private 폴더와 헤더 공개 범위 설계 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.