[C++] 초기화 리스트(Initializer list), static
2022. 2. 9. 17:24ㆍLanguages/C++
*<씹어먹는 C++>을 보며 공부하여 정리한 글입니다.
오늘도 열심히 우리의 이해를 도와줄 몬스터(Monster) 클래스!
#include <iostream>
#include <string>
class Monster {
private:
std::string name;
int health;
int damage;
static int totalMonsterNum;
public:
Monster() = default;
Monster(std::string name, int health, int damage);
};
초기화 리스트를 사용하지 않은 일반적인 생성자
Monster::Monster(std::string name, int health, int damage) {
this->name = name;
this->health = health;
this->damage = damage;
}
- 생성자는 객체 생성을 먼저 한 후, 그 다음에 대입 연산을 수행
- 객체 생성 후에 대입이 이루어지기 때문에 초기화 리스트보다 속도가 느리다.
- 참조(Reference)와 상수는 생성과 동시에 초기화를 해주어야 하기 때문에 위와 같은 방법은 오류가 날 수 있다.
- 그렇기에 클래스 내부에서 참조나 상수를 넣고 싶다면, 초기화 리스트를 통해 생성자를 만들어줘야 한다.
초기화 리스트를 사용한 생성자
Monster::Monster(std::string name, int health, int damage) :
name(name), health(health), damage(damage) {}
- 생성과 동시에 초기화를 진행하기에 속도가 더 빠르다.
- 생성자 함수 내부는 비어있고, 멤버 변수를 지칭해서 괄호 안의 변수나 데이터로 초기화해주는 것이 특징
- 멤버 변수와 매개변수의 이름이 같아도 된다. (외부에 있는 변수는 "멤버 변수"를, 괄호 안의 변수는 "매개변수"를 우선적으로 지칭하도록 되어 있기 때문. 따라서, this 키워드가 필요 없다.)
클래스 Static 멤버 변수 및 함수
- 객체가 소멸될 때 사라지는 것이 아니라, 프로그램이 종료될 때 소멸한다.
- Static 멤버 변수는 클래스의 모든 객체들이 공유하는 한 개의 변수다.
- Static 멤버 변수 및 함수에 대한 접근은 클래스에 범위지정 연산자(::)를 사용한다.
- 다음과 같이 Static 멤버 변수를 초기화한다.
class Monster {
static int totalMonsterNum; // 자동으로 0이 할당된다.
...
};
int Monster::totalMonsterNum = 10; // static 멤버 변수 초기화
- 클래스 내부에서 Static 멤버 변수를 초기화하려면 const static 변수일 때만 가능하다.
class Monster {
const static int totalMonsterNum = 10;
...
};
- Static 멤버 함수는 특정 객체에 종속되는 것이 아닌, 클래스 전체에 존재하는 한 개의 함수다.
- Static 함수 내에서는 static 변수만 사용이 가능하다. (어떤 객체의 소유 변수인지 확인이 불가능하기 때문)
- Static 함수 내에서 새로운 일반 변수나 객체를 생성해서 리턴하는 것은 가능하다.
class Monster {
private:
int hp;
static int damage;
public:
static void Show();
};
void Monster::Show() {
std::cout << "Static 함수 호출" << std::endl;
// hp = 10; 일반 변수 사용 불가
damage = 10;
}
int main() {
Monster::Show(); // 객체 생성없이 클래스에 바로 접근하여 호출
return 0;
}
728x90
반응형
'Languages > C++' 카테고리의 다른 글
[C++] Const 키워드에 대해 (0) | 2022.02.09 |
---|---|
[C++] 참조 리턴 함수 (0) | 2022.02.09 |
[C++] 복사 생성자(Copy constructor), 얕은 복사(Shallow Copy), 깊은 복사(Deep Copy) (0) | 2022.02.09 |
[C++] 생성자(Default Constructor) 사용 시 주의사항 (0) | 2022.02.08 |
[C++] C++ 컴파일러에서 함수를 오버로딩(Overloading)하는 과정 (0) | 2022.02.08 |