본문 바로가기
Develop/C++

[C ++] 클래스 기본 문법

by J-rain 2023. 2. 3.

우선 클래스를 선언하는 문법은 다음과 같다.

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

댓글