← SEARCHABLE ARCHIVE
C / C++ · 2026-05-26

C++ 기초부터 마스터까지 — 6화

구조체와 클래스는 언제 사용할까?

INTERACTIVE READING MODE →

본 블로그 작성 글들은, 강의를 목표로 하고 제작되었습니다. 또한 작성된 글의 정보도 틀렸을 수 있으니, 주의해주세요.

지금까지 변수와 함수에 대해 알아보았다. 하지만 게임을 만들면서 몬스터의 ID, 이름, 체력을 변수로 하나씩 따로 관리하는 것은 상당히 귀찮다.

int monsterId = 1;
std::string monsterName = "Slime";
int monsterHealth = 30;

몬스터가 100마리라면 변수도 계속 늘어나게 된다. 이럴 때 서로 관련 있는 데이터를 하나로 묶기 위해 구조체를 사용한다.

구조체

#include <string>

struct Item
{
    int id;
    std::string name;
    int price;
};

Item sword{1, "Sword", 100};

Item sword{1, "Sword", 100};처럼 중괄호로 멤버를 순서대로 넣는 방법을 집계 초기화라고 부른다. 구조체라고 해서 특별한 메모리 덩어리가 되는 것은 아니다. 관련 있는 값에 이름을 붙여 묶어둔 사용자 정의 타입이다.

void PrintItem(const Item& item)
{
    std::cout << item.name << '\n';
}

Item MakePotion()
{
    return Item{2, "Potion", 50};
}

구조체도 함수의 인자로 전달하거나 값으로 반환할 수 있고, std::vector<Item> 같은 컨테이너에도 저장할 수 있다.

클래스

구조체에 데이터만 넣어두면 외부에서 체력을 이상한 값으로 바꿀 수도 있다.

monster.health = -9999;

좋다. 컴파일은 되지만 몬스터의 상태는 망가졌다. 이런 일을 막기 위해 데이터와 데이터를 변경하는 동작을 같은 클래스에 묶는다.

#include <algorithm>
#include <string>

class Monster
{
public:
    Monster(int id, const std::string& name, int health)
        : id(id), name(name), health(health)
    {
    }

    void TakeDamage(int damage)
    {
        health = std::max(0, health - damage);
    }

    int GetHealth() const
    {
        return health;
    }

    const std::string& GetName() const
    {
        return name;
    }

private:
    int id;
    std::string name;
    int health;
};

public은 외부에 공개할 부분이고, private은 클래스 내부에서만 사용할 부분이다. 멤버 변수를 private로 숨기고 공개 함수를 통해 상태를 변경하게 만드는 것을 캡슐화라고 부른다.

생성자 뒤의 : id(id), name(name), health(health)는 생성자 초기화 리스트이다. 객체가 만들어진 뒤 값을 대입하는 것이 아니라, 멤버가 생성되는 순간 바로 초기화한다.

구조체와 클래스는 완전히 다른 물건처럼 보이지만 C++에서는 기본 접근 지정자가 다르다는 차이가 가장 크다. struct는 기본이 public, class는 기본이 private이다.

단순히 값을 묶는 용도라면 struct가 편하고, 상태를 보호하면서 동작까지 묶고 싶다면 class가 더 자연스럽다.