클래스 내에서 멤버 변수 앞에 static을 붙인걸 정적 멤버 변수라고 합니다.
클래스에서 선언했던 모든 멤버 변수들은 "객체 단위의 멤버"로 객체들 마다 각기 다른 값을 가질 수 있는 독립된 변수입니다.
예를 들어, Point라는 클래스를 만들고 객체 p1,p2,p3라는 객체를 선언하면 메모리 공간이 각각 생깁니다.
하지만 정적 멤버 변수는 객체마다가 아닌 클래스 단위로 존재합니다.
그렇다면, 왜 정적 멤버 변수가 필요할까요? 이유는
- 프로그램에서 Point 클래스의 객체가 현재 몇 개인지 알고 싶을 때
- 클래스의 버전이나 개발 정보를 클래스에 남기고 싶을 때
등등이 있습니다.
정적 멤버 변수에 대해 더 자세하게 말하면
- 클래스 내부에서 정의하지만 일반 멤버 변수와 달리 객체마다 생기는 자료가 아니라 클래스에 유일하게 하나만 존재하는 변수이다.
- 전역변수와 비슷하게 사용되지만, 클래스 내부에 선언되어 보다 객체지향적인 설계이고, 클래스의 이름을 통해 접근할 수 있습니다.
//Point.h파일
class Point
{
//클래스에 정적 멤버 변수 추가
private:
int x;
int y;
public:
static int count; //클래스 갯수
static int version; //클래스 버전
};
//Point.cpp파일
//C++파일에 실제 정적 멤버 변수 선언 및 초기화
#include "Point.h"
int Point::count = 0;
int Point::version = 1;
//Main.cpp파일
#include "Point.h"
int main()
{
//정적 멤버 변수를 쓰기 위해 변수 앞에 클래스명과 범위 연산자를 사용
Point a;
Point::version = 3;
Point::count++;
return 0;
}
여기서 제가 중요하게 생각하는건 정적 멤버 변수나 함수는 객체의 수와 상관없이 하나만 만들어지고, 이것은 심지어 객체가 하나도 선언하지 않아도 존재한다는 것만 알아도 정적 멤버 변수나 함수는 어느 정도 안다고 생각합니다. 더 자세한건 물론 더 다양한 자료를 찾아보시는걸 추천합니다.
추가로 정적 멤버 변수는 정적 변수와 같이 프로그램이 시작되면 만들어지고 프로그램이 종료되면 사라지며,
객체의 크기에 영향을 주지 않습니다. 객체의 크기는 일반 멤버 변수들에 의해서만 결정됩니다. 멤버 함수도 영향을 주지 않습니다.
클래스 내에서 멤버 함수 앞에 static을 붙인걸 정적 멤버 함수라고 합니다.
C++에서는 삼각함수를 위한 sin(), cos() 등의 함수를 제공한다. 이들은 모두 일반 함수이며, 수학적인 정의에 따라 값이 나옵니다. 그런데, C++보다 순수 객체지향 언어에 더 가까운 Java언어에는 이러한 일반 함수라는 개념 자체가 없습니다.
모든 함수가 멤버 함수가 되어야 합니다. 그렇다면 sin(), cos() 등의 함수를 어떻게 제공할까요?
Java에서는 Math란 클래스를 제공합니다.
그렇다면 객체를 선언해야 될까요? 아닙니다.
a객체의 sin() 함수와 b 객체의 sin() 함수의 값이 다르지 않습니다.
위에 정적 멤버 함수 부분에서 객체가 하나도 존재하지 않아도 정적 멤버 함수는 존재한다고 했습니다.
그렇기에 Math::sin()과 같이 객체를 통하지 않고 바로 호출할 수 있는데, 이것은 정적 멤버 함수로 구현하였기 때문입니다.
저는Java도 1학년 1학기에 조금 공부했었는데 이런 이론을 전혀 모르고 있었습니다.. 정말 전 이 글을 책에서 보고 시야가 넒어졌습니다. 누군가 이글을 보고 저와 같이 깨달았으면 합니다.
정적 멤버 함수의 특징을 좀 더 적고 글을 마무리 하겠습니다.
- 정적 멤버 함수는 객체에서 호출되지 않으므로 함수 내에서 "나" 또는 "내 객체"가 없습니다. 따라서 일반 멤버 변수를 사용하거나 일반 멤버 함수로 호출할 수 없습니다. 왜냐하면 이들은 "나"가 있어야 의미를 갖기 때문입니다.
- 동일한 이유로 this 포인트를 사용할 수 없습니다.
- 클래스의 상속에서 함수의 재정의(overriding)를 사용할 수 없습니다.
'C++ 프로그래밍 > 클래스' 카테고리의 다른 글
객체의 복사와 복사 생성자 (0) | 2022.07.28 |
---|---|
객체 생성되는 것과 안 되는 것 (0) | 2022.07.25 |
멤버 초기화 리스트 (0) | 2022.07.25 |
생성자와 멤버 함수의 유사점과 차이점 (0) | 2022.07.25 |
구조체에서 클래스로 (0) | 2022.07.25 |