Programming/C++
[Programming/C++] 정적 멤버 함수에서 객체 생성
scii
2023. 1. 17. 01:56
다음 예제에서 유심히 봐야할 것은 생성자가 private으로 되어 있다는 점이다. 즉, 클래스의 외부에서 객체 생성하는 것은 불가능하다. 하지만 멤버라면 가능하다.
그래서 정적 멤버 함수에서 객체를 동적으로 생성해서 그 주소를 반환하게 만들었다.
#include <iostream>
#include <string>
using namespace std;
class Student{
public:
string name;
int sNo;
void Print();
private:
Student(const string& name_arg, int stdNumber);
public:
static int studentNumber;
static Student* CreateStudent(const string& name_arg);
};
int Student::studentNumber = 0;
Student* Student::CreateStudent(const string& name_arg){
// 학생 객체 생성
Student* p = new Student(name_arg, studentNumber++);
// 새로 생성된 학생 객체 반환
return p;
}
Student::Student(const string& name_arg, int stdNumber)
:name(name_arg), sNo(stdNumber){}
void Student::Print(){
cout<<"Name = "<<name<<", "<<"Number = "<<sNo<<endl;
}
int main(int argc, const char * argv[]) {
// 학생 객체 세 개 생성
Student* p1, * p2, * p3;
p1 = Student::CreateStudent("aaa");
p2 = Student::CreateStudent("bbb");
p3 = Student::CreateStudent("ccc");
// 생성한 학생 정보 출력
p1->Print();
p2->Print();
p3->Print();
// 객체들을 동적 생성했으므로 해제해줘야 한다.
delete p1;
delete p2;
delete p3;
p1 = p2 = p3 = nullptr;
return 0;
}
// 결과
Name = aaa, Number = 0
Name = bbb, Number = 1
Name = ccc, Number = 2
이 예제에서 중요한 것은 다음의 두 가지다.
- 생성자가 private인 경우에도 정적 멤버 함수에서는 객체를 생성할 수 있다.
- 이렇게 하려면 객체를 동적으로 생성해서 그 주소를 반환하는 수밖에 없다.
첫 번째는 정적 멤버 함수도 '멤버'라는 점에서 볼 때 쉽게 수긍할 수 있다. private로 설정한 것은 클래스의 외부에서 접근할 수 없다는 뜻이지 내부에서도 접근할 수 없다는 뜻은 아니기 때문이다.
두 번째는 바꿔 말해서 "정적으로 객체를 할당하는 방법은 사용할 수 없다"는 것이다. 정적 멤버 함수 안에서 객체를 정의했다면, 함수가 종료되면서 그 객체도 같이 소멸될 것이기 때문이다. 그래서 동적으로 할당한 다음에 그 주소를 반환하는 방법을 사용해야 하는 것이다.
이렇게 생성자가 private로 해두고 정적 멤버 함수를 통해서만 객체를 생성할 수 있게 하는 방법은 종종 사용된다. 예를 들면 "싱글턴 패턴"이다.