본문 바로가기
프로그래밍 언어/cpp

[C++] 클래스 기초와 생성자, 소멸자

by TyT. 2023. 2. 8.
반응형

클래스

C++와 C의 차이중 하나인 클래스를 알아보자. 여기서, 클래스에 대한 이론적 특징은 많이 다루지 않을 것이고, 필자는 대학 학부에서 Java를 배웠으므로 차이점과 사용방법에 중점을 둔다.

클래스 선언

class MyClass
{
...
};

기존 구조체에서 struct를 class로 바꾸기만 하면 된다.

접근 제한 지정자

private:
public:
protected:

자바에서 하는 기능과 동일하게 작동한다.

  • private: 클래스 외부에서 접근 제한
  • public: 클래스 외부에서 접근 허용
  • protected: 상속된 클래스에서 접근 허용

protected는 상속에서 조금더 다룰 예정이다.

자바에서는 멤버들 앞에 일일이 제한자를 적어주었지만 c++에선 <제한자:>밑으로 나오는 멤버들은 모두 앞서나온 제한자의 영향을 받는다.

멤버와 멤버함수(메소드)

public:
    int a;
    float b;
    void PrintA()
    {
        printf("A\n");
    }

제한자 다음 변수선언은 기존의 변수선언과 같고 멤버함수 또한 일반적으로 함수를 선언하듯 선언하면 된다.

생성자와 소멸자

public:
    //생성자
    MyClass()
        : a(1)
        , b(2)  //이니셜라이저
    {
        printf("생성");
    }
    //소멸자
    ~MyClass()
    {
        printf("소멸");
    }

자바에서는 이니셜라이져는 본적이 없는 것 같은데, c++에는 있었다. 변수를 초기화할때, 생성자 함수에서 초기화하지않고 이니셜라이저라는 과정에서 먼저 초기화를 하고, 생성자를 호출한다. 소멸자는 해당 클래스가 소멸할때 실행된다.

클래스 기본 예제

#include <stdio.h>

class Cls
{
    // 멤버
public: // 공개
    int a;
    float d;

private: // 비공개
    int b;

protected: // 상속된 클래스에겐 공개
    int c;

    // 생성자, 소멸자
public:
    // 생성자
    Cls()
        : a(1), b(2) // 이니셜라이져
    {
        printf("생성 a: %d\n", a);
    }
    // 소멸자
    ~Cls()
    {
        printf("소멸");
    }


public:
    // 멤버 함수(메소드)
    void PrintB()
    {
        printf("b: %d\n", b);
    }
};

int main()
{
    // 객체 생성
    Cls c;  // 생성자가 실행되고 <생성 a: 1> 이 출력됨

    // a가 정상적으로 초기화 됬는지 확인. b와 c는 클래스외부에서 접근이 불가능한 상황
    printf("메인 a: %d\n", c.a);
    // b는 외부에서 접근이 불가능 하지만, 메소드를 통해서 b를 출력함.
    c.PrintB();

    return 0;
    // 메인함수가 끝나면서, c라는 객체도 소멸하기 때문에 소멸자 호출됨.
}

예제 코드를 돌리면서 위의 글들을 읽어보면 이해하는데 도움이 될것이다.

추가)

자바에서 객체의 멤버에 접근할때 사용하는 this가 c++에도 있다.

this->a

구조체 포인터처럼 화살표를 사용하면 된다.

반응형