오븐 노트

[C++] 객체지향 마무리 본문

Develop/C++

[C++] 객체지향 마무리

오 븐 2022. 10. 6. 14:44
#include <iostream>
using namespace std;

// 1) struct vs class
// C++에서는 둘의 차이가 거의 없다.
// struct의 기본 접근 지정자는 public이고, class는 private이다.
// 굳이 나눈 이유? C++은 C언어에서 파생되어 나온 언어이기에 호환성을 위해 남겨져있는 C언어의 특성
// -> struct는 구조체(데이터 묶음)을 표현하는 용도로 사용하는 것을 추천
// -> class는 객체 지향 프로그래밍의 특징을 나타내는 용도로 사용하는 것을 추천

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

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

// 2) static 변수, static 함수 (static = 정적 = 고정된)

class Marine
{
public:
    // 특정 Marine 객체에 종속적
    int _hp;

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

    // static은 static 속성의 변수, 함수끼리만 사용할 수 있고 static이 아닌 번수, 함수를 가져오는것을 불가하다.
    static void SetAttack()
    {
        s_attack = 100;
    }
    
    // 특정 Marine 객체와 무관
    // Marine이라는 class 자체와 연관
    // 딱 하나만 존재하여 전체적인 영향을 주기 위해서는 static이 필요
    static int s_attack; // 설계도 상으로는 Marine의 public 내부에 존재하는 변수지만, 실질적으로는 전역변수처럼 움직인다.
};

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

class Player
{
public:
    int _id;
};

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

int GenerateId()
{
    // 생명주기 : 함수의 사이클이 아닌 전체 프로그램 시작/종료를 따라감(메모리에 항상 올라가 있음.). 그러므로 해당 함수의 종료와는 관계 없이 변수가 계속 유지됨.
    // 가시범위 : 함수 내부
    // 정적 지역 객체
    // 정적이 붙는 순간 스택 메모리가 아닌 .data 영역으로 넘어감
    static int s_id = 1;

    return s_id++;
}

int main()
{
    TestStruct ts;
    ts._a = 1;
    TestClass tc;
    // tc._a = 1; // class는 기본 접근 지정자가 private이기에 접근불가

    Marine m1;
    m1._hp = 40;
    // m1._attack = 6;

    Marine::s_attack = 6;

    Marine m2;
    m2._hp = 40;
    m2.TakeDamage(5)
    // m2._attack = 6;
    
    // 업그레이드
    // m1._attack = 7;
    // m2._attack = 7;
    Marine::s_attack = 6;
    Marine::SetAttack();

    // 스택 X .data영역
    // 정적이 붙는 순간 스택 메모리가 아닌 .data 영역으로 넘어감
    static int id = 10;
    int a = id;

    cout << GenerateId() << endl; // 1
    cout << GenerateId() << endl; // 2
    cout << GenerateId() << endl; // 3
    cout << GenerateId() << endl; // 4
    cout << GenerateId() << endl; // 5

    return 0;
}

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
 
C++ 카테고리의 글은 인프런 Rookiss님의 강의를 공부하며 정리하는 내용입니다.
이미 알고 있는 내용도 다시 정리 되어있을 수 있습니다.

 

모든 글은 제가 공부하기 위해 작성합니다.

'Develop > C++' 카테고리의 다른 글

[C++] 동적할당 #2  (0) 2023.02.01
[C++] 동적 할당 #1  (0) 2022.10.06
[C++] 연산자 오버로딩 #1 ~ 2  (0) 2022.10.05
[C++] 초기화 리스트  (0) 2022.10.05
[C++] 다형성 #1 ~ 2  (0) 2022.09.28