- 클래스와 객체
더보기
- 객체 지향 프로그래밍(Object-Oriented Programming, OOP)
클래스(설계도)를 통해 만들어진 객체(실체, Object, Instance, 개체)간의 상호작용을 구현하기 위한 프로그래밍.
ex) DNA(클래스)를 통해 사람 A(객체)와 사람 B(객체)가 태어났다(생성되었다).
사람 A가 사람 B에게 인사한다. 인사를 받은 사람 B가 사람 A에게 인사한다, …
이러한 상호작용을 구현하기 위한 프로그래밍. - 클래스(Class)
// Main.cpp
class 클래스명
{
public:
멤버변수자료형 멤버변수명;
반환자료형 멤버함수명(매개변수자료형 매개변수명) {}
};
int main(void)
{
클래스명 객체이름;
return 0;
} - C++에서 객체를 생성하는 두 가지 방법
// Main.cpp
#include <iostream>
class Human
{
public:
float Height;
float Weight;
};
int main(void)
{
Human Kim;
Human* Choi = new Human();
Kim.Height = 170.f;
Kim.Weight = 58.f;
Choi->Height = 173.f;
Choi->Weight = 80.f;
std::cout << '(' << Kim.Height << ", " << Kim.Weight << ')' << std::endl;
std::cout << '(' << Choi->Height << ", " << Choi->Weight << ')' << std::endl;
delete Choi;
Choi = nullptr;
return 0;
} - Human Kim;
객체 Kim은 스택 메모리에 생성됩니다.
지역변수이므로 생명주기가 함수와 같습니다. - Human* Choi = new Human();
힙 메모리에 공간이 동적 할당되면서 Human 객체가 생성됩니다.
포인터 Choi는 해당 Human 객체의 시작 메모리 주소를 담고 있게 됩니다.
주의할 점은 지역변수 Choi는 스택메모리, Human 객체는 힙메모리에 존재한다는 것입니다. - new를 사용한 뒤에는 반드시 delete를 씁시다.
메모리 릭 방지를 위해 delete 필수입니다.
C언어에서 malloc()/free()가 단짝이었던 것처럼, C++에서는 new/delete가 단짝입니다.
객체 생성 객체 소멸 MyVector* V = new MyVector(); delete V;
V = nullptr;MyVector* List = new MyVector[10]; delete[] List;
List = nullptr;
- 접근 제어자
더보기
- 접근 제어자(Access Modifier)
어디에서 접근 하느냐에 따라 접근을 제어해주는 키워드.
- public
어디에서나 접근 가능. - protected
자기 자신 클래스의 멤버 함수와 자식 클래스의 멤버 함수 내에서 접근 가능. - private
자기 자신 클래스의 멤버 함수에서만 접근 가능.
- public
- 기본 접근 제어자
C++에서 구조체를 선언 및 정의하고 접근 제어자를 안쓰면 기본적으로 public,
클래스를 선언 및 정의하고 접근제어자를 안쓰면 기본적으로 private 접근 제어자입니다.
- 생성자와 Initializer List
더보기
- 생성자(Constructor)
객체가 만들어질 때 자동으로 호출되는 함수.
내가 직접 호출하기도 하고(명시적 호출), 컴파일러가 호출하기도 합니다.(암시적 호출) - 초기화 리스트 (Initialization List)
객체가 생성되면서 초기화 하는 함수.
- 기본 생성자와 생성자 오버로딩
더보기
- 기본 생성자(Default Constructor)
클래스에 생성자가 없으면 컴파일러가 기본 생성자를 자동적으로 만들어 줍니다.
기본 생성자는 매개변수를 받지 않습니다.
생성자가 이미 정의 있는 경우에는 기본 생성자를 구현하지 않습니다. - 오버로딩
같은 이름이지만 매개변수 목록은 다르게 함수를 재정의하는 것.
뒤에서 다시 한 번 제대로 배우게 됩니다. 오버라이딩과는 다른 개념임에 주의합시다. - 생성자 오버로딩
생성자인데, 매개변수 목록을 다양하게해서 재정의 할 수 있습니다.
이를 생성자 오버로딩이라고 합니다.
Human(); // 생성자
Human(float InHeight, float InWeight); // 생성자 오버로딩. 매개변수 목록이 달라집니다.
Human Park(180.0f, 68.0f); // 매개변수 목록이 "최대한" 일치하는 생성자가 자동으로 호출됩니다.
- 소멸자
더보기
- 소멸자(Destructor)
객체가 소멸될 때 자동으로 호출되는 함수.
ex) delete 호출, 함수 종료에 따른 스택 프레임 반환, … - RAII(Resource Acquisition Is Initialization)
C++에서는 객체에게 필요한 자원을 생성자에서 획득하게끔하고,
소멸자에서 획득한 자원을 해제하도록 설계하는 것이 필수적입니다.
즉, 자원을 획득한 주체가 정리까지도 맡게끔 합니다.
이를 RAII라고 하며, C++ 메모리 관리의 핵심 철학입니다. - C언어에서의 malloc() / free() Vs. C++의 new / delete
가장 큰 차이점은 new / delete는 생성자 / 소멸자가 자동으로 호출된다는 점입니다
- const 멤버 함수
더보기
- const 멤버 함수
함수 내부에서 클래스의 멤버 변수를 수정하지 못하는 함수.
주로 출력만 하는 함수라던가 getter 함수에서 자주 쓰입니다. - 캡슐화와 Getter / Setter
OOP 원칙 중에는 캡슐화라는 것이 있습니다.
캡슐화란 객체의 멤버 변수를 외부에서 직접 접근 할 수 없게 만들어서 보호합니다.
꼭 필요한 경우, 읽고 싶을 때는 Getter 함수를 통해 읽고
쓰고 싶을 때는 Setter 함수를 통해 씁니다. - Getter / Setter의 장점
void SetCurrentHP(float InCurrentHP)
{
if (InCurrentHP < 0)
{
// 이와 같이, 들어온 값에 대한 예외처리를 할 수 있다는 장점이 있습니다.
return;
}
CurrentHP = InCurrentHP;
}
- 클래스 전방 선언과 friend 키워드
더보기
- 클래스 전방 선언
어떤 클래스가 “어딘가에는” 정의되어 있을 것이라고 컴파일러에게 알리는 구문.
이는 함수 전방 선언과 동일한 역할입니다. - friend 키워드
다른 클래스나 다른 함수에서 내 클래스의 private 혹은 protected 멤버에 접근 할 수 있게 허용해줍니다.
”베스트 프렌드(다른 클래스나 다른 함수)는 내 모든 걸 알고 있고 가져가도 된다!”
'복습용 > C++' 카테고리의 다른 글
| [Unreal Engine 8기] C++ std::string과 File I/O (0) | 2026.03.25 |
|---|---|
| [Unreal Engine 8기] C++ Casting, inline 키워드, static 키워드, 예외처리 (0) | 2026.03.24 |
| [Unreal Engine 8기] C++ 상속과 다형성, 추상 클래스 (1) | 2026.03.23 |
| [Unreal Engine 8기] C++ 복사 생성자와 오버로딩 (0) | 2026.03.20 |
| [Unreal Engine 8기] C++ Console IO (0) | 2026.03.18 |