[C++] 객체지향 마무리
객체지향 마무리
인프런 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 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;
}
'⭐ Programming > C++' 카테고리의 다른 글
[C++] 동적 할당: new, delete (0) | 2022.04.07 |
---|---|
[C++] 동적 할당: malloc, free, void*, double free, Use-After-Free (0) | 2022.04.07 |
[C++] 오버로딩과 오버라이딩의 차이 (0) | 2022.04.06 |
[C++] 연산자의 오버로딩 (Operator Overloading), 오버로딩 vs 오버라이딩 (0) | 2022.04.05 |
[C++] 초기화 리스트 (0) | 2022.04.05 |
댓글
이 글 공유하기
다른 글
-
[C++] 동적 할당: new, delete
[C++] 동적 할당: new, delete
2022.04.07 -
[C++] 동적 할당: malloc, free, void*, double free, Use-After-Free
[C++] 동적 할당: malloc, free, void*, double free, Use-After-Free
2022.04.07 -
[C++] 오버로딩과 오버라이딩의 차이
[C++] 오버로딩과 오버라이딩의 차이
2022.04.06 -
[C++] 연산자의 오버로딩 (Operator Overloading), 오버로딩 vs 오버라이딩
[C++] 연산자의 오버로딩 (Operator Overloading), 오버로딩 vs 오버라이딩
2022.04.05