생성자와 파괴자의 기본 이해
블루프린트에서 생성자(Constructor)와 파괴자(Destructor)는 객체의 생명주기에서 중요한 역할을 합니다.
이들은 객체가 생성될 때와 파괴될 때 실행되는 특별한 함수로, 초기화와 정리 작업을 담당합니다.
생성자 (Constructor)
생성자는 객체가 생성될 때 자동으로 호출되는 함수입니다.
블루프린트에서는 'Construction Script'라고 불립니다.
생성자의 역할
- 객체의 초기 상태 설정
- 컴포넌트 생성 및 초기화
- 변수 초기값 설정
생성자 작성 방법
- 블루프린트 에디터에서 'Construction Script' 탭 선택
- 노드를 추가하여 초기화 로직 구현
생성자 사용 예제
이 예제에서는 동적 머티리얼 인스턴스를 생성하고 초기 상태를 설정하며, 캐릭터의 체력을 초기화합니다.
BeginPlay vs 생성자
BeginPlay 이벤트는 게임플레이가 시작될 때 호출되는 반면, 생성자는 객체가 생성될 때마다 호출됩니다.
특성 | 생성자 | BeginPlay |
---|---|---|
호출 시점 | 객체 생성 시 | 게임플레이 시작 시 |
주요 용도 | 초기 설정, 컴포넌트 생성 | 게임플레이 관련 초기화 |
에디터에서의 동작 | 객체 배치/수정 시 실행 | 플레이 모드 진입 시 실행 |
사용해야 하는 상황
- 생성자 : 컴포넌트 생성, 기본 속성 설정, 에디터에서 즉시 반영되어야 하는 설정
- BeginPlay : 게임플레이 시작 시 필요한 초기화, 다른 액터와의 상호작용 설정
파괴자 (Destructor)
블루프린트에서 파괴자의 역할은 주로 'EndPlay' 이벤트가 담당합니다.
파괴자의 역할
- 사용한 리소스 정리
- 연결된 다른 객체에 파괴 알림
- 최종 상태 저장 또는 로그 기록
EndPlay 이벤트 사용 방법
- 이벤트 그래프에서 'EndPlay' 이벤트 추가
- 정리 작업을 위한 노드 연결
EndPlay 사용 예제
이 예제에서는 객체 파괴 시 소유한 아이템을 정리하고 플레이어 상태를 저장하며 게임 모드에서 등록 해제합니다.
리소스 정리 관련 주의사항
1. 순환 참조 주의
- 상호 참조하는 객체들 간의 파괴 순서 고려
2. 비동기 작업 처리
- 진행 중인 비동기 작업 적절히 취소 또는 완료 대기
3. 네트워크 리소스
- 열려있는 네트워크 연결 정리
4. 타이머 및 이벤트
- 등록된 타이머나 이벤트 리스너 제거
5. 외부 리소스
- 파일 핸들, 데이터베이스 연결 등 외부 리소스 해제
생성자와 파괴자 사용 시 Best Practices
1. 간결성 유지
- 생성자와 파괴자에서 복잡한 로직 피하기
- 필요시 별도의 초기화/정리 함수 호출
2. 에러 처리
- 초기화 실패 시 적절한 에러 처리 및 로깅
3. 성능 고려
- 생성자에서 무거운 연산 피하기
- 필요시 지연 초기화(lazy initialization) 사용
4. 상속 고려
- 부모 클래스의 생성자/파괴자 호출 확인
5. 디버깅 지원
- 중요 단계에서 로그 출력으로 디버깅 용이성 향상
고급 사용 예제 : 동적 오브젝트 풀링
이 예제에서는 생성자에서 오브젝트 풀을 초기화하고 BeginPlay에서 게임 모드에 등록합니다.
게임 중에는 풀에서 오브젝트를 가져와 사용하고, EndPlay에서 모든 리소스를 정리합니다.
생성자와 파괴자(EndPlay)를 효과적으로 사용하면 객체의 생명주기를 잘 관리할 수 있고, 리소스 누수를 방지할 수 있습니다.
그러나 과도하게 복잡한 로직을 이 단계에 포함시키면 성능 문제나 예기치 못한 동작을 야기할 수 있으므로 주의가 필요합니다.
항상 명확하고 필요한 작업만을 포함시키고, 더 복잡한 초기화나 정리 작업은 별도의 함수로 분리하는 것이 좋습니다.