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바이트 (포인터 크기)
'공부 > C++' 카테고리의 다른 글
C++ 포인터와 레퍼런스 (0) | 2025.03.07 |
---|---|
C++ 함수에 대한 이해와 메모리 구조 (0) | 2025.03.07 |
변수의 선언과 초기화 & 메모리 할당 과정 (0) | 2025.03.05 |
기본 - C++ 프로그램의 메모리 구조 (0) | 2025.03.05 |
기본 - 컴파일러 (0) | 2025.03.05 |