본문으로 건너뛰기

안동민 개발노트

본문 시작

블루프린트에서의 상속 기본 개념

부모와 자식 블루프린트가 기능을 물려받는 원리를 이해하고 공통 로직 재사용과 오버라이드 방법을 익힙니다.

이제 액터와 컴포넌트의 역할에 대해 이해하셨으니, 객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념 중 하나인 상속(Inheritance)에 대해 알아보겠습니다.

상속은 블루프린트 개발에서 재사용성과 확장성을 극대화하는 데 필수적인 개념입니다.

자식은 부모를 복사하지 않고, 공통 계약 위에 차이만 덧쓴다

변수·컴포넌트·함수는 부모에서 한 번 정의하고, 자식은 기본값이나 필요한 동작만 바꿉니다. 부모 수정은 모든 자식에 전파됩니다.

  1. 부모 · BP_EnemyBase

    shared contract Variables Health · MoveSpeed Components Capsule · Mesh Behavior TakeDamage · Die

  2. 자식 · BP_MeleeEnemy

    is-a Enemy 그대로 상속 Health · TakeDamage 차이만 정의 Sword · 근접 Attack

  3. 자식 · BP_RangedEnemy

    is-a Enemy 그대로 상속 Health · TakeDamage 차이만 정의 Bow · 원거리 Attack

  4. 유지

    Override하지 않음 부모 구현과 이후 수정이 그대로 적용됩니다.

  5. 확장

    Parent Call + 자식 로직 공통 동작을 실행한 뒤 자식 차이를 이어 붙입니다.

  6. 교체

    자식 Override만 실행 부모 동작을 생략하는 것이 의도인지 명시적으로 확인합니다.


상속이란 무엇인가?

상속은 기존 클래스(Class)의 속성(변수)과 기능(함수, 이벤트)을 새로운 클래스가 물려받는 개념입니다.

기존 클래스는 부모 클래스(Parent/Base Class), 새로 물려받는 클래스는 자식 클래스(Child/Derived Class)라고 부릅니다.

비유로 보면, 자동차라는 부모 클래스에는 움직인다, 탑승할 수 있다 같은 공통 기능이 있습니다.

여기서 스포츠카트럭을 자식 클래스로 만들면, 공통 기능을 다시 작성할 필요 없이 상속받고 각 클래스의 특징(예: 빠른 가속, 적재 기능)만 추가하면 됩니다.

블루프린트에서 액터 블루프린트나 컴포넌트 블루프린트는 모두 클래스의 한 종류이며, 이들 간에 상속 관계를 설정할 수 있습니다.


블루프린트에서의 상속

부모 블루프린트는 공통 규칙을, 자식은 차이만 가진다

상속은 복사 붙여넣기가 아니라 공통 변수·함수·컴포넌트를 부모에 모으고 자식에서 기본값과 동작만 바꾸는 구조다.

  1. BP_WoodDoor

    Mesh와 Sound 기본값 변경

  2. BP_MetalDoor

    Lock 변수와 강도 값 변경

  3. BP_AutoDoor

    Overlap 이벤트 오버라이드

구분설명
상속되는 것컴포넌트, 변수, 함수, 이벤트 기본 동작.
자식의 일값 변경, 외형 교체, 필요한 함수 오버라이드.
위험부모가 너무 커지면 자식이 원치 않는 책임까지 물려받는다.

언리얼 엔진의 블루프린트는 객체 지향 프로그래밍의 상속 개념을 시각적으로 구현하고 있습니다.

특정 액터 블루프린트를 다른 액터 블루프린트의 자식으로 만들면, 자식 블루프린트는 부모 블루프린트가 가진 모든 컴포넌트, 변수, 함수, 이벤트를 자동으로 물려받습니다.

상속의 이점

코드 재사용성: 이미 구현된 기능을 다시 만들 필요가 없어 개발 시간을 단축하고 오류 발생 가능성을 줄입니다.

유지보수 용이성: 부모 클래스에서 기능을 수정하면, 그 기능을 물려받은 모든 자식 클래스에 자동으로 변경 사항이 적용됩니다.

이는 대규모 프로젝트에서 일관성을 유지하고 유지보수를 효율적으로 만드는 데 큰 도움이 됩니다.

확장성: 기존 기능을 건드리지 않고 새로운 기능을 추가하거나, 물려받은 기능을 자식 클래스에서 오버라이드(재정의)하여 특정 동작을 변경할 수 있습니다.


