인강 & 책 스터디 노트/Coursera 가속화된 컴퓨터 과학 기초

[c++] 클래스 생성자 - 자동 디폴트 생성자, 사용자 지정 생성자

thisisamrd 2024. 8. 4.

 

현재 저는 coursera의 다음 강의를 수강하고 있습니다.

 

Coursera | 최고의 교육 기관에서 제공하는 온라인 강좌 및 자격증 무료 회원 가입 | Coursera

예일, 미시건, 스탠포드와 같은 명문대 및 Google, IBM 등의 초일류 기업에서 인정하는 고가치 자격증을 온라인으로 학습하고 취득하세요. Coursera에 무료로 가입하여 데이터 과학, 컴퓨터 과학, 비

www.coursera.org

 

아래 내용은 오늘 배운 내용인 클래스 생성자(자동 디폴트 생성자, 사용자 지정 생성자)에 대한 복습입니다.

 

 

 

 

 

namespace uiuc {
    class Cube {
    public:
        Cube(); // 사용자 지정 기본 생성자
        double getVolume();
        double getSurfaceArea();
        void setLength(double length);
    private:
        double length_;
    };
}

Cube::Cube() {
    length_ = 1; // length_의 초기값 설정
}

 

 

 

클래스 생성자란?

클래스 생성자는 c++에서 객체를 생성할 때 자동으로 호출되는 특별한 함수로, 객체의 초기화를 담당합니다. 생성자는 클래스와 같은 이름을 가지며 반환형이 없습니다. 생성자는 객체의 멤버 변수를 초기화하고, 객체가 생성될 때 필요한 초기 설정을 수행합니다.

 

 

자동 디폴트 생성자

 

  • 자동 디폴트 생성자클래스에 생성자가 정의되어 있지 않을 때 컴파일러가 자동으로 제공하는 생성자입니다.
  • 이 생성자는 모든 멤버 변수를 기본값으로 초기화합니다. 그러나 기본값이 정의되지 않은 경우도 있어, 멤버 변수는 예측할 수 없는 초기값을 가질 수 있습니다.
  • 예를 들어, int와 같은 프리미티브 타입은 기본값이 정의되지 않아서 초기값이 불확실할 수 있습니다.

 

 

 

사용자 지정 생성자

사용자 지정 생성자는 프로그래머가 정의하는 생성자로, 객체의 초기 상태를 명시적으로 설정할 수 있습니다.

 

 

사용자 지정 기본 생성자 (Custom Default Constructor)

 

  • 인수를 받지 않는 생성자입니다.
  • 클래스의 멤버 변수를 초기화하여 객체의 기본 상태를 설정합니다.
  • 클래스의 이름과 같은 함수 이름을 가지며, 반환 유형이 없습니다.

 

이 생성자는 Cube 객체를 만들 때 길이를 1로 초기화하여 단위 정육면체를 생성합니다.

namespace uiuc {
    class Cube {
    public:
        Cube(); // 사용자 지정 기본 생성자
        double getVolume();
        double getSurfaceArea();
        void setLength(double length);
    private:
        double length_;
    };
}

Cube::Cube() {
    length_ = 1; // length_의 초기값 설정
}

 

 

 

 

Cube 클래스의 사용자 지정 기본 생성자를 사용하여 객체를 생성합니다.

이 경우, c 객체의 초기 길이는 1로 설정되며, 부피는 이 됩니다.

int main() {
    uiuc::Cube c; // 사용자 지정 기본 생성자를 사용
    std::cout << "Volume: " << c.getVolume() << std::endl;
    return 0;
}

 

 

 

 

사용자 지정 인수 생성자 (Parameterized Constructor)

 

  • 하나 이상의 인수를 받는 생성자입니다.
  • 객체를 생성할 때 인수를 통해 멤버 변수를 원하는 값으로 초기화할 수 있습니다.

 

이 생성자는 인수를 받아 길이를 설정할 수 있도록 하여, 다양한 크기의 Cube 객체를 만들 수 있게 합니다.

namespace uiuc {
    class Cube {
    public:
        Cube(double length); // 하나의 인수를 받는 생성자
        double getVolume();
        double getSurfaceArea();
        void setLength(double length);
    private:
        double length_;
    };
}

Cube::Cube(double length) {
    length_ = length; // 전달받은 길이로 초기화
}

 

 

 

 

Cube 클래스의 인수 생성자를 사용하여 특정 길이로 객체를 생성합니다.

여기서는 c 객체의 초기 길이가 2로 설정되며, 부피는 8(2의 세제곱)이 됩니다

int main() {
    uiuc::Cube c(2); // 길이가 2인 Cube 객체 생성
    std::cout << "Volume: " << c.getVolume() << std::endl;
    return 0;
}

 

 

 

 

 

생성자 오버로딩과 자동 생성자의 제거

  • 생성자 오버로딩: 같은 클래스에 여러 개의 생성자를 정의하여 인수의 수나 타입에 따라 다르게 동작하게 하는 것입니다.
  • 만약 클래스에 하나라도 생성자가 정의되어 있으면, C++는 자동 디폴트 생성자를 제공하지 않습니다. 따라서 기본 생성자가 필요한 경우 명시적으로 정의해야 합니다.

 

오류 예제

매개변수가 없는 생성자를 호출하려 하지만, 클래스에 해당 생성자가 정의되어 있지 않으면 컴파일 오류가 발생합니다.

아래의 경우, Cube 클래스에 하나의 인수 생성자만 정의되어 있고 기본 생성자가 정의되지 않았기 때문에 컴파일 시 오류가 발생합니다.

namespace uiuc {
    class Cube {
    public:
        double getVolume();
        double getSurfaceArea();
        void setLength(double length);
    private:
        double length_;
    };
}

int main() {
    uiuc::Cube c; // 자동 디폴트 생성자가 호출됩니다.
    std::cout << "Volume: " << c.getVolume() << std::endl;
    return 0;
}

 

댓글