기본 생성자

**기본 생성자**(default constructor)는 프로그래머가 정의한 생성자(자바에서)가 없는, 자동적으로 컴파일러에 의해 생성되는 생성자를 가리킨다. C++의 경우에는 생성자가 자동으로 생성되었는지나 사용자가 정의했는지와 관련 없이, 인자를 제공하지 않은 생성자이다. 정식 파라미터들과 함께하는 생성자도 만약 기본 인자가 생성자의 정의에 제공된다면, 인자 없이 호출될 수 있다는 점을 주의하라.

## C++
C++에서, 표준은 클래스를 위한 기본 생성자를 인자 없이 호출될 수 있는 생성자로 묘사하였다(이것은 자신의 파라미터 모두를 기본 인자로 갖는 생성자도 포함한다). 예를 들면:
```cpp
class MyClass
{
public:
    MyClass();  // constructor declared

private:
    int x;
};

MyClass :: MyClass() : x(100)  // constructor defined
{
}

int main()
{
    MyClass m;  // at runtime, object m is created, and the default constructor is called
}
```
메모리를 동적으로 할당할 때, 생성자는 클래스 이름 뒤에 괄호를 추가함으로써 호출될 것이다. 이것은 어느 정도 생성자에 대해 명시적인 호출이다:
```cpp
int main()
{
    MyClass * pointer = new MyClass();  // at runtime, an object is created, and the
                                        // default constructor is called
}
```
만약 생성자가 하나 이상의 파라미터를 갖지만, 이것들 모두가 기본 값들이라면, 이것은 계속 기본 생성자일 것이다. 각 클래스가 파라미터가 없든지 모든 파라미터가 기본 값들이든지 간에, 최대한 하나의 기본 생성자를 가질 수 있다는 것을 기억하라.
```cpp
class MyClass
{
public:
    MyClass (int i = 0, std::string s = "");  // constructor declared

private:
    int x;
    int y;
    std::string z;
};

MyClass :: MyClass(int i, std::string s)     // constructor defined
{
    x = 100;
    y = i;
    z = s;
}
```
C++에서 기본 생성자들은특정 상황에서 자동적으로 작동되므로 중요하다. 그러므로 이러한 상황에서 기본 생성자를 갖지 않는 클래스에게 이것은 오류가 된다:
* 객체 값이 인자 목록 없이 정의되거나(예를 들면: `MyClass x;`) 또는 인자 목록 없이 동적으로 할당되었거나 (예를 들면: `new MyClass;` 또는 `new MyClass();`), `MyClass`의 기본 생성자는 객체를 초기화하는데 사용된다.
* 객체들의 배열이 정의되면, 예를 들면 `MyClass x[10];`; 또는 동적으로 할당되면, 예를 들면 `new MyClass [10]`. `MyClass`의 기본 생성자는 요소들 모두를 초기화하는데 사용된다.
* 상속하는 클래스 생성자는 자신의 초기화 리스트에서 명시적으로 베이스 클래스 생성자를 호출하지 않고, 베이스 클래스를 위한 기본 생성자가 호출된다.
* 클래스 생성자가 자신의 초기화 리스트에서 객체 값을 갖는 것 중 하나의 생성자를 명시적으로 호출하지 않을 때, 필드의 클래스를 위한 기본 생성자가 호출된다.
* 표준 라이브러리에서, 값이 명시적으로 주어지지 않았을 때 특정한 컨테이너는 기본 생성자를 사용해서 값을 채운다. 예를 들면 `vector<MyClass>(10);`는 벡터를 열개의 요소들로 초기화하며, 이것은 기본으로 구조화된 `MyClass` 객체로 채워진다.
만약 클래스가 명시적으로 정의된 생성자를 갖지 않는다면, 컴파일러는 이것을 위한 기본 생성자를 암묵적으로 선언하고 정의한다. 이 암묵적으로 정의된 기본 생성자는 빈 바디와 함께 명시적으로 정의된 것과 동일하다.
```cpp
class MyClass
{
    int x;  // no constructor, so the compiler produces an (implicit) default constructor
};

int main()
{
    MyClass m;   // no error at runtime: the (implicit) default constructor is called
}
```
만약 생성자들이 클래스에 명시적으로 정의되었지만, 모두 기본이 아니라면, 컴파일러는 암시적으로 기본 생성자를 정의하지 않을 것이다. 이것은 클래스가 기본 생성자를 갖지 않는 상황으로 이끈다. 이것은 전형적인 오류로서, 다음의 예시에 의해 입증된다.
```cpp
class MyClass
{
public:
    MyClass (int y);  // declaration a non-default constructor

private:
    int x;
};

MyClass :: MyClass (int y)
{
    x = y;
}

int main()
{
    MyClass m(100);     // the non-default constructor is called
    MyClass * p;        // for pointer declarations, the compiler does not need to know about constructors
    p = new MyClass();  // error at compilation: no default constructor
    return 0;
}
```
프로그래머와 컴파일러 모두 기본 생성자를 정의하지 않았기 때문에, 이 생성은 오류가 된다.

반면 C++11에서 기본 생성자는 명시적으로 생성될 수 있다:
```cpp
class MyClass
{
public:
    MyClass () = default;  // force generation of a default constructor
};
```

```cpp
class MyClass
{
public:
    MyClass () = delete;  // prevent generation of default constructor
};
```



## 각주

분류:객체 지향 프로그래밍
분류:제어 흐름
분류:프로그래밍 구성체
분류:메소드 (컴퓨터 프로그래밍)