본문 바로가기
공부/C++

C++ Class

by 떈구 2025. 3. 7.

Class란?

클래스는 객체지향 프로그래밍(OOP)에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀이다. 객체를 정의하기 위한 메소드와 변수로 구성됨.

 

1. 접근 제한 지정자

C++ 클래스는 public, protected, private 접근 지정자를 사용하여 멤버 변수와 함수를 보호함.

 

(1) 접근 지정자별 설명

class Example {
private:
    int privateVar; // 클래스 내부에서만 접근 가능

protected:
    int protectedVar; // 상속받은 클래스에서 접근 가능

public:
    int publicVar; // 어디서든 접근 가능
};

 

기본적으로 아무것도 사용하지 않는다면 private로 진행이된다.


2. 클래스의 기본 기능

C++ 클래스는 몇 가지 기본 기능을 자동으로 제공함.

    • 기본 생성자(Default Constructor)
    • 기본 소멸자(Default Destructor)
    • 기본 복사 생성자(Default Copy Constructor)
    • 기본 대입 연산자(Default Assignment Operator)
    • 이동 생성자(Move Constructor, C++11)
    • 이동 대입 연산자(Move Assignment Operator, C++11)

(1) 클래스 선언과 객체 생성

class MyClass {
public:
    int data;
    void Print() {
        std::cout << "Data: " << data << std::endl;
    }
};

int main() {
    MyClass obj;
    obj.data = 10;
    obj.Print(); // Data: 10 출력
}

(2) 기본 생성자와 소멸자

class MyClass {
public:
    MyClass() { std::cout << "기본 생성자 호출" << std::endl; }
    ~MyClass() { std::cout << "소멸자 호출" << std::endl; }
};

int main() {
    MyClass obj; // 기본 생성자 호출됨
} // obj가 스코프를 벗어나면서 소멸자 호출됨

(3) 기본 복사 생성자와 대입 연산자

class MyClass {
public:
    int value;
    
    MyClass(int val) : value(val) {}
};

int main() {
    MyClass obj1(10);
    MyClass obj2 = obj1; // 기본 복사 생성자 호출
    obj2.value = 20; // obj1과는 별개의 객체
}

(4) 이동 생성자와 이동 대입 연산자 (C++11)

class MyClass {
public:
    int* data;
    
    MyClass() { data = new int(0); }
    ~MyClass() { delete data; }
    
    // 이동 생성자
    MyClass(MyClass&& other) noexcept {
        data = other.data;
        other.data = nullptr;
    }
};

 


 

3. 부모와 자식 관계 (상속)

class Parent {
public:
    void SayHello() { std::cout << "Hello from Parent" << std::endl; }
};

class Child : public Parent {
};

int main() {
    Child obj;
    obj.SayHello(); // Hello from Parent 출력
}

4. 버추얼 오버라이드와 가상 함수 테이블

(1) 가상 함수

class Base {
public:
    virtual void Print() { std::cout << "Base" << std::endl; }
};

class Derived : public Base {
public:
    void Print() override { std::cout << "Derived" << std::endl; }
};

int main() {
    Base* ptr = new Derived();
    ptr->Print(); // Derived 출력
    delete ptr;
}

(2) 가상 함수 테이블 (VTable)

가상 함수가 있는 클래스는 **가상 함수 테이블(VTable)**을 가짐. 객체가 가상 함수를 호출하면 VTable을 통해 올바른 함수를 찾음.

5. 클래스의 메모리 크기

(1) 멤버 변수가 없을 때

class Empty {};
std::cout << sizeof(Empty) << std::endl; // 일반적으로 1바이트 (객체 구분을 위한 최소 크기)

(2) 가상 함수가 있을 때

class VirtualClass {
    virtual void func();
};
std::cout << sizeof(VirtualClass) << std::endl; // 일반적으로 8바이트 (가상 함수 테이블 포인터 포함)

(3) 포인터 멤버가 있을 때

class PointerClass {
    int* ptr;
};
std::cout << sizeof(PointerClass) << std::endl; // 8바이트 (포인터 크기)