Humility

아무리 노력해도 최고가 되지 못할 수 있다⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀그럼에도 노력하는자가 가장 겸손한 것 아닌가

공부하는 블로그

언리얼/문법

[Unreal5] 블루프린트 객체 지향 프로그래밍의 주요 특성 ( 상속, 은닉, 다형 )

새벽_글쓴이 2024. 11. 6. 16:50
반응형

클래스 3가지 속성에 대해 알아보려고 한다

1. 상속성

2. 은닉성

3. 다형성

상속성 (Inheritance)

상위 클래스의 특성을 하위 클래스가 물려받는 것

기본 구조

Character (상위 클래스)

├── 기본 속성: 체력, 속도, 이름
├── 기본 기능: 이동, 점프
└── 하위 클래스들
          ├── PlayerCharacter
          │ ├── 추가 속성: 경험치, 레벨
          │ └── 추가 기능: 아이템 사용, 스킬 사용
          └── EnemyCharacter
                           ├── 추가 속성: 경계 범위, 공격력
                           └── 추가 기능: AI 순찰, 추적
 

언리얼에서 상속하는 방법

변수설정

상속하는 방법 1

만들어진 개체에 디테일에서 상위 클래스를 변경

상속하는 방법 2

클래스를 만들때 처음부터 상위 클래스를 설정

 

주의

자식 클래스에서 부모 클래스의 변수는 사용 가능하지만 부모 클래스에서 자식 클래스의 변수는 사용 불가능

상위 클래스에서 변수 선언
상위 클래스에선 하위 클래스 변수 못찾음
하위 클래스에서 상위 클래스 변수 찾음

 

 

※ 언리얼 TIP

자식 클래스에서 사진에 보이는 Show Inherited Variables 를 체크하면 부모 클래스에서 선언한 변수를 확인 가능

캐스트

타입 변환을 위한 도구

주요 목적

1. 타입 확인

  • 어떤 객체가 특정 클래스 타입인지 확인

2. 특정 기능 접근

  • 캐스팅 후 해당 클래스의 고유 기능 사용
  • 변수나 함수에 접근

☆ 예시 ☆

Mage → Player로 캐스트

  • 성공: 플레이어의 특수 기능 사용 가능
  • 실패: 일반 Mage로 취급


캐스트는 상속 관계에서 특정 자식 클래스 인지를 확인 하는 것이다.

같은 부모를 가졌다고 해서 서로 캐스트가 되지는 않는다.

실제 예시

플레이어 감지 시스템

트리거 박스 오버랩 시: Other Actor를 PlayerCharacter로 Cast

성공 시

  • 플레이어의 스탯 확인
  • 퀘스트 진행 상태 확인
  • 특정 이벤트 발생

실패 시

  • 일반 충돌 처리
  • 로그 기록
  • 공격 판정 시스템

맞은 대상을 Interface_Damageable로 Cast

성공 시

  • TakeDamage 함수 호출
  • 데미지 이펙트 재생

실패 시

  • 물리적 반응만 처리

은닉성 ( Encapsulation )

내부 데이터를 외부로부터 보호하여 잘못된 값이나 조작 방지

접근제어 수준

Private (비공개)

  • 같은 클래스 내에서만 접근 가능
  • 외부에서 직접 수정 불가능
  • 가장 강력한 은닉성 제공

Protected (보호)

  • 자식 클래스까지만 접근 가능
  • 상속 관계에서 공유해야 할 데이터에 사용
  • 부모-자식 간 은닉성 제공

Public (공개)

  • 어디서나 접근 가능
  • 외부에 공개할 인터페이스에 사용
  • 은닉성 없음

언리얼에서 사용방법

변수 설정에서 체크
디테일에서 변경

결과

MaxHp를 못찾음

실제 사용 예시

체력 시스템

Private 변수

currentHealth (현재 체력)

maxHealth (최대 체력)

armorValue (방어력)

regenerationRate (회복률)

 

이 값들은 직접 수정되면 안되는 핵심 데이터이자 잘못된 값 설정 방지를 위해 접근 방지


Protected 함수

calculateDamage()

clampHealth()

applyArmor()

 

자식 클래스에서 데미지 계산 방식을 커스터마이즈 할 수 있게 설계해야함

예) 일반 캐릭터는 기본 방어력만 계산하지만 탱커 클래스는 추가 방어력 보너스를 적용 등


Public 함수

TakeDamage()

Heal()

GetCurrentHealth()

IsAlive()

 

외부에서 필요한 상호작용은 허용해야한다

예) UI가 현재 체력을 표시하기 위해 GetCurrentHealth() 호출 등

 

이런 구조로 설계하면 핵심 데이터를 보호함과 동시에 유연하고 사용법이 단순해진다. 


다형성 ( Polymorphism )

같은 인터페이스로 다른 구현을 제공하거나 하나의 기능이 여러 형태로 동작

코드의 재사용성 향상과 유연한 시스템 설계가 가능해짐

오버라이딩( 재정의 )

shout 함수 호출시 '나는 몬스터다' 출력
오크 클래스에서 shot를 오버라이딩 하려함

실행

결과


부모 클래스에서도 선언

오크 클래스에 parent 노드 추가 후 실행

부모의 shout 함수도 호출

결과

Parent 노드

부모 클래스의 기능도 그대로 활용

기존 기능을 완전히 대체하는 것이 아닌 추가하는 방식이다

 

동일한 이벤트( OnDamaed )로 각각 다른 대상에게 데미지 입히기

 

결과

 

인터페이스 ( Interface )

여러 클래스에서 공통적으로 구현해야 할 기능을 정의

실제 구현은 포함하지 않고 선언만 한다 ( '이런 기능이 있어야 된다'를 명시)

인터페이스 선언 방법

1. 블루프린트 인터페이스 만든다
2. 우측 상단에 Add를 통해 제작
3. 인터페이스를 선언하고 싶은 클래스로 돌아와 디테일 창에서 만든 인터페이스 선언

Return

Return값이 있는 경우

특징

  • 반드시 값을 반환해야 함
  • 함수(Function)로 생성됨
  • 구현 시 Return Node가 필요
  • 동기적 실행 (즉시 값 반환)
  • 하나의 응답만 가능

사용예시

GetHealth(): return float

  • 현재 체력값 즉시 반환
  • 다른 시스템이 이 값을 바로 사용 가능

 

CanInteract(): return boolean

  • 상호작용 가능 여부 즉시 반환
  • UI가 이 값으로 상호작용 버튼 표시/숨김

Return값이 없는 경우

특징

  • 이벤트(Event)로 생성됨
  • 구현 시 이벤트 그래프에서 구현
  • 비동기적 실행 가능
  • 여러 응답자가 반응 가능

사용 예시

OnDamaged()

UI 업데이트, 사운드 재생, 파티클 효과 (여러 시스템이 동시에 반응)

 

OnGameStateChanged()

여러 액터가 동시에 상태 변경,UI 업데이트,배경음악 변경 (여러 시스템이 동시에 반응)

 

예시 실행

결과

FlyStart 출력 → (1초 뒤) → Fly 출력

IFlyable 인터페이스의 Fly()는 리턴값이 없어서 이벤트로 생성여러 동작(텍스트 출력, 딜레이)을 순차적으로 실행 가능

 

만약 GetFlySpeed(): return float 같은 함수였다면?

리턴값이 있어서 함수로 생성 되고 Return 노드로 속도값을 즉시 반환해야 함

반응형