언어 자료구조 알고리즘/디딤돌 C++

17. 정적(static) 멤버

언제나휴일 2016. 1. 27. 19:48
반응형
안녕하세요. 언제나 휴일, 언휴예요.
이번에는 static 키워드를 사용하여 선언하는 정적 멤버에 관해 알아보기로 해요.

 

멤버의 종류를 나누는 기준은 여러 기준이 있어요. 그 중에 하나가 해당 멤버가 개체의 멤버인지 혹은 형식의 멤버인지로 구분하는 거예요. 이러한 기준으로 구분할 때 형식의 멤버와 개체의 멤버로 구분할 수 있어요.
 
형식의 멤버는 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"
int Student::last_num;  //static 멤버 필드는 멤버 필드 선언을 해야 함, 선언문에서 static 키워드 사용 안 함
Student::Student(void)
{
    last_num++;
    num = last_num;
}
int Student::GetNum()
{
    return num;
}
int Student::GetLastNum()  //static 멤서 메서드 구현 정의에서는 static 키워드 사용 안 함
{
    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<<"학생 번호:"<<stu2->GetNum()<<endl;
 
delete stu;
delete stu2;
 
실행 결과
현재 학생 수:0
학생 번호:1
현재 학생 수:1
학생 번호:2
 
다음은 위에서 설명한 전체 코드입니다.
//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"
int Student::last_num;  //static 멤버 필드는 멤버 필드 선언을 해야 함, 선언문에서 static 키워드 사용 안 함
Student::Student(void)
{
    last_num++;
    num = last_num;
}
int Student::GetNum()
{
    return num;
}
int Student::GetLastNum()  //static 멤서 메서드 구현 정의에서는 static 키워드 사용 안 함
{
    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<<"학생번호:"<<stu2->GetNum()<<endl;
 
    delete stu;
    delete stu2;
    return 0;
}

반응형

'언어 자료구조 알고리즘 > 디딤돌 C++' 카테고리의 다른 글

22. 캡슐화 최종 실습 - 시나리오  (0) 2016.01.27
21. 캡슐화 실습2 - 학생  (4) 2016.01.27
20. 캡슐화 실습1 - 복소수  (2) 2016.01.27
19. 특별한 멤버 this  (0) 2016.01.27
18. 상수화 멤버  (0) 2016.01.27
16. 생성자, 소멸자  (0) 2016.01.27
15. 접근 지정자  (0) 2016.01.27
14. 캡슐화 개요  (0) 2016.01.27
13. OOP 개요  (0) 2016.01.27
12. string 형식 개요  (0) 2016.01.27