기본 생성자
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
기본 생성자는 C++, Java, C# 등 프로그래밍 언어에서 클래스의 객체를 초기화하는 데 사용되는 특수한 생성자이다. C++에서는 인자 없이 호출될 수 있는 생성자를 기본 생성자로 정의하며, 컴파일러가 명시적으로 정의된 생성자가 없을 경우 암묵적으로 생성한다. C++11부터는 `= default`와 `= delete`를 사용하여 기본 생성자의 생성을 제어할 수 있다. Java와 C#에서는 클래스에 생성자가 정의되지 않은 경우 컴파일러가 자동으로 생성하는 무인자 생성자를 기본 생성자라고 한다.
C++컴파일러는 클래스에 명시적으로 정의된 생성자가 없을 때 기본 생성자를 암묵적으로 선언하고 정의한다. 이 암묵적으로 정의된 기본 생성자는 빈 바디와 함께 명시적으로 정의된 것과 동일하다.[7] 만약 클래스에 명시적으로 정의된 생성자가 있지만, 모두 기본 생성자가 아니라면, 컴파일러는 암시적으로 기본 생성자를 정의하지 않는다. 이는 클래스가 기본 생성자를 갖지 않는 상황으로 이어진다.[7]
자바와 C#에서 기본 생성자는 클래스에 생성자가 정의되지 않은 경우 컴파일러가 자동으로 생성하는 무인자 생성자이다.[4][5]
2. C++
C++에서 기본 생성자는 다음과 같은 특정 상황에서 자동적으로 작동되므로 중요하다.
프로그래머와 컴파일러 모두 기본 생성자를 정의하지 않으면, 객체 생성 시 오류가 발생한다.[7]
C++11에서는 `= default`를 사용하여 기본 생성자를 명시적으로 생성하거나, `= delete`를 사용하여 명시적으로 금지할 수 있다.
2. 1. 기본 생성자의 정의와 호출
C++ 표준에서는 인자 없이 호출할 수 있는 생성자를 기본 생성자로 정의한다.[6] 여기에는 모든 매개변수에 기본값이 있는 생성자도 포함된다.[6]
예를 들면 다음과 같다.
```cpp
class MyClass
{
public:
MyClass(); // 생성자 선언
private:
int x;
};
MyClass::MyClass() : x(100) // 생성자 정의
{
}
int main()
{
MyClass m; // 런타임에 객체 m이 생성되고 기본 생성자가 호출됨
}
```
위의 코드에서 `MyClass()`는 인자가 없는 기본 생성자이다.
메모리를 동적으로 할당할 때, 클래스 이름 뒤에 괄호를 추가하여 기본 생성자를 명시적으로 호출할 수 있다.
```cpp
int main()
{
MyClass * pointer = new MyClass(); // 런타임에 객체가 생성되고 기본 생성자가 호출됨
}
```
생성자에 하나 이상의 매개변수가 있지만, 모두 기본값을 가지는 경우도 기본 생성자에 해당한다.
```cpp
class MyClass
{
public:
MyClass (int i = 0, std::string s = ""); // 생성자 선언
private:
int x;
int y;
std::string z;
};
MyClass::MyClass(int i, std::string s) // 생성자 정의
{
x = 100;
y = i;
z = s;
}
```
위의 코드에서 `MyClass (int i = 0, std::string s = "")`는 모든 매개변수가 기본값을 가지므로 기본 생성자이다.
2. 2. 기본 생성자의 중요성
C++에서 기본 생성자는 특정 상황에서 자동으로 호출되기 때문에 중요하다. 이러한 상황에서 클래스에 기본 생성자가 없으면 오류가 발생한다. 기본 생성자가 필요한 경우는 다음과 같다.
클래스에 명시적으로 정의된 생성자가 없다면, 컴파일러는 기본 생성자를 암묵적으로 선언하고 정의한다. 이 암묵적으로 정의된 기본 생성자는 빈 몸체와 함께 명시적으로 정의된 것과 동일하다.[7]
클래스에 명시적으로 정의된 생성자가 있지만, 모두 기본 생성자가 아니라면, 컴파일러는 암시적으로 기본 생성자를 정의하지 않는다. 이는 클래스가 기본 생성자를 갖지 않는 상황으로 이어져 오류를 발생시킨다.[7]
2. 3. 컴파일러에 의한 기본 생성자 자동 생성
C++에서 클래스에 명시적으로 정의된 생성자가 없는 경우, 컴파일러는 자동으로 기본 생성자를 생성한다.[7] 이 암묵적으로 정의된 기본 생성자는 빈 몸체(body)를 가진 명시적으로 정의된 생성자와 동일하다.
```cpp
class MyClass
{
int x; // 생성자가 없으므로 컴파일러는 (암시적) 기본 생성자를 생성합니다.
};
int main()
{
MyClass m; // 런타임 오류 없음: (암시적) 기본 생성자가 호출됩니다.
}
```
반면, 클래스에 명시적으로 정의된 생성자가 있지만 모두 기본 생성자가 아닌 경우, 컴파일러는 암시적으로 기본 생성자를 정의하지 않는다. 이는 클래스에 기본 생성자가 없는 상황을 초래하며, 흔히 오류로 이어진다.[7]
```cpp
class MyClass
{
public:
MyClass (int y); // 비-기본 생성자 선언
private:
int x;
};
MyClass::MyClass (int y)
{
x = y;
}
int main()
{
MyClass m(100); // 비-기본 생성자가 호출됩니다.
MyClass * p; // 포인터 선언의 경우, 컴파일러는 생성자에 대해 알 필요가 없습니다.
p = new MyClass(); // 컴파일 시 오류: 기본 생성자 없음.
return 0;
}
2. 4. C++11에서의 기본 생성자 제어
C++11에서는 `= default`를 사용하여 기본 생성자를 명시적으로 생성할 수 있다.[6]
```cpp
class MyClass
{
public:
MyClass() = default; // 기본 생성자 생성을 강제합니다.
};
```
`= delete`를 사용하여 기본 생성자 생성을 명시적으로 금지할 수도 있다.[6]
```cpp
class MyClass
{
public:
MyClass() = delete; // 기본 생성자 생성을 방지합니다.
};
3. Java 및 C#
3. 1. Java 및 C# 기본 생성자의 특징
자바와 C# 모두에서 "기본 생성자"는 클래스에 대해 생성자가 정의되지 않은 경우 컴파일러가 자동으로 생성하는 무인자 생성자를 의미한다. 기본 생성자는 암묵적으로 상위 클래스의 무인자 생성자를 호출한 다음 빈 본문을 실행한다. 모든 필드는 초기값인 0(정수형), 0.0(부동 소수점형), `false` (boolean형) 또는 `null` (참조형)로 남겨둔다.[4][5] 매개변수가 없는 프로그래머가 정의한 생성자도 C#에서는 기본 생성자라고 부르지만, 자바에서는 그렇지 않다.[4][5]
참조
[1]
표준
C++ standard
ISO/IEC
[2]
서적
Computer Science A Structured Approach Using C++
[3]
서적
Computer Science A Structured Approach Using C++
[4]
웹사이트
Java Language Specification, 3rd edition, section 8.8.9
http://java.sun.com/[...]
[5]
웹사이트
Using Constructors (C# Programming Guide)
http://msdn.microsof[...]
[6]
표준
C++ standard
ISO/IEC
[7]
서적
Computer Science A Structured Approach Using C++
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com