icon
3장 : 클래스와 객체 지향 설계

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


이제 액터와 컴포넌트의 역할에 대해 이해하셨으니, 객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념 중 하나인 상속(Inheritance) 에 대해 알아보겠습니다. 상속은 블루프린트 개발에서 재사용성과 확장성을 극대화하는 데 필수적인 개념입니다.


상속이란 무엇인가?

상속은 기존에 만들어진 클래스(Class) 의 속성(변수)과 기능(함수, 이벤트)을 새로운 클래스가 물려받아 사용하는 개념입니다. 여기서 기존 클래스를 부모 클래스(Parent Class) 또는 기반 클래스(Base Class) 라고 부르고, 물려받는 새로운 클래스를 자식 클래스(Child Class) 또는 파생 클래스(Derived Class) 라고 합니다.

간단한 비유로 설명하자면, 우리가 '자동차'라는 개념(부모 클래스)을 정의했다고 생각해봅시다. 자동차는 '움직인다', '탑승할 수 있다'는 기본적인 속성과 기능을 가집니다. 이제 '스포츠카'나 '트럭'이라는 새로운 개념(자식 클래스)을 만들 때, 이들은 '자동차'가 가진 기본적인 속성과 기능을 별도로 다시 만들 필요 없이 그대로 물려받고, 여기에 자신들만의 고유한 특징(예: 스포츠카는 '빠르게 달린다', 트럭은 '짐을 싣는다')을 추가하거나 변경할 수 있습니다.

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


블루프린트에서의 상속

언리얼 엔진의 블루프린트는 객체 지향 프로그래밍의 상속 개념을 시각적으로 구현하고 있습니다. 특정 액터 블루프린트를 다른 액터 블루프린트의 자식으로 만들면, 자식 블루프린트는 부모 블루프린트가 가진 모든 컴포넌트, 변수, 함수, 이벤트를 자동으로 물려받습니다.

상속의 이점

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

유지보수 용이성: 부모 클래스에서 기능을 수정하면, 그 기능을 물려받은 모든 자식 클래스에 자동으로 변경 사항이 적용됩니다. 이는 대규모 프로젝트에서 일관성을 유지하고 유지보수를 효율적으로 만드는 데 큰 도움이 됩니다.

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


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

새로운 블루프린트 클래스를 생성할 때, 가장 먼저 부모 클래스 선택(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 로직을 먼저 실행하고 싶을 때 유용합니다.

예시: 오버라이드를 통한 특수 문 만들기

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

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

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

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

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

이처럼 상속은 블루프린트 기반의 게임 개발에서 강력한 구조화 및 재사용 도구입니다. 복잡한 시스템을 설계할 때, 공통된 부분은 부모 클래스에 정의하고, 특수한 부분은 자식 클래스에서 확장하거나 재정의함으로써 효율적인 개발을 가능하게 합니다.


이번 절에서는 블루프린트에서의 상속 개념, 그 이점, 그리고 오버라이드 방법에 대해 알아보았습니다. 상속은 언리얼 엔진에서 객체 지향 설계를 실현하는 핵심적인 방법이며, 앞으로 여러분이 만들 다양한 블루프린트에서 매우 중요하게 활용될 것입니다.