Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-16 20:20
관리 메뉴

nomad-programmer

[Programming/C++] 정적 멤버 함수에서 객체 생성 본문

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로 해두고 정적 멤버 함수를 통해서만 객체를 생성할 수 있게 하는 방법은 종종 사용된다. 예를 들면 "싱글턴 패턴"이다.

Comments