상속 관계 만들기: 부모 클래스 선택

새로운 블루프린트 클래스를 생성할 때, 가장 먼저 부모 클래스 선택(Pick Parent Class) 창이 나타납니다.

여기서 선택하는 클래스가 새로 만들 블루프린트의 부모 클래스가 됩니다.

  • 예를 들어, 모든 문이 공통적으로 가지는 열림/닫힘 기능을 BP_Door_Base라는 부모 블루프린트에 구현했다고 가정해봅시다.
  • 이제 나무 문철 문이라는 두 가지 종류의 문을 만들고 싶다면, BP_Door_WoodBP_Door_Metal이라는 새로운 액터 블루프린트를 생성할 때, 부모 클래스로 BP_Door_Base를 선택할 수 있습니다.
  • 이렇게 생성된 BP_Door_WoodBP_Door_MetalBP_Door_Base가 가진 열림/닫힘 기능과 모든 변수, 컴포넌트를 물려받게 됩니다. 여기에 각 자식 클래스만의 시각적 요소(나무 모델, 철 모델)나 추가적인 기능(철 문은 자물쇠 기능)을 더할 수 있습니다.

상속된 기능 오버라이드(Override)하기

자식 클래스에서는 부모 클래스에서 물려받은 함수나 이벤트를 오버라이드(Override, 재정의)하여 자신만의 고유한 방식으로 동작하도록 만들 수 있습니다.

이는 부모 클래스의 기본 동작은 유지하되, 특정 자식 클래스에서만 다르게 작동해야 할 때 매우 유용합니다.

오버라이드 방법

자식 블루프린트 에디터를 엽니다.

좌측 함수(Functions) 패널 또는 이벤트 그래프에서 오버라이드하고 싶은 함수나 이벤트를 찾습니다.

함수 패널의 경우, 오버라이드하고 싶은 함수 위에서 마우스 오른쪽 버튼을 클릭하고 오버라이드 함수 생성(Create Overridden Function)을 선택합니다.

이벤트 그래프의 경우, 예를 들어 Event BeginPlay와 같이 이미 존재하는 기본 이벤트를 선택합니다.

오버라이드된 함수 또는 이벤트의 그래프에 새로운 로직을 구현합니다.

Parent Call 노드: 오버라이드된 함수나 이벤트 내부에서 Parent Call 노드를 사용하여 부모 클래스의 원래 로직을 호출할 수 있습니다.

예를 들어, 자식 클래스에서 추가적인 로직을 실행하기 전에 부모의 BeginPlay 로직을 먼저 실행하고 싶을 때 유용합니다.

오버라이드를 설계할 때는 자식 블루프린트가 무엇을 그대로 물려받고, 어떤 동작을 새로 정의하며, 부모의 기본 로직까지 함께 실행할지 차례대로 판단하는 것이 좋습니다.

오버라이드는 부모 로직을 유지할지 먼저 결정한다

자식에서 함수를 바꿀 때 Parent Call을 넣을지 빼먹으면 공통 초기화가 사라질 수 있다.

질문판정
부모 로직이 여전히 필요한가?필요하면 Override 안에서 Parent Call을 먼저 또는 나중에 호출한다.
자식만 완전히 다른 행동인가?Parent Call 없이 새 로직으로 대체한다.
부모 초기화 뒤 추가 행동인가?Parent Call 후 자식 전용 Mesh, Sound, FX를 붙인다.
부모 호출 순서가 결과를 바꾸나?상태 설정 전/후 순서를 주석이나 함수명으로 드러낸다.
신호해석
좋은 오버라이드무엇을 물려받고 무엇을 바꾸는지 그래프에서 보인다.
나쁜 오버라이드Parent Call 누락으로 공통 변수 초기화가 사라진다.
예시: 오버라이드를 통한 특수 문 만들기

BP_Door_Base에 문이 열릴 때 문이 열립니다!라고 출력하는 로직이 OpenDoor 함수에 있다고 가정해봅시다.

BP_Door_Wood (부모: BP_Door_Base) 블루프린트를 엽니다.

좌측 함수 패널에서 OpenDoor 함수를 찾아 마우스 오른쪽 클릭 후 오버라이드 함수 생성을 선택합니다.

OpenDoor 오버라이드 그래프에서 Print String 노드를 추가하여 나무 문이 열립니다!라고 출력하도록 설정합니다.

