#include <iostream>
void Func()
{
int A = 0;
++A;
std::count << A;
}
int main()
{
Func();
Func();
Func();
Func();
}
위의 코드를 실행하면
1
1
1
1
이렇게 출력된다. 함수가 만들어지면 데이터가 생성되고 함수가 끝나면서 파괴되기 때문이다.
이 코드에서 int A를 static으로 만들어주면 A라는 변수가 빌드가 되면
밖으로 나가서 전역변수 처럼 사용된다. 즉, 정보가 파괴되지 않고 남아있는다.
#include <iostream>
void Func()
{
static int A = 0;
++A;
std::count << A;
}
int main()
{
Func();
Func();
Func();
Func();
}
이렇게 static 키워드를 붙여주고 실행하면 1,2,3,4 가 출력된다.
static int A = 0;
void Func()
{
++A;
std::count << A;
}
빌드가 되면 이런개념으로 사용되기 때문에 A라는 변수의 정보가 계속 남아있게 된다.
그럼 전역변수로 A를 만드는 것과 똑같다고 생각할 수 있는데 전역변수로 A를 만들어주면
다른곳에서 A를 사용할 수 있기 때문에 Func라는 함수에서만 사용할 수 있도록 static으로
만들어 주는 것이다.
#include <iostream>
void Func()
{
static int A = 0;
++A;
std::count << A;
}
void Func2()
{
static int A = 0;
++A;
std::count << A;
}
int main()
{
Func();
Func();
Func();
Func();
Func2();
Func2();
Func2();
Func2();
}
위의 개념으로 보면 위의 코드는 실행이 안되거나
출력결과가 1,2,3,4,5,6,7,8 이라고 생각할 수 있다.
함수를 실행하면 Func()의 static int A가 밖으로 나가고
Func2() 호출되면서 Func2()의 static int A가
밖으로 나가면서 이름이 겹친다고도 생각할 수 있다.
정확하게는 Func::A 와 Func2::A 이런 개념이다.그렇기 때문에 서로 다른 A가 되는것이고
그렇기 때문에 에러도 없고 출력결과는 1,2,3,4,1,2,3,4, 이렇게 나오는 것이다.
클래스 내부의 멤버 변수에서 멤버 함수에서도 static 키워드를 사용할 수 있는데
멤버 변수에 static 키워드를 붙이면 해당 클래스 에서만 이 변수를 전역 변수와 같이
사용하겠다는 것이되고 클래스 외부에서 전역 변수를 선언하듯이 멤버 변수를
static 키워드를 붙여서 선언하고 초기화 하는 코드를 추가해주면 된다.
class Test
{
private:
static int m_A;
};
int Test::m_A = 0;
int main()
{
}
이렇게 사용하면 Test클래스 객체들 간에 공유 하는 멤버 변수 m_A가 만들어 지는 것이다.
이 값을 클래스 외부에서 사용하고 싶다면 public으로 바꾸면 의미가 사라지기 때문에
멤버 함수로 m_A를 리턴해주는 함수를 만들어 줘야 한다.
멤버 함수에 static 키워드
클래스의 멤버 함수를 호출하려면 당연히 객체를 먼저
선언하고 그 객체의 멤버 함수를 사용해야 한다.
하지만 예외적으로 static 멤버 함수를 선언하면 이 함수는
객체를 선언하지 않고 클래스의 네임스페이스만 가지고 호출이 가능해 진다.
static 멤버 함수가 객체 선언 없이 클래스 네임스페이스만 가지고 호출이 가능한 이유는
static 멤버 함수를 호출할 때 내부적으로 this 포인터가 넘어가지 않기 때문이다.
(멤버 함수의 특징으로 멤버 함수를 만들게 되면 기본으로 클래스* const this 가 인자값으로
들어가 있고 그렇기 때문에 하나의 클래스로 여러개의 객체를 만들어도 각각의 객체들은
자기만의 함수를 사용하는 것이다.)
즉, static 멤버 함수에서는 this의 사용이 불가능해지고 이 말은
this에 의존하지 않는 static 멤버 변수는 사용이 가능하지만 this를 사용하는 일반 멤버변수에는
접근이 불가능하다.그렇기 때문에 static 멤버 함수에서는 일반 멤버 변수, 멤버 함수는 사용이
불가능하다.
'C++' 카테고리의 다른 글
Friend 문법 (0) | 2021.01.06 |
---|---|
재귀함수,꼬리재귀함수,스택 오버 플로우(Stack overflow) (0) | 2021.01.05 |
이너클래스(Inner Class) (0) | 2021.01.04 |
동적 메모리 할당과 해제,댕글링 포인터,vector의 내부동작 (0) | 2020.12.31 |
Pure Virtual Function(순수 가상 함수) (0) | 2020.12.31 |