[C++] 생성자(constructor), 디폴트 생성자(default constructor), 생성자? 생성자 란? 생성자 오버로딩

728x90
반응형

생성자(Constructor)

생성자(constructor)란 객체를 생성하면 자동으로 호출되는 함수를 말한다. 아래 코드를 보자.

#include <iostream>

class Date  {
    int y;
    int m;
    int d;

    public : 
        Date(int y_, int m_, int d_) {
            y = y_;
            m = m_;
            d = d_;
        };

        int DateGetYear(void);
        int DateGetMonth(void);
        int DateGetDay(void);
};

int Date::DateGetYear(void)
{
    return Date::y;
}
int Date::DateGetMonth(void)
{
    return Date::m;
}
int Date::DateGetDay(void)
{
    return Date::d;
}

int main(void)
{
    Date day(2024, 4, 30);

    std::cout<<"year : "<< day.DateGetYear() << std::endl;
    std::cout<<"month : "<< day.DateGetMonth() << std::endl;
    std::cout<<"day : "<< day.DateGetDay() << std::endl;

    return 0;
}

Date라는 Class가 있고 여기에 Class와 이름이 같은 Date라는 함수가 있다. 이 함수가 바로 생성자다. 생성자는 객체 생성과 동시에 호출되고 전달인자가 있는 경우 35번째 줄과 같이 객체를 생성하고 함수에 전달인자를 전달하듯이 값을 넣어주면 된다. 

생성자를 호출하는 방법에는 명시적 호출과 암시적 호출이 있다. 암시적 호출은 위 코드의 35번째 줄과 같이 객체를 생성하면 호출이 이뤄지는 것을 말하고 명시적 호출은 아래코드와 같다.

Date day1 = Date(2024, 2, 12);

main 함수를 아래와 같이 수정해서 확인해 볼 수 있다.

int main(void)
{
    Date day(2024, 4, 30);
    Date day1 = Date(2024, 2, 12);

    std::cout<<"0.year : "<< day.DateGetYear() << std::endl;
    std::cout<<"0.month : "<< day.DateGetMonth() << std::endl;
    std::cout<<"0.day : "<< day.DateGetDay() << std::endl;

    std::cout<<"1.year : "<< day1.DateGetYear() << std::endl;
    std::cout<<"1.month : "<< day1.DateGetMonth() << std::endl;
    std::cout<<"1.day : "<< day1.DateGetDay() << std::endl;

    return 0;
}

 

디폴트 생성자(Default Constructor)

Class를 만들 때 사용자가 명시적으로 생성자를 만들지 않으면 컴파일러는 자동으로 생성자를 만들어내는데 이 생성자를 Default constructor라고 한다. 매개변수가 없는 함수로 선언이 되고 아무런 동작을 하지 않는 생성자가 만들어진다. 사용자가 명시적으로 생성자를 만들면 컴파일러는 Default constructor를 만들지 않는다. 사용자가 직접 Default constructor를 만들 수도 있다. 

class Date  {
    int y;
    int m;
    int d;

    public : 
        Date() {
            y = 2000;
            m = 1;
            d = 1;
        };

        int DateGetYear(void);
        int DateGetMonth(void);
        int DateGetDay(void);
};

이와 같이 Class를 만들고 동작을 확인해보자. 

int main(void)
{
    Date day;
    std::cout<<"year : "<< day.DateGetYear() << std::endl;
    std::cout<<"month : "<< day.DateGetMonth() << std::endl;
    std::cout<<"day : "<< day.DateGetDay() << std::endl;

    return 0;
}

아래와 같이 객체 선언과 동시에 생성자가 호출된것을 확인 할 수 있다.


Default constructor를 사용하고 싶지 않을 경우 그냥 생성자를 정의하지 않는 방법밖에 없었지만 C++11 이상에서는 아래코드와 같이 Default constructor를 명시할 수 있다.

class Date  {
    int y;
    int m;
    int d;

    public : 
        Date() = default;

        int DateGetYear(void);
        int DateGetMonth(void);
        int DateGetDay(void);
};

 

생성자 오버로딩(constructor overloading)

생성자도 함수다. 따라서 오버로딩이 가능하다. 아래 코드를 보자.

class Date  {
    int y;
    int m;
    int d;

    public : 
        Date(int m_, int d_)    {
            y = 2024;
            m = m_;
            d = d_;
        };

        Date()  {
            y = 2000;
            m = 1;
            d = 1;
        };

        Date(int y_, int m_, int d_) {
            y = y_;
            m = m_;
            d = d_;
        };

        int DateGetYear(void);
        int DateGetMonth(void);
        int DateGetDay(void);
};

int Date::DateGetYear(void)
{
    return Date::y;
}
int Date::DateGetMonth(void)
{
    return Date::m;
}
int Date::DateGetDay(void)
{
    return Date::d;
}

int main(void)
{
    Date day_2024(5, 1);
    Date day;
    Date day1(2024, 4, 30);

    std::cout<<"year : "<< day_2024.DateGetYear() << std::endl;
    std::cout<<"month : "<< day_2024.DateGetMonth() << std::endl;
    std::cout<<"day : "<< day_2024.DateGetDay() << std::endl;

    std::cout<<"year : "<< day.DateGetYear() << std::endl;
    std::cout<<"month : "<< day.DateGetMonth() << std::endl;
    std::cout<<"day : "<< day.DateGetDay() << std::endl;

    std::cout<<"year : "<< day1.DateGetYear() << std::endl;
    std::cout<<"month : "<< day1.DateGetMonth() << std::endl;
    std::cout<<"day : "<< day1.DateGetDay() << std::endl;

    return 0;
}

Class안에 매개변수가 다른 생성자가 3개 선언되어 있고, main 함수에서 3개의 객체를 만들어 각각 다른 전달인자를 전달하고 있다. 이렇게 각각의 생성자는 다양한 방식으로 객체를 초기화 할 수 있도록 하고 생성자 오버로딩을 사용해 Class의 유연성을 높이고 코드의 재사용성을 높이면서 초기화에 편리함을 제공할 수 있다. 

여기까지 생성자의 기초에대해 알아봤다. 공부할게 너무나 많은 C++


컴공 전공이 아닌 땜쟁이한테는 너무 어려운일 ...



- 끝 -

728x90
반응형