랜덤 값 생성하기

주상돈·2025년 1월 13일

TIL

목록 보기
14/53

C++ 에서 랜덤 값 생성하기(std::rand와 std::srand)

  • 설명: C++에서 std::rand()와 std::srand()를 사용해 랜덤 값을 생성하고, 시드 값을 설정하는 방법에 대해 배웠다.
  • 내용:
    • std::srand()는 랜덤 시드를 설정하는 함수로, 이를 통해 프로그램을 실행할 때마다 다른 난수를 생성할 수 있다.
    • std::rand()는 랜덤 값을 반환하며, 이를 이용해 다양한 게임 시스템 (예: 몬스터 생성)에서 랜덤화된 행동을 만들 수 있다.
  • 예시코드:
std::srand(static_cast<unsigned>(std::time(nullptr)));  // 시드 설정
int randomValue = std::rand() % 100 + 1;  // 1~100 사이의 랜덤 값 생성

std::unique_ptr의 사용법

  • 설명: C++에서 메모리 관리의 안전성을 높이기 위해 std::unique_ptr을 사용하는 방법을 배웠다.
  • 내용:
    • std::unique_ptr은 소유권을 가진 포인터로, 해당 객체는 std::unique_ptr이 파괴될 때 자동으로 해제된다.
    • 이를 사용하면 명시적으로 delete를 호출하지 않아도 메모리 누수를 방지할 수 있다.
  • 예시 코드:
std::unique_ptr<Monster> monster = std::make_unique<Slime>();

랜덤으로 몬스터 생성하는 방법

  • 설명: C++에서 std::rand()를 사용해 몬스터를 랜덤으로 생성하는 방법을 배웠다.
  • 내용:
    • 여러 종류의 몬스터를 switch문을 통해 랜덤하게 생성하고, 이를 std::vector에 저장하여 전투에 사용할 수 있다.
    • 몬스터의 종류와 특성에 맞게, 라운드마다 다른 몬스터를 생성하도록 설정할 수 있다.
  • 예시 코드:
std::vector<std::unique_ptr<Monster>> monsters;
for (int i = 0; i < 3; ++i) {
    monsters.push_back(createNormalMonster());
}

std::vector를 사용한 몬스터 관리

  • 설명: std::vector를 사용하여 동적으로 생성된 몬스터를 관리하고, 전투에서 사용할 수 있게 하는 방법을 배웠다.
  • 내용:
    • 벡터는 동적 배열로, 객체를 동적으로 추가하거나 제거하는 데 유용하다.
    • 벡터에 여러 개의 몬스터를 추가하고, 그 몬스터들의 공격을 처리하는 방식으로 전투를 구현할 수 있다.
  • 예시 코드:
std::vector<std::unique_ptr<Monster>> monsters;
monsters.push_back(createNormalMonster());

C++의 타입 정보 추적(typeid 사용법)

  • 설명: typeidname() 메서드를 이용하여 객체의 타입을 동적으로 확인하는 방법을 배웠다.
  • 내용:
    • typeid는 객체의 타입을 반환하는데, 이를 사용해 객체가 어떤 클래스의 인스턴스인지 출력할 수 있다.
  • 예시 코드:
std::cout << "A wild " << typeid(*monster).name() << " appeared!" << std::endl;

typeid(*monster).name()에서 name() 메서드는 C++의 RTTI (Run-Time Type Information) 기능을 통해 제공되는 메서드이다. typeid연산자는 객체의 타입 정보를 얻을 수 있게 해주며, name() 메서드는 그 타입에 대한 문자열을 반환한다.
RTTI와 typeid
typeid는 주어진 객체의 타입에 대한 정보를 반환하는 연산자이다. 보통 다형성(polymorphism)을 사용할 때, 즉 상속 관계에서 사용된다. typeid는 클래스의 객체에 대해 실제 타입을 확인할 수 있도록 돕는다.
name()type_info 객체의 멤버 함수로, 객체의 타입 이름을 반환합니다. 하지만 이 반환된 이름은 컴파일러에 따라 다를 수 있으며, 항상 사람이 읽기 쉽게 출력되는 것은 아닙니다. 예를 들어, 컴파일러에 따라 "class A" 또는 "_Z3Fooi"처럼 나올 수 있다.

예시

#include <iostream>
#include <typeinfo>  // typeid와 type_info를 사용하기 위해 필요

class Monster {
public:
    virtual ~Monster() {}
};

class Slime : public Monster {};
class Orc : public Monster {};

int main() {
    Slime slime;
    Monster* monster = &slime;

    std::cout << "A wild " << typeid(*monster).name() << " appeared!" << std::endl;

    return 0;
}

여기서 typeid(*monster).name()은 Slime 클래스에 대한 이름을 반환한다. 하지만 이 이름은 컴파일러의 구현에 따라 달라질 수 있다.
주의 사항

  • typeid는 동적 타입을 기준으로 작동합니다. 즉, 포인터가 가리키는 실제 객체의 타입을 알아냅니다.
  • 컴파일러에 따라 name() 메서드의 반환 값은 사람이 읽기 쉽지 않은 형태일 수 있으므로, 디버깅 등의 용도로 사용하기 좋은 방법일 수 있습니다.
    요약
  • name()은 C++ 표준 라이브러리의 type_info 클래스의 메서드이다.
  • typeid를 사용하여 객체의 타입 정보를 가져오고, name()을 통해 그 타입의 이름을 문자열로 확인할 수 있다.
  • 반환 값은 컴파일러에 따라 달라질 수 있기 때문에, 항상 사람이 읽을 수 있는 형태는 아니다.

0개의 댓글