C++/C++ 기본

생성자

검정비니 2018. 7. 4. 17:00
728x90
반응형

성자



1. 생성자란?


객체를 생성할 때에 객체 그 자체와 객체의 멤버 변수등을 초기화 시켜줄 필요가 있다. C++에서 클래스는 객체가 생성될 때 자동으로 실행되는 생성자(constructor)라는 특별한 멤버 함수를 가지고 있다. 이 생성자를 사용하게 되면 객체를 생성할 수 있으며, 생성과 동시에 객체를 초기화 시켜 줄 수가 있다. 또한, 생성자를 이용해서 객체의 멤버 변수들을 원하는 값으로 초기화 시켜 줄 수도 있다. 한 클래스에 여래 개의 생성자를 넣을 수 있다. 그러나, 객체를 생성할 때에는 그 중에 오직 하나만 사용해서 생성한다. 어떤 생성자를 사용할 지는 객체를 생성할 때에 직접 선택할 수 있다.


i.e.

class Circle {

......

Circle(); //생성자의 이름은 클래스의 이름과 동일하다. 또한 생성자는 리턴 타입을 지정하면 안된다.

Circle(int r); //매개변수의 타입과 개수를 다르게 함으로써 여러 개의 생성자를 하나의 클래스 내에 넣을 수 있다.

......

};


Circle::Circle() { //매개 변수가 없는 생성자

......

}


Circle::Circle(int r) { //매개 변수가 하나 있는 생성자 (int 형)

.......

}


생성자의 특징을 정리해보자.



- 생성자의 목적은 객체가 생성될 때 필요한 초기 작업을 위함이다.


예를 들어 멤버 변수의 값을 특정 값으로 설정하거나, 메모리를 동적 할당 받거나, 파일을 열거나, 네트워크를 연결하는 등 객체를 사용하기 전에 필요한 조치를 할 수 있도록 하기 위함이다.


- 생성자 함수는 오직 한 번만 실행된다.


생성자 함수는 각 객체마다 객체가 생성되는 시점에 오직 한 번만 자동으로 실행된다.


- 생성자 함수의 이름은 클래스 이름과 동일하게 작성되어야 한다.


생성자 함수의 이름은 반드시 클래스 이름과 동일하게 작성되어야 한다. 이로 인해 생성자는 다른 멤버 함수와 쉽게 구분된다.


- 생성자 함수의 원형에 리턴 타입을 선언하지 않는다.


생성자는 함수이지만 리턴 타입을 선언해서는 안 된다. void 리턴 타입을 설정해서도 안 된다. 만약 생성자에 리턴 타입을 선언할 경우, 컴파일 오류가 발생하게 된다.


- 생성자는 중복 가능하다.


생성자는 한 클래스에 여러 개 만들 수 있다. 이 경우, 생성자 함수들은 이름이 모두 같기 때문에, 매개 변수 개수나 타입이 서로 다르게 선언되어야 한다.




2. 객체 생성과 생성자 실행


다음 예제 코드를 통해서 생성자를 사용해서 객체를 생성하는 방법에 대해서 알아보도록 하자.


i.e.

#include <iostream>

using namespace std;


class Circle {

public:

int radius;

Circle(); //기본 생성자 (매개 변수 없는 생성자를 기본 생성자라고 한다!)

Circle(int r); //매개 변수 있는 생성자

double getArea();

};


Circle::Circle() {

radius = 1; //반지름 값 초기화

cout << "반지름 값 초기화: 1" << endl;

}


Circle::Circle(int r) {

radius = r; //반지름 값 초기화

cout << "반지름 값 초기화: " << r <<endl;

}


double CIrcle::getArea() {

return 3.14 * radius * radius;

}


int main() {

Circle donut; //기본 생성자로 객체 생성

double area = donut.getArea();

cout << "면적은 " << area << endl;


Circle pizza(30); //매개 변수 있는 생성자로 객체 생성

area = pizza.getArea();

cout << "면적은 " << area << endl;

}



위의 예시 코드를 통해 알 수 있듯이, "Circle donut;"이라는 문장을 실행시키면, Circle() 생성자가 호출이 되어 donut이라는 이름의 객체를 생성한다. 기본 생성자를 사용하였기에, 이 객체의 반지름은 1이 된다. 비슷하게, "Circle pizza(30)"이라는 문장이 호출 될 때에는 Circle(int r) 생성자가 호출이 되어 매개 변수로 주어진 30을 반지름으로 하는 Circle 타입의 객체 pizza를 생성한다.



3. 생성자는 꼭 있어야 하는가?


이 시점에서 한 가지 의문점이 생기게 될 것이다. 클래스에 생성자는 꼭 있어야 할까? 답은 '꼭 있어야 한다' 이다. 그렇다면, 개발자가 클래스에 생성자를 넣지 않으면 컴파일 오류가 생기는가? 이 질문의 대답은 '안 생긴다'이다. 생성자가 꼭 있어야 하면서 안 넣어도 된다니 뭔가 이상하게 들릴 것이다. 그러나, 이것은 사실이다. 개발자가 따로 생성자를 만들지 않을 경우, 컴파일러가 자동으로 기본 생성자를 만들어서 클래스에 삽입한다. 이 생성자의 경우 객체의 초기화만 할 뿐, 멤버 변수등의 초기화는 따로 해주지 않는다. 또한 참고로, 컴파일러가 기본 생성자를 자동으로 삽입한다고 해서 개발자가 작성한 소스 코드가 변경되어 저장되는 것은 아니다. 컴파일러가 생성한 기본 생성자와 관련된 내용은 컴파일된 목적 파일에 들어가게 된다.

반응형

'C++ > C++ 기본' 카테고리의 다른 글

접근 지정  (0) 2018.07.07
소멸자  (0) 2018.07.04
객체 생성과 객체 활용  (0) 2018.07.02
c++ 클래스 만들기  (0) 2018.07.02
C++ 클래스와 객체  (0) 2018.07.02