본문 바로가기
코딩/C++ - 핵심과 사용법만

[C++/핵심과 사용법만] 멤버 이니셜라이저(initializer)

by 오리로스 2024. 2. 14.

클래스 이니셜라이저의 의의 :

멤버(Member)는 클래스 내의 멤버 변수 혹은 멤버 변수를 뜻한다.

이니셜 라이저(Initializer)는 뜻 그래도 초기화. 

멤버 이니셜라이저를 사용함으로써 초기화의 대상을 명확하게 인식할 수 있고, 선언과 동시에 초기화가 이루어지는 바이너리 코드가 생성되므로 코드의 성능 측면에서도 이점이 있다.

뭔말이냐? 예제로 바로 본다.

[example]

#include <iostream>

using namespace std;

class Robot 
{
    private:
        int num;
    public:
        Robot(){
            cout << "Robot의 기본 생성자" << endl;
        }
};

int main(){
    Robot dog;
    return 0;
}

[result]

Robot의 기본 생성자

생성자는 객체 생성 시 딱 한 번 호출되는 그냥 함수다. 기본생성자는 클래스 이름과 함수 이름이 동일하며 값을 값을 반환하지 않는다. 함수이기 때문에 오버로딩과 매개변수를 통한 디폴트값 설정이 가능하다.아래와 같이 오버로딩이 가능하고,

#include <iostream>

using namespace std;

class Robot 
{
    private:
        int num;
    public:
        Robot(int num_){
            cout <<"num : " << num_ << endl;
        }
        Robot(int num_1_, int num_2_){
            cout <<"num_1 : " << num_1_ <<" num_2 : " << num_2_<< endl;
        }
};

int main(){
    Robot dog1(1);
    Robot dog2(1,2);
    return 0;
}

[result]

num : 1
num_1 : 1 num_2 : 2

 

또 아래와 같이 매개변수값을 전달하여 private 변수를 초기화 할 수 있다. 디폴트 값을 int num_ = 77과 같이 주었기 때문에, 아규먼트를 비워놓으면 num은 77로 초기화가 된다.

#include <iostream>

using namespace std;

class Robot 
{
    private:
        int num;
    public:
        Robot(int num_ = 77){
            num = num_;
            cout << "num : " << num << endl;
        }
};

int main(){
    Robot dog1;
    Robot dog2(99);
    return 0;
}

[result]

num : 77
num : 99

 

이렇게하면 되는데 멤버 이니셜라이저를 왜 쓰냐? 글의 초입에서 초기화의 대상을 명확히 할 수 있다고 했다. 아래의 코드를 보자.

#include <iostream>

using namespace std;

class Robot 
{
    private:
        int num;
    public:
        Robot(int num_)
            :num(num_)
        {
            cout << "num : " << num << endl;
        }
};

int main(){
    Robot dog(99);
    return 0;
}

[result]

num : 99

num(num_)은 num = num_와 동일한 의미이다. 멤버 num을 초기화 함을 명화하고 간결하게 표현할 수 있다. 아래 예제와 같이 private 변수가 다양하게 있을때를 보자.

#include <iostream>

using namespace std;

class Robot 
{
    private:
        int num;
        int prodYear;
        bool isSoldOut;
    public:
        Robot(int num_, bool isSoldOut_)
            :num(num_), isSoldOut(isSoldOut_), prodYear(2050)
        {
            cout << "num : " << num << endl;
            cout << "production year : " << prodYear << endl;
            cout << boolalpha <<"is sold out? : " << isSoldOut << endl;
        }
};

int main(){
    Robot dog(99, true);
    return 0;
}

[result]

num : 99
production year : 2050
is sold out?:true

이니셜라이저를 사용해서 어떤놈은 매개변수받아서 초기화, 어떤놈은 바로 상수로 초기화할 수 있는 걸 볼 수 있다. 편하다. 중간에 어감이 약간은 웃긴(?!) boolalpha(std::boolalpha)는 bool변수가 리터럴하게 출력되도록 해준다.

 

의의에서 말했듯, 컴파일 단에서 선언과 초기화가 동시에 이루어는 바이너리 코드가 생성되기 때문에 성능에도 약간의 이점이 있다.

그리고 컴파일 단에서 이루어지는 특성상 private 변수가 const인 경우에도 초기화가 가능하다.

 

prev) 생성자와 소멸자

next) 상속과의 연계?