1. class와 struct 차이

  • class와 struct는 매우 유사
  • 가장 큰 차이점은 class는 접근 제어 지시자가 있음
  • C++에서는 class, 상속 등의 문법을 통해 효율성을 제공


2. 클래스 기본 문법

  • 클래스는 멤버변수, 멤버함수로 구성
  • 접근제어지시자를 통해 멤버변수 및 멤버함수로의 접근을 제어할 수 있음
  • 생성자, 소멸자가 있음
  • 상속 및 다형성
class 클래스이름{
접근제어지시자:
  멤버변수
  멤버함수
};


3. 멤버 선언 및 초기화

  • 생성자를 이용하여 멤버변수 초기화
  • 멤버 이니셜라이저(member initializer)에 의한 초기화

생성자를 이용한 멤버변수 초기화

// 생성자를 이용한 멤버변수 초기화
#include <iostream>
using namespace std;

class CTest
{
public:
    int m_Data;

    // 생성자, 생성자는 객체 생성 시 멤버 변수의 초기화를 담당
    CTest()
    {
        m_Data = 10;
    }

    void PrintData()
    {
        cout << m_Data << endl;
    }

};

int main()
{
    CTest t;
    t.PrintData();

    return 0;
}


멤버 이니셜라이저를 이용한 멤버변수 초기화

#include <iostream>
using namespace std;

class CTest
{
public:
    int m_Data1;
    int m_Data2;

    // 멤버 이니셜라이저를 이용한 초기화
    CTest() : m_Data1(10), m_Data2(20)
    {
        // empty
    }

    void PrintData()
    {
        cout << m_Data1 << endl;
        cout << m_Data2 << endl;
    }

};


int main()
{
    CTest t;
    t.PrintData();

    return 0;
}


4. 접근 제어 지시자

  • 개발자와 사용자를 구분하기 위해 필요
  • 멤버변수에 아무나 접근할 수 없게 하기 위함 - 정보은닉(Information Hiding)
  • 접근 제어 지시자 종류
    • public - 멤버에 대한 모든 외부 접근 허용
    • protected - 멤버에 대한 모든 외부 접근 차단(단, 상속 관계에 있는 클래스에서의 접근 허용)
    • private - 외부 접근 뿐만 아니라 상속 클래스로부터의 접근까지 차단(C++에서는 명시하지 않으면 default로 private으로 간주)
#include <iostream>
using namespace std;

class CMyData
{
    // 접근제어지시자를 명시하지 않았기 때문에 private으로 간주
    int m_Data;
public:
    int GetData()
    {
        return m_Data;
    }

    void SetData(int nParam)
    {
        m_Data = nParam;
    }
};

int main()
{
    CMyData mydata;

    mydata.SetData(10);

    cout << mydata.GetData() << endl;

    return 0;
}


5. 생성자(Constructor), 소멸자(Destructor)

  • 객체의 생성과 소멸시 호출되는 일종의 함수
  • 클래스 이름과 동일하며 소멸자의 경우 이름 앞에 ~ 붙음
  • 생성자와 소멸자를 구현하지 않을 경우 컴파일러가 자동으로 Default 생성자와 소멸자 생성
#include <iostream>
using namespace std;

class CTest
{
public:

  // 생성자(Constructor)
  CTest()
  {
      cout << "CTest::CTest()" << endl;
  }

  // 소멸자(Destructor)
  ~CTest()
  {
      cout << "~CTest::CTest()" << endl;
  }
};

// 전역변수 위치에서 객체를 생성

CTest b;

int main()
{
  cout << "Begin" << endl;
//    CTest a;
  cout << "End" << endl;

  return 0;
}
  • 생성자와 소멸자의 호출 시점을 잘 알고 있어야 함
  • 객체 생성시 생성자 호출, main()함수 종료시 소멸자 호출
  • 단, 전역 위치에 객체를 생성한 경우 main()함수보다 먼저 생성자가 호출 됨
  • 생성자는 오버로딩 가능, 소멸자는 오버로딩 불가능


본 포스팅 내용은 이것이 C++이다를 학습한 내용을 바탕으로 요약한 글입니다. 코드에 문제가 있을 수 있으며 다소 부정확한 내용이 있을 수 있으니 참고하시기 바랍니다. 잘못된 내용이 있다면 덧글로 남겨주시면 내용을 반영하여 수정하도록 하겠습니다. 감사합니다.



[Reference]

[1] 이것이 C++이다, p.99-124