우선 클래스를 선언하는 문법은 다음과 같다.
class 클래스이름
{
접근제어지시자;
멤버변수선언;
멤버함수선언및정의;
};
C언어의 구조체를 선언하는 것과 가장 크게 다른 점은 '접근 제어 지시자'의 등장과 함수를 멤버로 포함할 수 있게 되었다는 것이다.
#include <iostream>
using namespace std;
class RAIN
{
public :
// 멤버 변수 선언
int Age;
char name[32];
// 멤버 함수 선언 및 정의
void Print(void)
{
// Age와 name은 Print() 함수의 지역 변수가 아니다!
printf("%d, %s\n", Age, name);
}
};
int main(void)
{
RAIN rain = { 10, "길동" };
rain.Print();
return 0;
}
실행결과
접근제어지시자에 대해 자세히 알아보려면 링크 클릭 => https://j-ra1n.tistory.com/entry/%EC%A0%91%EA%B7%BC-%EC%A0%9C%EC%96%B4-%EC%A7%80%EC%8B%9C%EC%9E%90
위의 예제와 같이 클래스 멤버 변수는 구조체와 비교했을 때 선언하는 방법이나 사용하는 이유가 크게 다르지 않다. 하지만 '생성자'를 이용해 초기화 할 수 있다는 점에서 큰 차이가 생긴다.
- "반환 자료형이 없다"
- "호출하는 함수가 아니라 적절한 시기에 내부에서 자동으로 호출되는 함수"
#include <iostream>
using namespace std;
class RAIN
{
public:
// RAIN 클래스의 '생성자 함수' 선언 및 정의
RAIN()
{
// 인스턴스가 생성되면 멤버 데이터를 '자동으로' 초기화한다.
Data = 10;
}
// 멤버 데이터 선언
int Data;
// 멤버 함수 선언 및 정의
void Print(void)
{
// 멤버 데이터에 접근하고 값을 출력한다.
cout << Data << endl;
}
};
int main(void)
{
RAIN r; // 8번행 생성자 호출
r.Print();
return 0;
}
실행결과
C++11에서부터 멤버 변수를 초기화하는 방법이 추가됐다.
#include <iostream>
using namespace std;
class RAIN
{
public :
//생성자 초기화 목록을 이용한 멤버 초기화
RAIN() { }
// c++11부터 선언과 동시에 멤버 변수를 초기화 가능!
int Data1 = 10;
int Data2 = 20;
void PrintData(void)
{
cout << Data1 << endl;
cout << Data2 << endl;
}
};
int main(void)
{
RAIN r;
r.PrintData();
return 0;
}
실행결과
제작자가 적절한 값을 작성할 수 있게 해줌으로 버그를 차단할 수 있다. 또한 사용자는 매우 편리하게 객체를 사용 가능하다.
참조 형식 멤버 초기화
클래스의 멤버 변수는 참조 형식으로도 선언할 수 있다. 단, 참조자는 반드시 선언과 동시에 초기화 해야한다.
#include <iostream>
using namespace std;
class RAIN
{
public :
// 참조형 멤버는 반드시 생성자 초기화 목록을 이용해 초기화한다.
RAIN(int &Param) : Data(Param) { };
int GetData(void) { return Data; }
private :
// 참조형 멤버는 객체가 생성될 때 반드시 초기화해야 한다.
int &Data;
};
int main(void)
{
int a = 10;
RAIN r(a);
cout << r.GetData() << endl;
// 참조 원본인 a의 값이 수정되었다.
a = 20 ;
cout << r.GetData() << endl;
return 0;
}
실행결과
Q. 만약 8번행을 RAIN(int &Param) { Data = Param ; }; 으로 초기화를 시도하면 어떻게될까?
A. 안타깝지만 불가하다 여기서 =는 단순 대입 연산자이기에 선언 및 정의가 아니고 이미 선언된 인스턴스를 이용해서 연산하는 것에 불과하다.
Q. 8번행을 RAIN(int Param) : Data(Param) { }; 로 작성하게되면 어떻게될까?
A. 쓰레기 값으로 보이는 결과가 출력되는 것을 확인할 수 있다. 함수의 매개변수는 함수 내부의 자동 변수와 같으므로 함수가 반환될 때 매개변수는 소멸된다.
'Develop > C++' 카테고리의 다른 글
[C ++] 생성자와 소멸자 (0) | 2023.02.03 |
---|---|
[C ++] 접근 제어 지시자 (0) | 2023.02.03 |
[C ++] Namespace 와 using (0) | 2023.02.02 |
[C ++] 식별자 검색 순서 (0) | 2023.02.02 |
[C ++] 템플릿(Template) (1) | 2023.02.02 |
댓글