만약 부모의 문이 열립니다! 메시지도 함께 출력하고 싶다면, Parent: OpenDoor 노드를 Print String 노드 이전에 연결할 수 있습니다.

이처럼 상속은 블루프린트 기반의 게임 개발에서 강력한 구조화 및 재사용 도구입니다.

복잡한 시스템을 설계할 때, 공통된 부분은 부모 클래스에 정의하고, 특수한 부분은 자식 클래스에서 확장하거나 재정의함으로써 효율적인 개발을 가능하게 합니다.


부모 실행 여부는 Parent Call 연결로 드러낸다

같은 OpenDoor 호출도 자식 override와 Parent Call 유무에 따라 실행되는 그래프와 보존되는 기본 규칙이 달라진다.

  1. Override 없음

    Call → Parent 상속된 BP_Door_Base.OpenDoor 구현이 그대로 실행된다.

  2. Override + Parent Call

    Call → Child + Parent 부모 기본 규칙과 자식 확장을 모두 실행한다. 순서는 exec wire가 결정한다.

  3. Override만 실행

    Call → Child only 부모 구현을 의도적으로 대체한다. 사라지는 초기화·상태 변경을 확인한다.


이번 절에서는 블루프린트에서의 상속 개념, 그 이점, 그리고 오버라이드 방법에 대해 알아보았습니다.

상속은 언리얼 엔진에서 객체 지향 설계를 실현하는 핵심적인 방법이며, 상속은 공통 로직을 재사용하고 자식 블루프린트에서 차이를 관리할 때 중요합니다.

상속과 오버라이드 분리 매트릭스

상속은 공통 로직을 부모에 모으고, 자식은 차이점만 얹을 때 효과가 있습니다. 오버라이드는 부모 호출 여부까지 함께 결정합니다.

  1. 공통점 찾기

    모든 자식이 공유하는 변수, 함수, 컴포넌트를 부모 후보로 둡니다.

  2. 차이점 분리

    메시, 사운드, 잠금 조건처럼 자식마다 다른 부분만 따로 둡니다.

  3. 재정의 판단

    부모 동작을 유지할지, 추가할지, 완전히 바꿀지 결정합니다.

  4. 부모 호출 확인

    Parent Call을 빼도 되는지, 기본 동작이 사라지지 않는지 봅니다.

상속을 적용할 때 공통점과 차이점을 나누는 기준을 추가합니다.

상속 설계는 공통 규칙과 개별 차이를 분리한다

Parent Class에는 변하지 않는 규칙을 두고 Child Blueprint에는 기본값 변경과 필요한 Override만 남긴다.

  1. Parent Class

    공통 컴포넌트 Collision, Audio, 기본 Mesh 슬롯. 공통 함수 Open, TakeDamage, Interact 같은 규칙. 공통 변수 Health, bOpened, Cooldown 기본값.

  2. Child Blueprint

    Class Defaults Damage, Speed, Mesh 값 변경. Override 특정 자식만 다른 동작 구현. Parent Call 공통 초기화가 필요하면 명시적으로 호출.

검수의미
판단 기준세 자식 이상에서 반복되면 부모 후보, 한 자식만 다르면 자식 기본값 후보다.
핵심상속은 예외를 부모에 쌓는 방식이 아니다.

상속을 사용할 때는 부모에 둘 공통 규칙과 자식에서 바꿀 차이점을 분리해야 재사용성이 유지됩니다.

부모에는 공통, 자식에는 차이, 오버라이드에는 변경 이유를 둔다

상속을 적용할 때는 새 자식이 늘어날수록 수정 범위가 줄어드는지를 기준으로 본다.

  1. Parent

    시점 모든 자식이 공유 맞는 일 체력 처리, 기본 상호작용 주의 예외 누적 금지

  2. Defaults

    시점 자식별 값 차이 맞는 일 속도, Mesh, 대미지 주의 그래프 복제 금지

  3. Override

    시점 행동 차이 맞는 일 특수 공격, 문 열림 방식 주의 Parent Call 누락 금지

  4. Composition

    시점 상속보다 조립 맞는 일 기능 부품 교체 주의 부모 비대화 방지

기준해석
검수 질문새 자식을 추가할 때 부모를 수정해야 한다면 상속 경계가 흔들린 것이다.
읽는 순서부모 공통 → 자식 기본값 → 오버라이드 → Parent Call 순으로 본다.