[C++] Struct vs Class 그리고 Static

👻 객체 지향 마무리

이번 시간에는 객체 지향 프로그래밍의 마무리 단계로 구조체와 클래스의 비교, 그리고 Static에 대해 알아보자.


🌱 Struct vs Class

C++에서 구조체와 클래스는 종이 한 장 차이이다. 그만큼 크게 다른 부분은 없다.

struct TestStruct
{
    int _a;
    int _b;
};

class TestClass
{
    int _a;
    int _b;
};

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

    TestClass tc;
    //tc._a;  // 기본적으로 접근 지정자를 설정하지 않으면 private
}

위처럼 접근 지정자를 설정해주지 않으면 구조체는 public, 클래스는 private이 기본으로 설정되는 차이 말고는 없다.

  • 그렇다면 왜 나뉘어졌을까?
    C++은 C언어에서 파생되어 발전했기 때문에 호환성을 지키기 위함이다. 구조체는 C에서부터 사용되던 문법이고 클래스는 C++에 와서 객체 지향과 함께 도입된 문법이기 때문이다.

굳이 분류 하자면 구조체는 그냥 데이터 묶음을 표현하는 용도로 사용되고 클래스는 객체 지향 프로그래밍의 특징을 나타내는 용도로 사용된다.


🌱 Static

Static정적, 고정된이라는 뜻을 가지는 단어이다. 해당 문법을 변수나 함수 앞에 붙여서 사용할 수 있는데, 그렇게되면 스택 메모리에 올라가지 않는다.

초기화를 하면 .data, 하지 않으면 .bss에 올라가게 된다.

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

    static void SetAttack()
    {
        // _hp = 100;   // 안 됨
        s_attack = 10;

    }

public:
    // 특정 마린 객체에 종속적
    int _hp;

    // 특정 마린 객체와 무관
    // 마린이라는 클래스 자체와 연관
    static int s_attack; // 설계도상으로만 존재
};

마린이라는 클래스가 하나 있다고 가정해보자. 기존 _attack이라는 변수는 마린의 공격력을 의미하고 있다. 하지만 마린의 공격력은 각 객체마다 다른 게 아닌, 마린이라는 클래스 자체와 연관이 되어있는 데이터이다. 만약 마린의 공격력을 변경해야 한다면 생성된 마린 객체 수만큼 공격력을 바꿔줘야 할 것이다.

이러한 점을 보완하기 위해 정적 변수를 사용한다. 정적 변수를 사용하게 되면 s_attack이라는 변수는 스택 메모리가 아닌 다른 영역에 올라가게 되고 한 번만 변경해도 모든 마린의 공격력이 바뀌게 되는 것이다.

  • 생명주기 : 프로그램 시작/종료(메모리에 항상 올라가 있음)
  • 가시범위 : 생성된 위치에 따라 다름

만약, 함수 내에 정적 변수를 생성하였다면, 프로그램 시작과 동시에 메모리에 올라가게 되지만 해당 함수 내에서만 사용이 가능하다는 특징이 있다.

정적 함수도 같은 특징을 가지게 된다. 단, 정적 함수 내에 사용되는 변수는 정적 변수만 가능하다.


👻 글을 마치며

이번 시간에는 객체 지향 프로그래밍의 마무리 단계로 구조체와 클래스를 비교해보고 정적 변수, 함수에 대해 알아보았다. 정적 객체의 용도와 범위 등 1부터 100까지 몰랐었는데 이번 시간에 확실히 알게 된 것 같아서 기분이 좋다. 😋 구조체와 클래스의 특징도 비교하면서 공부하니 복습이 확실히 된 것 같다. 문법을 알아갈수록 점점 더 재미있어진다. ㅎㅎ


소스코드 보러가기


출처
인프런 Rookies님 강의

Categories:

Updated:

Leave a comment