기본 개념
OOP의 4가지 핵심 특징
1. Abstraction (추상화)
Encapsulation (캡슐화)
private 접근 지정자를 통해 구현Inheritance (상속)
Polymorphism (다형성)
virtual 키워드 사용, 런타임에 결정)메모리 정렬 예제
class Cat
{
public:
void Speak();
private:
double d8; // 8 bytes
int i4a; // 4 bytes
int i4b; // 4 bytes
};
메모리 크기 변화
위 코드의 경우: Cat 객체 크기 = 16 bytes

d8과 i4a의 선언 순서를 바꾸면: 24 bytes로 증가

Padding이 발생하는 이유
int (4 bytes) : 0, 4, 8, 12, 16, ... 주소에서 시작double (8 bytes) : 0, 8, 16, 24, 32, ... 주소에서 시작메모리 최적화 팁
#pragma pack 지시자로 패딩을 제어할 수도 있지만, 성능 저하가 발생할 수 있으므로 주의 필요False Sharing 문제

Cat arr[100]과 같은 배열이 있을 때 발생 가능Cat 객체가 24 bytes인 경우, 하나의 객체가 두 개의 캐시 라인에 나뉘어 저장될 수 있음alignas를 통한 해결
class alignas(32) Cat
{
// ...
};
1. Static Member Function (정적 멤버 함수)
Cat::StaticSpeak();
2. Static Member Variable (정적 멤버 변수)
class Cat {
static int count;
};
int Cat::count = 0; // 클래스 외부에서 초기화3. Static Variable in a Function (함수 내 정적 변수)
void func() {
static int count = 0; // 함수가 처음 호출될 때 초기화
count++;
}초기화 시점 비교
this의 역할
Static 멤버 함수의 제약
this 포인터가 존재하지 않음this를 통해 호출되기 때문this 포인터 활용
void SetName(string name) {
this->name = name; // 멤버 변수와 매개변수 구분
}Cat& SetAge(int age) {
this->age = age;
return *this; // 자기 자신을 반환
}inline 키워드
inline int Add(int a, int b) { return a + b; }
// 호출 시 → int result = a + b; 로 직접 삽입됨
const 키워드 (멤버 함수)
class Cat {
int age;
public:
int GetAge() const { return age; } // ✅ 읽기만 가능
void SetAge(int a) { age = a; } // ❌ const 객체는 호출 불가
};
const Cat kitty;
kitty.GetAge(); // ✅ OK
kitty.SetAge(5); // ❌ 컴파일 에러
constexpr 키워드
constexpr int Square(int x) { return x * x; }
int arr[Square(5)]; // 컴파일 타임에 arr[25]로 결정됨
// static member variable과 함께 사용
class Math {
static constexpr double PI = 3.14159; // 컴파일 타임 상수
};
const vs constexpr 비교
const: 런타임 또는 컴파일 타임 상수 (값 변경 불가)constexpr: 반드시 컴파일 타임 상수 (더 엄격함)const int a = 10; // 컴파일 타임 상수
const int b = GetValue(); // 런타임 상수 (함수 호출 결과)
constexpr int c = 10; // ✅ 컴파일 타임 상수
constexpr int d = GetValue(); // ❌ 컴파일 에러 (constexpr 함수여야 함)
코드없는 프로그래밍
C++ Classes and Objects