-
2024 - 01 - 23 C++ Grammar D+5Language Grammar/C++ 2024. 1. 23. 17:07
*정적 멤버 변수
실습 코드class Count { private: int Value; static int Num; public : Count() { Num++; } ~Count() { Num--; } void OutNum() { printf("현재 객체 개수 = %d\n", Num); } }; int Count::Num=0;
class 안에 멤버변수 선언앞에 static을 붙여 정적 멤버 변수를 만들면, 클래스안에서 정적 멤버 변수에 대한 정의만 되있기때문에 외부에서 별도로 선언 및 초기화를 진행해주어야 한다.
int Count::Num=0; 의 정의는 Count 라는 클래스안에 정적 멤버변수 Num을 생성하고 0으로 초기화해준다는 뜻이다.
만약 Count의 여러개의 객체 A,B,C가 선언되었을 때,
Num이라는 정적 멤버 변수를 소유하는 주체는 객체가 아니라 클래스 이고, 외부에서 딱한번만 초기화되며 모든 객체가 이를 공유하기 때문에 모든 객체를 관리하는 변수로 이용 할 수 있다.
*정적 멤버 함수
개념은 정적 멤버 변수와 비슷하며, 주로 클래스 전체에 대한 전반적인 작업을 하기때문에 정적 멤버 변수를 조작하거나 이 클래스에 속한 모든 객체를 위한 어떤 처리를 한다.
실습 코드class Count { private: int Value; static int Num; public: Count() { Num++; } ~Count() { Num--; } static void InitNum() { Num = 0; } static void OutNum() { printf("현재 객체 개수 = %d\n", Num); } }; void main() { //27-3 정적 멤버 함수 Count::InitNum(); Count::OutNum(); Count C, * pC; C.OutNum(); pC = new Count; pC->OutNum(); delete pC; pC->OutNum(); printf("크기=%d\n", sizeof(C)); }
정적 멤버 함수로 만들어진 함수의 호출은 객체에서 호출하여도 객체에 대한 클래스 포인터의 형식만 참고하여
클래스에 소속된 정적 멤버 함수를 불러오기떄문에 어떤 방식으로 호출하여도 클래스 포인터형식만 맞으면 함수를 호출 할 수 있다.
클래스에 소속되어 있기 때문에 클래스 소속인 정적 멤버는 호출 할 수 있는 반면,객체 소속인 일반 멤버는 참조할 수 없다.
*정적 멤버의 활용
1. 단 한 번만 해야 하는 전역 자원의 초기화 ( DB 및 네트워크 연결 , 윈도우 클래스 등록)
실습코드class DBQuery { private: static HANDLE hCon; int nResult; public: DBQuery() { }; static void DBConnect(char *Server, char *ID, char *Pass); static void DBDisConnect(); BOOL RunQuery(char *SQL); // .... }; HANDLE DBQuery::hCon; void DBQuery::DBConnect(char *Server, char *ID, char *Pass) { // 여기서 DB 서버에 접속한다. // hCon = 접속 핸들 } void DBQuery::DBDisConnect() { // 접속을 해제한다. // hCon=NULL; } BOOL DBQuery::RunQuery(char *SQL) { // Query(hCon,SQL); return TRUE; } void main() { DBQuery::DBConnect("Secret","Adult","doemfdmsrkfk"); DBQuery Q1,Q2,Q3; // 필요한 DB 질의를 한다. // Q1.RunQuery("select * from tblBuja where 나랑 친한 사람"); DBQuery::DBDisConnect(); }
2. 읽기 전용 자원의 초기화
객체는 스스로 동작할 수 있지만 때로는 외부의 환경이나 자원에 대한 정보를 필요로 한다.
한번 읽어서 여러 번 사용할 수 있는 읽기 전용 정보같은 경우에는 객체별로 이 값을 일일히 조사하고 따로 유지할 필요가 없다.
따라서 정적 멤버 변수로 초기화한 다음에 필요할때 마다 불러와 읽으면 된다.
3. 모든 객체가 공유해야 하는 정보 관리
중요한 계산을 하는 객체의 경우 계산에 필요한 기준값이 있을 수 있다.
예를 들어 환율이나 이자율 따위는 금융, 재무 처리에 상당히 중요한 기준값으로 작용하며 기준값에 따라 계산 결과가 달라진다.
이런 값들은 프로그램이 동작중일 때도 수시로 변할 수 있지만 일단 정해지면 모든 객체에 일관되게 적용된다.
그래서 개별 객체들이 각자 멤버로 가질 필요가 없으며, 정적 멤버로 선언해 두고 공유하면 항상 최신의 기준값을 제공받게 된다.
실습코드class Exchange { private: static double Rate; public: static double GetRate() { return Rate; } static void SetRate(double aRate) { Rate=aRate; } double DollarToWon(double d) { return d*Rate; } double WonToDollar(double w) { return w/Rate; } }; double Exchange::Rate; void main() { Exchange::SetRate(1200); Exchange A,B; printf("1달러는 %.0f원이다.\n",A.DollarToWon(1.0)); Exchange::SetRate(1150); printf("1달러는 %.0f원이다.\n",B.DollarToWon(1.0)); }
*상수 멤버
한번 값이 정해지면 변경될 수 있는 멤버이며, 상수 멤버 또한 모든 객체에 대하여 항상 같은 값을 가진다면 Static을 이용하여 상수 정적 멤버로 선언할 수 있다.
실습코드class MathCalc { private: static const double pie; public: MathCalc() { } void DoCalc(double r) { printf("반지름 %.2f인 원의 둘레 = %.2f\n",r,r*2*pie); } }; const double MathCalc::pie=3.1416; void main() { MathCalc M; M.DoCalc(5); }
*상수 멤버 함수
멤버값을 변경 할 수 없는 함수이다.
타입 함수이름 Const 로 상수 멤버 함수를 표기한다.
멤버 변수의 값을 읽기만 하고 싶을때 주로 쓰임
상수로 선언된 객체에 대해서는 상수 멤버 함수만 호출 할 수 있다.
실습코드class Position { private: int x,y; char ch; public: Position(int ax, int ay, char ach) { x=ax;y=ay;ch=ach; } void OutPosition() const { gotoxy(x, y);putch(ch); } void MoveTo(int ax, int ay) { x=ax; y=ay; } }; void main() { Position Here(1,2,'A'); Here.MoveTo(20,5); Here.OutPosition(); const Position There(3,4,'B'); There.MoveTo(40,10); // 에러 발생 There.OutPosition(); }
* mutable
C++에서 새로 추가된 키워드이며, 상수의 반대 의미로 사용되며 "수정 가능" 정도로 이해하면 된다.
mutable로 지정된 멤버는 상수 함수나 상수 객체에 대해서도 값을 변경할 수 있다.
객체의 상태를 표현하는 중요한 멤버가 아닐 때 이 속성을 사용한다.
실습코드class Some { private: mutable int v; public: Some() { } void func() const { v=0; } }; void main() { Some S; S.func(); const Some T; T.func(); }
'Language Grammar > C++' 카테고리의 다른 글
2024 - 02 - 05 C++ 코딩테스트 10주완성 D+1 (1) 2024.02.05 2024 - 01 - 30 C++ Grammar D+6 (1) 2024.01.30 2024 - 01 - 22 C++ Grammar D+4 (0) 2024.01.22 2024 - 01 - 18 C++ Grammar D+3 (0) 2024.01.18 2024 - 01 - 16 C++ Grammar D+2 (0) 2024.01.16