Introduce
Class와 Struct의 차이점을 알고 static 변수, static 함수의 개념을 숙지합니다.
- struct는 기본 접근 지정자가 public이고, class는 private이다.
- struct는 그냥 구조체(데이터 묶음)을 표현하는 정도
- class는 객체 지향 프로그래밍의 특징을 나타내는 용도
static 변수
우리가 마린이라는 객체를 만든다고 했을때, 물론 처음 만들어지는 마린의 hp는 모두 동일하겠지만 데미지를 입거나 전투 과정에서 hp의 변화로 인해 모든 마린의 hp가 동일하지는 않습니다. 그에 반해 hp가 변했다고해서 마린의 고유한 attack수치는 변하지 않습니다. 즉, 모든 객체에대해 s_attack이라는 변수는 모두 같은 값을 가지고 있습니다. 모든 객체의 모든 s_attack수치를 바꾼다고 하면 일일히 객체에 접근해 바꿔줘야하는 수고를 해야할 것입니다. 이를 방지하고자 특정 마린객체에 종속적이지 않고 "Marin class" 자체와 연관시켜 클래스 내에 있지만 전역변수처럼 사용할 수 있는 정적(static)변수를 활용합니다.
#include <iostream>
using namespace std;
class Marine
{
public:
int _hp;
static int s_attack; // static 변수 선언
};
int Marine::s_attack = 0; // 외부선언 필요
int main()
{
Marine m1;
m1._hp = 40;
m1.s_attack = 6;
Marine m2;
m2._hp = 40;
m2.s_attack = 6;
cout << m1.s_attack << endl;
cout << m2.s_attack << endl;
// marine 공격력 업그레이드 완료
m1.s_attack = 7;
m2.s_attack = 7;
cout << m1.s_attack << endl;
cout << m2.s_attack << endl;
Marine::s_attack = 8;
cout << m1.s_attack << endl;
cout << m2.s_attack << endl;
return 0;
}
===== 실행 결과 =====
66
77
88
static 변수를 활용하면 일일히 객체에 접근해 변수를 바꾸지 않고 다음과 같이 한문장으로 모든 객체에대한 멤버변수를 제어할 수 있습니다.
Marine::s_attack = 8;
유의사항
- static 변수는 클래스내에서 선언되어야하며, 클래스 외부에서도 선언 및 초기화 되어야합니다.
static 함수
변수와 마찬가지로 함수도 static을 사용할 수 있습니다. 다만 static함수 내에서 static 변수를 고치는 것은 가능하지만, 일반 멤버변수, 함수는 접근할 수 없습니다.
#include <iostream>
using namespace std;
class Marine
{
public:
int _hp;
static int s_attack;
static void SetAttack()
{
s_attack = 100;
}
};
int Marine::s_attack = 0; // 외부선언 필요
int main()
{
Marine m1;
m1._hp = 40;
m1.s_attack = 6;
Marine m2;
m2._hp = 40;
m2.s_attack = 6;
Marine::SetAttack();
cout << m1.s_attack << endl;
cout << m2.s_attack << endl;
return 0;
}
===== 실행 결과 =====
100 100
기타
static은 꼭 class안에서 만드는 것은 아닙니다. 일반 함수 내부에서 만들어도 스택 메모리가 아닌 데이터 영역 메모리에 잡힙니다. 즉, 함수내 변수의 생명주기는 프로그램 시작/종료를 따라갑니다.(함수에 따라가지 않으며 항상 메모리에 올라가있습니다.) 다만 접근범위가 해당 함수내에서만으로 제한됩니다.
static 변수를 사용했을때와 사용하지 않았을때의 예를 살펴봅시다.
#include <iostream>
using namespace std;
int Generatedid()
{
int id = 1;
return id++;
}
int main()
{
cout << Generatedid() << endl;
cout << Generatedid() << endl;
cout << Generatedid() << endl;
return 0;
}
===== 실행 결과 =====
1
1
1
위는 static 변수를 사용하지 않았을 경우입니다. 얼핏보기에는 Generateid()함수에 의해 결과가 1 2 3 이렇게 하나씩 더해져 출력될거 같지만 실제로는 1 1 1 이렇게 모두 동일한 값이 출력됩니다. 이는 int id가 스택메모리에 올라가 Generatedid()함수가 끝날때마다 id또한 같이 소멸되기 때문입니다.
다음 예는 static변수를 사용한 것입니다.
#include <iostream>
using namespace std;
int Generatedid()
{
static int s_id = 1;
return s_id++;
}
int main()
{
cout << Generatedid() << endl;
cout << Generatedid() << endl;
cout << Generatedid() << endl;
return 0;
}
===== 실행 결과 =====
1
2
3
static변수를 사용하면 int id값이 스택 메모리가 아닌 데이터 영역 메모리에 올라가 Generatedid()함수가 종료되어도 id값이 함께 사라지지 않고 계속 유지됩니다. 또한 id의 수정은 Generateid()함수 내부에서 진행되는 것을 알 수 있습니다. 즉, 변수의 생명주기는 계속 유지되고 , 접근 범위는 함수내에서만으로 제한되는것을 다시한번 볼 수 있습니다.
'Language > C++' 카테고리의 다른 글
[C++] OOP(객체지향)의 특성 - 연산자 오버로딩 (0) | 2022.06.06 |
---|---|
[C++] OOP(객체지향)의 특성 - 멤버변수 초기화 (0) | 2022.06.06 |
[C++] OOP(객체지향)의 특성 - 다형성(polymorphism) (0) | 2022.06.06 |
[C++] OOP(객체지향)의 특성 - 캡슐화(encapsulation) (0) | 2022.06.06 |
[C++] OOP(객체지향)의 특성 - 상속성(inheritance) (0) | 2022.06.06 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!