1. struct 와 class 의 차이

C++ 에서는 struct 와 class 가 동일하게 작동한다.

그러나 동일한 코드를 작성하여 실행하면 오류가 발생하게 된다.

struct TestStruct
{	//public:
    int _a;
    int _b;
};

class TestClass
{	//private:
    int _a;
    int _b;
};


int main()
{
    TestStruct ts;
    ts._a = 1;

    TestClass tc;
    tc._a = 1;

    return 0;
}

struct에서는 기본값으로 public가 생략되어있고, class에서는 private이 기본값으로 생략되어있다.

struct 는 데이터의 묶음을 표현하는 용도,

class는 객체 지향 프로그래밍의 특징을 나타내는 용도로 쓰인다.

 

2. static 변수, static 함수

(1) 하나의 클래스를 상속받은 객체들이 

서로 다를 수 있는 값을 가지는 경우에는 int 형으로 (객체에 종속적)

서로 동일한 값을 가지는 경우에는 static 형으로 적용한다.

class Marine
{
public:
    int _hp;
    int attack;
};


int main()
{
    Marine m1;
    m1.attack = 6;
    m1._hp = 40;

    Marine m2;
    m2.attack = 6;
    m2._hp = 40;

    // 마린의 공격력 업그레이드가 완료되었으면
    m1.attack = 7;
    m1._hp = 7;

    return 0;
}

위의 코드를 아래로 바꿀 수 있다.

class Marine
{
public:
    int _hp;
    static int s_attack;
};

int Marine::s_attack = 0;

int main()
{
    Marine m1;
    m1._hp = 40;

    Marine::s_attack = 6;

    Marine m2;
    m2._hp = 40;

    // 마린의 공격력 업그레이드가 완료되었으면
    m1._hp = 7;

    Marine::s_attack = 7;
    
    return 0;
}

 

(2) static 함수

이번에는 객체가 공격을 받아 hp가 감소하는 상황을 만들어보자.

class Marine
{
public:
    int _hp;

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

    static int s_attack;
};

이렇게 하면 객체에 종속적인 TakeDamage 함수를 만들 수 있다.

참고로 static이 붙은 함수는 멤버 변수를 변경할 수 없다.

즉 아래처럼 구현할 수 없다.

class Marine
{
  int _hp;
  //~~
  static void SetHP();
  {
  	_hp = 100;
  }
  
  //~~
};

 

2. 정적 변수와 정적 함수의 특징

(1) 생명주기 : 프로그램이 시작되면서 생성되며 프로그램이 종료되면 소멸한다(메모리에 상주함).

int GenId()
{
    int s_id = 1;

    return s_id++;
}

위의 함수는 함수를 호출할 때 마다 s_id가 1로 초기화 되지만, static을 이용한 정적 함수는

int GenId()
{
    static int s_id = 1;

    return s_id++;
}

프로그램이 시작될 때 최초에 1회만 s_id가 1로 초기화 된다.

'기초 C++ 스터디 > 객체지향' 카테고리의 다른 글

6-2. 형(type) 변환 (1)  (0) 2023.05.31
6-1. 동적 할당  (0) 2023.05.31
5-6. 연산자 오버로딩  (0) 2023.05.30
5-5. 초기화 리스트  (0) 2023.05.26
5-4. 다형성  (0) 2023.05.26