객체 지향 프로그래밍에 개념에 이어, 생성자와 클래스, 접근제어에 대해 살펴본다.
변수는 초기화를 하지 않으면 쓰레기 값을 가지는 경우가 있다. 객체 또한 동일하다.
따라서 객체도 초기화를 반드시 해야한다. 여기서 객체의 초기화는 멤버 변수의 값을 초기화하는 것뿐만 아니라 객체의 동작에 필요한 메모리 공간이나 기타 자원들을 할당하는 것도 포함된다.
생성자는 초기화를 담당하는 함수이며, 객체의 생성과 초기화가 동시에 가능하다.
다음 코드로 이해해보자
#include <iostream>
using namespace std;
class Time {
public:
int hour; // 시를 나타낸다. 0-23가 가능하다.
int minute; // 분을 나타낸다. 0-59가 가능하다.
void print() {
cout << hour << ":" << minute << endl;
}
};
Time a; // 객체 a를 생성한다.
a.hour = 26;
a.minute = 70;
위 코드에 생성자를 만들면 다음과 같다.
class Time {
public:
int hour; // 0-23
int minute; // 0-59
Time(int h, int m) {//생성자
hour = h;
minute = m;
}
void print() {
cout << hour << ":" << minute << endl;
}
};
위 코드를 통해 생성자는
생성자의 호출은 다음과 같다.
값이 주어지지 않는다면 컴파일오류가 발생한다.
Time a; // ① 오류이다! 초기화값이 없다!
Time b(10, 25); // ② OK 하지만 예전의 방법이다.
Time c { 10, 25 }; // ③ OK 최신의 방법이다.
Time d = { 10, 25 }; // ④ OK 하지만 간결하지 않다.
생성자는 같은이름으로 여러 개를 만들 수 있다. 다음 코드를 보자
#include <iostream>
using namespace std;
class Time {
public:
int hour; // 0-23
int minute; // 0-59
Time() {
hour = 0;
minute = 0;
}
Time(int h, int m) {
hour = h;
minute = m;
}
/*위 두 생성자를 하나의 생성자로 작성한 방법
Time(int h=0, int m=0) {
hour = h;
minute = m;
}
*/
void print() {
cout << hour << ":" << minute << endl;
}
};
파라미터가 1개인 생성자와 파라미터가 2개인 생성자는 이름이 같지만 실행은 다르다.