멤버의 종류를 나누는 기준은 여러 기준이 있어요.
그 중에 하나가 해당 멤버가 개체의 멤버인지 혹은 형식의 멤버인지로 구분하는 거예요. 이러한 기준으로 구분하면 형식의 멤버와 개체의 멤버로 구분할 수 있어요.
형식의 멤버는 static 키워드를 사용하여 선언해서 정적(static) 멤버, 개체의 멤버를 비정적 멤버라 불러요.
C++에서 정적 멤버는 형식 정의 내에서 해당 멤버를 static 키워드를 붙여 선언합니다. 정적 멤버들은 개체마다 제공하는 멤버가 아니라 형식 내에 유일한 멤버예요.
학생을 생성할 때 학생의 일련번호를 차례대로 부여한다고 할 때 학생의 일련번호는 각각의 학생마다 별도로 유지해야죠.
하지만 이번에 생성할 학생에게 어떠한 일련번호를 부여할 것인지는 학생 개체마다 갖고 있을 필요가 없고 학생 형식에 유일하게 갖고 있게 해야겠죠
심지어 정적 멤버는 생성한 학생 개체가 하나도 없다고 해도 존재합니다.
class Student { int num; static int last_num; //정적 멤버 필드 public: Student(void); int GetNum(); static int GetLastNum(); //정적 멤버 메서드 };
클래스 정의문에서는 정적 멤버임을 알려주기 위해 static 키워드를 명시하여 선언합니다. 하지만 클래스 외부에 정적 멤버 메서드 정의문에는 static 키워드를 생략합니다. 그리고 정적 멤버 필드는 클래스 외부에도 반드시 선언해 주어야 합니다. 마찬가지로 static 키워드는 생략합니다.
//Student.cpp #include "Student.h" //static 멤버 필드는 멤버 필드 선언을 해야 함, 선언문에서 static 키워드 사용 안 함 int Student::last_num; Student::Student(void) { last_num++; num = last_num; } int Student::GetNum() { return num; } //static 멤서 메서드 구현 정의에서는 static 키워드 사용 안 함 int Student::GetLastNum() { return last_num; }
그리고 이처럼 정의한 Student 형식의 정적 멤버 메서드 중에 public 접근 지정한 멤버에 접근할 때는 형식명과 스코프 연산자(::)로 접근합니다. 다음의 사용 예를 살펴보세요.
cout<<"현재 학생 수:"<<Student::GetLastNum()<<endl; Student *stu = new Student(); cout<<"학생 번호:"<<stu->GetNum()<<endl; cout<<"현재 학생 수:"<<Student::GetLastNum()<<endl; Student *stu2 = new Student(); cout<<"학생 번호:"<<stu->GetNum()<<endl; delete stu; delete stu2;
▷ 실행 결과
현재 학생 수:0
학생 번호:1
현재 학생 수:1
학생 번호:1
다음은 위에서 설명한 전체 코드입니다.
//Student.h #pragma once class Student { int num; static int last_num; //정적 멤버 필드 public: Student(void); int GetNum(); static int GetLastNum(); //정적 멤버 메서드 };
//Student.cpp #include "Student.h" //static 멤버 필드는 멤버 필드 선언을 해야 함, 선언문에서 static 키워드 사용 안 함 int Student::last_num; Student::Student(void) { last_num++; num = last_num; } int Student::GetNum() { return num; } //static 멤서 메서드 구현 정의에서는 static 키워드 사용 안 함 int Student::GetLastNum() { return last_num; }
//정적 멤버 //Program.cpp #include <iostream> using namespace std; #include "Student.h" int main() { cout<<"현재 학생 수:"<<Student::GetLastNum()<<endl; Student *stu = new Student(); cout<<"학생번호:"<<stu->GetNum()<<endl; cout<<"현재 학생 수:"<<Student::GetLastNum()<<endl; Student *stu2 = new Student(); cout<<"학생번호:"<<stu->GetNum()<<endl; delete stu; delete stu2; return 0; }