👻 캐스팅이란 무엇인가?

캐스팅이란 변수나 객체의 타입을 강제적으로 변경하여 서로 다른 타입의 변수나 함수에 접근할 수 있도록 만들어주는 과정을 의미합니다. 상속 관계에서 캐스팅을 사용하면 상위 클래스에서 하위 클래스의 변수나 함수에 접근할 수 있으며, 특정 상황에서 타입을 변환해 분기 처리도 가능하게 합니다.


🌱 1. 캐스팅의 필요성

  1. 상속 관계에서 상위 클래스가 하위 클래스의 고유 변수나 함수에 접근하려는 경우

    • 상위 클래스는 기본적으로 하위 클래스의 고유 변수나 함수에 접근할 수 없습니다.
    • 예: BP_Player(상위 클래스)가 BP_Knight(하위 클래스)의 Stamina 변수에 접근하려면 캐스팅이 필요합니다.
  2. 객체 타입에 따른 분기 처리

    • 특정 클래스만을 대상으로 처리해야 할 때 캐스팅을 통해 타입을 확인하고 적절한 분기를 실행합니다.
    • 예: BP_PlayerBP_KnightBP_Mage를 각각 다르게 처리하고 싶을 때 사용.
  3. 메모리 관리

    • 캐스팅은 타입 변환만 수행하며, 메모리를 새로 할당하거나 데이터를 손실시키지 않습니다.
    • 캐스팅은 어디까지 접근할 수 있는지를 제한하는 "타입 규칙"을 바꾸는 것입니다.

🌱 2. 캐스팅의 작동 원리

  1. 하위 클래스 👉 상위 클래스 (Upcasting)

    • 자동으로 이루어질 수 있음.
    • 예: BP_Knight 객체를 BP_Player 타입 변수에 저장.
    • 결과: BP_Player의 변수와 함수는 접근 가능하지만, BP_Knight의 고유 변수는 사용할 수 없습니다.
    • 데이터 소실은 없으며, 단지 접근 범위만 상위 클래스에 맞춰 제한됩니다.
    • 예제:
      BP_Player* Player = BP_Knight 객체;
  2. 상위 클래스 👉 하위 클래스 (Downcasting)

    • 명시적으로 캐스팅이 필요함.
    • 예: BP_Player 타입 객체를 BP_Knight 타입으로 캐스팅.
    • 조건: 실제로 BP_Player 객체가 BP_Knight에서 생성된 객체여야 성공.
    • 실패 시, Cast Failed를 통해 처리.
    • 예제:
      BP_Knight* Knight = Cast<BP_Knight>(Player);
  3. 캐스팅 실패

    • 하위 클래스에 없는 객체를 상위 클래스에서 하위 클래스로 캐스팅하면 실패.
    • 실패 시, "Cast Failed"로 분기 처리.
    • 예: BP_Player 객체를 BP_Mage로 캐스팅하려 했는데 실제로 BP_Knight 객체였다면 캐스팅 실패.

🌱 3. 블루프린트에서 캐스팅

Cast To 노드 사용

  • Cast To [클래스명]: 특정 클래스 타입으로 명시적 캐스팅.
  • Input Object: 캐스팅 대상 객체.
  • Is Valid: 캐스팅 성공 시 실행되는 경로.
  • Cast Failed: 캐스팅 실패 시 실행되는 경로.

예제 시나리오

  1. BP_Player가 부모 클래스, BP_KnightBP_Mage가 자식 클래스.
  2. BP_Player 타입 변수 PlayerBP_Knight 객체가 저장되어 있다.
  3. Cast To BP_Knight:
    • PlayerBP_Knight 타입으로 캐스팅하여 Stamina 변수에 접근.
    • 성공: BP_Knight의 변수 및 함수 사용 가능.
    • 실패: "Cast Failed" 분기로 처리.

🌱 4. 캐스팅의 방향성과 제한

  1. 하위 클래스 👉 상위 클래스 (Upcasting)

    • 항상 가능하며, 캐스팅 없이 자연스럽게 이루어짐.
    • 하지만 고유 변수나 함수는 사용할 수 없습니다.
    • 예: BP_Knight 객체를 BP_Player로 다루면 Stamina 변수 사용 불가.
  2. 상위 클래스 👉 하위 클래스 (Downcasting)

    • 반드시 명시적 캐스팅 필요.
    • 캐스팅 대상 객체가 실제로 하위 클래스에서 생성된 객체여야 성공.
  3. 중복된 자식 클래스 간 캐스팅 제한

    • BP_Knight 객체를 BP_Mage로 캐스팅하려 하면 실패.
    • 이유: 상위 클래스는 여러 자식 클래스를 포함할 수 있으므로, 특정 자식 클래스로 직접 변환하려면 캐스팅을 통해 확인해야 함.

🌱 5. 캐스팅을 활용한 분기 처리

  • 캐스팅 성공

    • 하위 클래스 고유 기능 수행.
    • 예: BP_KnightAttack 함수에서 근접 공격.
  • 캐스팅 실패

    • 다른 클래스에 대한 처리.
    • 예: BP_Mage로 캐스팅 실패 시 기본 동작 수행.

분기 처리 예제

BP_Player* Player;

if (BP_Knight* Knight = Cast<BP_Knight>(Player)) {
    Knight->Stamina -= 10; // 캐스팅 성공 시 실행
} else {
    // 캐스팅 실패 시 실행
    PrintText("Cast Failed!");
}

🌱 6. 캐스팅의 데이터 관리

  • 캐스팅은 메모리를 새로 할당하지 않으며, 데이터 손실 없이 타입만 변경.
  • 부모 클래스에서 자식 클래스로 캐스팅 후 고유 변수 접근이 가능하며, 데이터가 그대로 유지됩니다.

profile
李家네_공부방

0개의 댓글