이전 글인
2020/07/10 - [기타 공부/C++] - [C++] 클래스 기본 동작 개념
에서 총 5단계로 나누었다.
1. 생성
2. 준비
3. 사용
4. 해제
5. 삭제
여기서 우리는 1. 생성과 2. 준비에 대해서 알아보겠다.
보기 편하게 [1. 생성 단계] [2. 준비 단계] 처럼 단계를 표현하겠습니다.
이렇게 완전 구분해서 안 외워도 됌. 흐름을 이해하려고 개념적으로 구분했음.
생성자란? Constructor
객체가 처음 생성될 때 호출된다.
클래스명과 똑같이 이름을 지어야 한다.
#include <iostream>
class C_TEST
{
private:
int m_nData;
public:
C_TEST(); // 생성자 선언입니다.
void setData(int nData);
void getData(int *pData);
};
// 생성자 구현입니다.
C_TEST::C_TEST()
{
printf("생성자 호출");
}
int main()
{
C_TEST cData{}; // 생성자가 호출됩니다.
}
기본적으로 제공되는 생성자
생성자는 직접 선언하지 않아도 기본적으로 선언된다.
기본 생성자는 2가지로 제공이 된다.
생성자를 하나라도 선언하게 되면 기본 생성자 2개는 사라진다.
#include <iostream>
class C_TEST
{
private:
int m_nData;
public:
void setData(int nData);
void getData(int *pData);
};
int main()
{
// 클래스를 5단계로 나누었을 때
C_TEST cData1; // [1. 생성 단계]
C_TEST cData2{}; // [1. 생성 단계] + [2. 준비 단계]
}
클래스 안에 존재하는 멤버 변수도 모두 클래스로 구현되어 있으므로,
[1. 생성 단계] [2. 준비 단계]를 거치도록 만들어주자.
멤버 변수의 [1. 생성 단계] [2. 준비 단계]도 {} 를 사용해서 생성자 옆에 표기한다.
// 그냥 생성자
C_TEST::C_TEST()
{
printf("생성자 호출");
}
// 변수도 초기화하는 생성자
C_TEST::C_TEST() :
m_nData{} // (이 변수도 [1. 생성 단계] [2. 준비 단계]를 거친다.)
{
// 이 부분은 이미 m_nData 와 같은 멤버 변수들은 메모리가 다 잡혀있다.
// 그러므로 여기서는 {}를 이용한 초기화가 불가능하다.
printf("생성자 호출");
}
클래스를 {} 를 이용해서 선언하고,
생성자에 멤버 변수의 준비 {} 까지 넣으면 깔끔하게 클래스를 생성할 수 있다.
생성자에 인자가 하나일 때는 explicit 키워드를 사용
explicit 키워드를 사용하면
생성자에 들어오는 값을 자동으로 형변환하는 것을 막아준다. 의도치 않은 버그 방지.
#include <iostream>
class C_TEST
{
private:
int m_nData;
public:
explicit C_TEST(int nData); // 생성자에 인자가 하나일 때는 explicit 키워드를 사용하자.
};
int main()
{
C_TEST cTest(10); // = 10으로 대입하지말자 ( <- c언어 프로그래밍 방식이었다.)
printf("%d\n", cTest.getData());
}
생성자에 인자를 받으면 클래스 간의 조립이 힘들다
A를 생성할 때, B가 필요하다면
우린 A를 생성하기 전에 반드시 B를 만들어놓아야 한다.
이런 방식이 여러 개가 있다면 프로그래머는 이런 클래스들의 구조를 외워서 사용해야한다.....
그러므로 우리는 생성자에 값을 받아 초기화하지 않고, init 함수를 따로 만들어서 생성과 초기화를 분리할 것이다.
#include <iostream>
class C_TEST
{
private:
int m_nData;
public:
void init(int nData);
};
int main()
{
C_TEST cTest{}; // [1. 생성 단계] [2. 준비 단계]
cTest.init(100); // [2. 준비 단계 (값 세팅 부분만 분리)]
printf("%d\n", cTest.getData()); // [3. 사용 단계]
}
void C_TEST::init(int nData)
{
m_nData = nData;
}
우리는 다른 사람이 만든 Class를 사용할 때,
init 함수가 있다면 꼭 [3. 사용 단계] 전에 호출하여 초기화할 수 있도록 하자.
init 함수가 있는 데, 호출 안하고 버그나면 그 사람의 실수이다.
'기타 > C++' 카테고리의 다른 글
[C++] 참조자 (reference), 포인터와의 차이 (0) | 2020.12.23 |
---|---|
[C++] 동적 할당과 메모리 해제 (0) | 2020.12.17 |
[C++] 클래스 기본 동작 개념 (0) | 2020.07.10 |
[C++] 클래스 기본 문법 / 클래스와 구조체의 차이 (0) | 2020.06.06 |
[C++] 네임스페이스 (0) | 2020.06.06 |