전체 코드

📌 1. struct vs class

C++에서 structclass는 거의 동일한 개념이지만, 차이점이 존재합니다.

struct TestStruct
{
    int _a;
    int _b;
};

class TestClass
{
    int _a;
    int _b;
};

차이점

structclass
기본 접근 지정자publicprivate
사용 목적데이터 묶음 표현객체 지향 프로그래밍

사용 예시

int main()
{
    TestStruct ts;
    ts._a = 10;  // struct는 기본 접근 지정자가 public이므로 직접 접근 가능

    TestClass tc;
    // tc._a = 10; // class는 기본 접근 지정자가 private이므로 직접 접근 불가 (컴파일 오류)
}

역사적 배경

  • C++C 언어에서 발전했기 때문에, struct를 유지하여 C 언어와의 호환성을 고려했습니다.
  • struct는 데이터 묶음을 표현하는 용도, class는 객체 지향 프로그래밍의 특징을 나타내는 용도로 주로 사용됩니다.

📌 2. static 변수와 static 함수

static 키워드는 정적(고정된)이라는 뜻을 가지며, 클래스 내부에서 정적 변수를 선언하면 모든 객체가 공유하는 변수가 됩니다.

class Marine
{
public:
    int _hp;

    void TakeDamage(int damage)
    {
        _hp -= damage;
    }

    static void SetAttack()
    {
        s_attack = 100; 
        // _hp = 100; // 오류! 정적 함수는 멤버 변수에 접근 불가
    }
    
    static int s_attack;
};

// static 변수는 클래스 외부에서 정의해야 함
int Marine::s_attack = 0;

(1) 정적 변수 (static variable)

  • static int s_attack;클래스의 모든 객체가 공유하는 변수입니다.
  • Marine::s_attack = 100;처럼 클래스 이름을 통해 접근할 수 있습니다.
  • Marine 객체가 여러 개 생성되더라도, s_attack하나의 값만을 가지며 모든 객체가 이를 공유합니다.

(2) 정적 함수 (static function)

  • static void SetAttack();객체 없이 호출 가능합니다.
  • 정적 함수는 일반 멤버 변수(_hp)에 접근할 수 없습니다.
    • 이유: 정적 함수는 객체의 인스턴스를 필요로 하지 않기 때문입니다.

📌 3. 정적 지역 변수 (Static Local Variable)

함수 내부에서 static 변수를 선언하면 프로그램이 종료될 때까지 유지됩니다.

int GenerateId()
{
    static int s_id = 1; // 정적 지역 변수
    return s_id++;       // 함수 호출 시 값 증가
}

특징

  • 생명주기: 프로그램 시작부터 종료까지 유지됨.
  • 가시 범위: 변수가 선언된 함수 내부에서만 사용 가능.

사용 예시

int main()
{
    cout << GenerateId() << endl; // 1
    cout << GenerateId() << endl; // 2
    cout << GenerateId() << endl; // 3
}

📌 4. 전체 코드 분석

#include <iostream>
using namespace std;

class Marine
{
public:
    void TakeDamage(int damage)
    {
        _hp -= damage;
    }

    static void SetAttack()
    {
        s_attack = 100;
        // _hp = 100; // 오류! 정적 함수는 멤버 변수에 접근할 수 없음
    }

public:
    int _hp;
    static int s_attack;
};

// static 변수는 반드시 클래스 외부에서 초기화해야 함
int Marine::s_attack = 0;

int GenerateId()
{
    static int s_id = 1; // 정적 지역 변수
    return s_id++;
}

int main()
{
    // struct vs class 차이 확인
    struct TestStruct
    {
        int _a;
        int _b;
    };

    class TestClass
    {
        int _a;
        int _b;
    };

    TestStruct ts;
    ts._a = 10; // struct는 기본적으로 public

    TestClass tc;
    // tc._a = 10; // class는 기본적으로 private (컴파일 오류 발생)

    // static 변수 활용 예시
    Marine m1;
    m1._hp = 40;
    Marine::s_attack = 6;

    Marine m2;
    m2._hp = 40;

    Marine::SetAttack();

    // 정적 지역 변수 확인
    cout << GenerateId() << endl;
    cout << GenerateId() << endl;
    cout << GenerateId() << endl;

    return 0;
}

📌 5. 정리

1️⃣ struct vs class

  • structclass의 차이점:
    • struct는 기본 접근 지정자가 public
    • class는 기본 접근 지정자가 private
    • struct는 주로 데이터 묶음을 표현할 때 사용.
    • class객체 지향 프로그래밍의 개념을 나타낼 때 사용.

2️⃣ 정적 변수와 정적 함수

  • 정적 변수 (static int s_attack;)

    • 모든 객체가 공유하는 변수로, 클래스 외부에서 정의해야 함.
    • 클래스 이름을 통해 접근 (Marine::s_attack = 100;).
    • 프로그램이 종료될 때까지 유지됨.
  • 정적 함수 (static void SetAttack();)

    • 객체 없이 호출 가능 (Marine::SetAttack();).
    • 멤버 변수에는 접근할 수 없으며, 정적 변수만 조작 가능.

3️⃣ 정적 지역 변수

  • 함수 내부에서 선언된 static 변수는 한 번 생성되면 프로그램이 종료될 때까지 유지됨.
  • 특정 값이 계속 유지되면서 증가하는 값(ID 생성 등)에 유용하게 사용됨.

profile
李家네_공부방

0개의 댓글