C++ 문법 2-1 강 마무리, 2-2 강, 2-3 강, C++ 복습 세션
==========
C++문법 2-1 강
힙이 스택보다 큰 저장소 크기를 가진다.
동적으로(동작하는 동안) 메모리 할당(heap)
dnagling pointer - 한 주소를 여러 포인터가 가리키는데 다른 포인터가 주소 값을 해제했을 때 일어나는 나머지 포인터.
메모리 누수(Memory Leak)
unique_ptr - 객체의 소유권을 명확히(혼자 소유함)하고 이전(move)할 수 있다.
shared_ptr - 둘 이상의 객체가 서로를 참조할 수 있고 이를 레퍼런스 카운트로 관리하지만 순환 참조가 발생해 누수를 일으킬 수 있다.
weak_ptr - 순환 참조가 발생했을 때 하나를 이것으로 변경하면 관찰만 하므로 순환 고리가 끊어진다.(읽기 전용)
사용할 때 .lock() 을 사용해 유효한 상태(이미 소유자가 있는지)를 확인하고 사용해야 한다.
얕은 복사 / 깊은 복사 - 그냥 복사/새로운 주소를 할당해 복사
언리얼 - 가비지 컬렉션 시스템 - root(반드시 실행 중이어야 하는 부분)를 통해 연결되어 있는 것들을 마킹하고 그 의 것들을 메모리에서 지우는 시스템.
언리얼 - 리플렉션
UNT - 언리얼 엔진 툴
UCLASS() - 리플렉션으로 클래스임을 정의.....
UPROPERTY() / UFUNCTION() / USTRUCTURE() / GENERATED_BODY() -일단 알아 만 두자
====================
C++문법 2-2 강
함수 오버로딩
C 에서는 함수 이름이 같으면 같은 함수
C++ 에서는 반환 타입/이름/인자를 가지고 고유한 이름을 지녀서 다른 함수로 구분함. 네임 맹글링
오버로딩이 되지 않는 경우.
타입 변환이 가능한 매개변수로 인해 후보가 둘 이상이 될 경우
디폴트 매개변수로 인해 호출 형태가 중복되는 경우
타입만 포인터와 배열로 다른 경우 - 이건 같은 함수로 컴파일러가 판단해버린다.
오버로딩 순서
정확한 매칭 -> 2. 타입 승격 변환 -> 3. 표준 타입 변환 -> 4. 사용자 정의 타입 변환
2. char || short -> int / float -> double / bool -> int
용량이 작은 곳이 아니라 큰 곳으로 '승격'변환 한다는 것.
3. int -> double / double -> int / double -> float
손실이 있을 수 있지만 전환은 가능하다.
4번은 그런 게 있다고 만 알면 된다.
템플릿
함수 정의
template<typename T>
void || T Name(T a, T b) - 반드시 타입이 정해져야 하지도 않는다.
클래스도 템플릿으로 일반화할 수 있다.
===============================
C++ 문법 2-3 강
STL - Standard Template Library
#include <vector>
벡터는 배열과 유사하게 동작한다.
뒤에 넣는 동작은 O(1) 이지만 맨 앞을 삽입/삭제하면 O(N)이므로 비효율 적이다.
vector<int> vec1 = {1, 2, 3} -> int형 벡터 3크기
vector<vector<int>> vec 2D(3, vector<int>(4, 7));

for (int num : vec) { //vec의 원소를 순차적으로 int 형 num 에 대입한다. : -의 문법
cout << num << " " ;
}
pop_back - 벡터의 가장 뒤 원소를 제거
====================
문제를(요구 사항) 코드로 변환하는 방법 설명
유효성 검사 - 써도 되는 값, 받으면 문제가 되는 값이 들어오는지 검사하는 것.
시작부터 끝까지 사용되는 데이터는 생성자에서 적어주는 것이 좋다.
주석 단축키 - 컨트롤 +K /+C (주석으로 변환) 컨트롤 +K / + U (주석 해제)
===
조사식
기억이 안 난다 잘 모르겠다 - 다시 쳐보는 것도 좋다.
=====
gpt 개념 설명
인덱스 - 0부터 시작하는 내용물의 값
배열 arr[3] = {1,2,3} 의 인덱스 0은 1이다.
인덱스는 포인터 연산으로 처리된다.(은연중에 알던 사실)
int main() 은 약속된 시작 함수로 OS가 main을 찾아 시작하게 설정되어있기 때문에 main이 없으면 그냥 동작하지 않고 에러가 생긴다.
std::endl; 은 \n 의 역할을 함과 동시에 flus를 하는 역할을 하는데 이 때문에 성능 저하를 불러올 수 있다.
flus란 출력 버퍼에 쌓여있던 내용을 지금 당장 출력(화면이나 파일로)하는 것.
using namespace std; 에는 내용물이 너무 많기 때문에 실무에서는 std:: 로 사용한다.
- 가시성 확보/필요없는 std 내용물 미사용/사용하지 않을 내용이 불러일으킬 버그 방지 등
헤더에서 반드시 지켜야 할 절대 규칙
1. .h 에 절대 using namespace std; 를 포함하지 마라.
2. 헤더에 정의를 두지 마라.
예외 - inline 함수[중복 허용], constexpr(컴파일 타임 상수?), 템플릿(이건 헤더에 정의 해야 함), 클래스 멤버 함수(일반적으로 헤더에 정의함)
3. 전역 변수 정의를 하지 마라.
int g_value = 10; X -> int g_value;
4. #pragma once 필수(이건 VS에선 자동으로 생성해준다.)
5. include 를 최소화해야 한다.
6. 독립적으로 include 가능해야 한다.
7. main이 존재해선 안된다.(구조가 붕괴됨)
extern은 이 변수(함수)는 다른 파일에 정의되어 있다 라고 알려주는 선언 키워드
===================
C++ 복습 세션
delete - 동적 할당 해제
delete[] - 배열 동적 할당 해제
unique_ptr 은 생명 주기에 맞춰 옮겨 줄 때 사용을 많이 한다(?).
shared _ptr - 오브젝트 등에 사용된다.
struct Data {~
operator 키워드
없는 걸 만든다 = 연산자 정의 / 있는 걸 바꾼다 = 연산자 오버로딩
auto - decltype - decltype(auto)
void Swap( T& a, T& b) {
T temp = a; \n a=b; \n b = temp;
Swap(x, y);
이것이 실무에 자주 사용되는 형식(참조 사용)
값이 없을 수 있거나 null을 표현 배열이나 동적 메모리를 사용, 함수 안에서 가리키는 대상을 변경, C API 레거시를 연동해야 할 때는 포인터를 사용해야 한다.
.
'TIL' 카테고리의 다른 글
| 25.12.19일자 - TIL (0) | 2025.12.19 |
|---|---|
| 25.12.18일자 - TIL (0) | 2025.12.18 |
| 25.12.16일자 - TIL (0) | 2025.12.16 |
| 25.12.15일자 - TIL (0) | 2025.12.15 |
| 25.12.12일자 - TIL (0) | 2025.12.12 |