객체지향 마무리

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

struct  vs.  class

 

-  C++에서는 struct나 class나 종이 한 장 차이다.

-  struct는 기본 접근 지정자가 public이고, class는 private이다.

-  왜 이렇게 했을까? C++은 C언어에서 파생되어 발전했기 때문에, 호환성을 지키기 위함.

  •  struct는 그냥 구조체 (데이터 묶음)을 표현하는 용도
  •  class는 객체 지향 프로그래밍의 특징 나타내는 용도
struct TestStruct
{
    int _a;
};

class TestClass
{
    int _a;
    int _b;
};

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

    TestClass tc;
    tc._a = 1;  // class는 기본 접근 지정자가 private이기 때문에 에러가 난다.

    return 0;
}

 


 

static int 사용

 

class Marine{
public:
	// 특정 마린 객체와 무관
    // 마린이라는 '클래스'자체와 연관
    static int s_attack;  // 설계도상으로만 존재
}
int main()
{
	// 마린 공격력 업그레이드 완료! (Academy에서 업그레이드 끝)
    Marine::s_attack = 7;
}

Marine을 여러개 만들어도 static int s_attack은 딱 하나만 만들어진다.

static int s_attack은 딱 하나만 만들어진다.

위의 이미지는 static ins s_attack의 메모리 주소. 전역변수이기 때문에 하나만 생성된다.

 

 

static 변수는 어떤 메모리에 올라가는가?

데이터 영역(.rodata, .data, .bss)

  •  초기화 하면 .data
  •  초기화 안 하면 .bss

 

 


 

정적 지역 객체

 

int GenerateId()
{
    // 생명주기: 프로그램 시작/종료 (메모리에 항상 올라가 있음)
    // 가시범위: 

    // 정적 지역 객체
    static int s_id = 1; //계속 유지되어 살아남는다.

    return s_id++;
}
int main()
{
    cout << GenerateId() << endl;
    cout << GenerateId() << endl;
    cout << GenerateId() << endl;
    cout << GenerateId() << endl;
    cout << GenerateId() << endl;

    return 0;
}

실행화면

 


 

전체 코드 : static 변수, static 함수 (static = 정적 = 고정된)

 

class Marine{
public:
    // 특정 마린 객체에 종속적
    int _hp;
    
    void TakeDamage(int damage)
    {
        _hp -= damage;
    }

    static void SetAttack()
    {
        s_attack = 100;
        // _hp = 100;      // 일반멤버 변수를 고칠 수 없다
        // TakeDamage(10);  // 특정 객체와 연관성 있는 것을 호출할 수 없다
    }

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

// static 변수는 어떤 메모리?
// 초기화 하면 .data
// 초기화 안 하면 .bss 
int Marine::s_attack = 0;

class Player{
public:
    int _id;
};

// 정적 전역 객체
static int s_global = 1;

int GenerateId()
{
    // 생명주기: 프로그램 시작/종료 (메모리에 항상 올라가 있음)
    // 가시범위: 

    // 정적 지역 객체
    static int s_id = 1; //계속 유지되어 살아남는다.

    return s_id++;
}

int main()
{
    Marine m1;
    m1._hp = 35;
    m1.TakeDamage(10);
    Marine::s_attack = 6;
    //m1.s_attack = 6;

    Marine m2;
    m2._hp = 14;
    m2.TakeDamage(5);
    //m2.s_attack = 6;

    // 마린 공격력 업그레이드 완료! (Academy에서 업그레이드 끝)
    Marine::s_attack = 7;
    Marine::SetAttack();

    // 스택 아님 .data 영역
    static int id = 10;
    int a = id;

    cout << GenerateId() << endl;
    cout << GenerateId() << endl;
    cout << GenerateId() << endl;
    cout << GenerateId() << endl;
    cout << GenerateId() << endl;

    return 0;
}