우선 c에서의 static은 cpp에서도 동일하게 사용됩니다.
그러면 cpp에서의 static과 c에서의 static은 어떤 다른점이 있을까요?
static 멤버변수는 클래스 변수
라고도 불리는데 그 이유는 객체를 아무리 많이 생성해도 메모리 영역에는 단 하나
만 할당되어 사용되기 때문입니다.
그렇기 때문에 클래스당 하나
만 생성된다고 해서 클래스 변수라고도 불리는 것 입니다.
이 클래스 변수는 해당 클래스의 객체들이 모두 접근 가능한 하나의 변수입니다.
전역변수와 비슷한데 모든 곳에서 접근 가능한 게 아닌 클래스를 통해서만
접근 가능한 전역변수라고 생각하면 될 것 같습니다.
생성 시기와 소멸 시기도 전역변수와 동일하며, 초기화도 단 한번만 진행할 수 있게 생성자가 아닌 클래스 외부에서 초기화를 진행합니다.
class TempA
{
...
ststic int _num;
...
}
int TempA::_num = 0;
우선 static 멤버변수가 public으로 선언이 되어있다고 했을 때 객체가 생성되지 않더라도 접근이 가능합니다.
class TempA
{
public:
static int _num;
};
int TempA::_num = 0;
int main(void)
{
std::cout << TempA::_num << std::endl;
return (0);
}
출력은 다음과 같습니다.
0
이렇듯 static 멤버변수는 멤버변수처럼 객체
로 제한된게 아닌 전역변수의 성질을 가진 변수인 것을 알 수 있습니다.
그렇기 때문에 static 멤버변수에 접근할때 가능하다면 멤버변수와 구분할 수 있도록 클래스의 이름으로 접근하는게 좋다고 합니다.
static 멤버함수는 static 멤버변수와 특성이 동일합니다.
우리는 제일 마지막 부분인 객체의 멤버로 존재하지 않습니다.
에 집중해야합니다.
이 말은 static멤버함수는 객체의 멤버가 아니기 때문에 객체의 private변수에는 접근할 수 없습니다.
따라서 다음과 같은 클래스 정의는 에러가 납니다.
class TempA
{
private:
int _num;
public:
static void add(int num)
{
this->_num += num;
}
};
static 멤버함수인 add
에서 private변수인 _num
에 매개변수 num
을 더하고 있습니다.
하지만 add
함수는 객체의 멤버가 아니기 때문에 private변수인 _num
에는 접근할 수 없습니다.
그렇기 때문에 에러가 나는 겁니다.
이런 특성을 잘 활용한다면 일반적인 전역변수와 전역함수를 대체할 수 있다고 합니다.
const도 마찬가지로 c언어에서 사용했던것과 동일하게 사용 가능합니다.
const 객체는 다른 변수들과 마찬가지로 객체를 상수화
한다는 뜻으로써 객체의 데이터 변경을 허용하지 않는다는 말입니다.
그렇기 때문에 const 객체
는 const 멤버함수
의 호출만이 가능합니다.
const 함수는 해당 함수 내에 멤버변수의 변경
을 허용하지 않는다는 뜻 입니다.
또한 const 함수 내에서는 일반 함수의 사용이 제한되며 오직 const 함수
만 사용이 가능합니다.
함수의 오버로딩은 매개변수의 수 혹은 자료형이 달라야 하는데, 만약 다 동일하다고 하더라도 함수가 const화
되어있다면 함수의 오버로딩
이 가능합니다.
즉, 다음과 같은 함수들은 오버로딩이 됩니다.
void tmp(void) {...}
void tmp(void) const {...}
이러한 const들의 사용은 복잡해보이지만 코드의 안정성을 높여주는 중요한 내용이므로 사용할 수 있다면 사용하는게 좋습니다.
[ c++ ] namespace
[ c++ ] 클래스, 생성자, 소멸자, 이니셜라이저, this포인터
[ c++ ] c++에서의 const와 static
[ c++ ] 참조자(reference)
[ c++ ] new와 delete
[ c++ ] 함수 오버로딩
[ c++ ] 파일 입출력 (ifstream, ofstream)
[ c++ ] 함수포인터, 멤버 함수포인터
[ c++ ]연산자 오버로딩
[ c++ ] 캡슐화란?
[ c++ ] 상속과 다형성에 대해 알아보자