프로그래밍 390

C/C++ 스마트 포인터 간단 정리

스마트 포인터 C++ 프로그램에서 동적할당 된 메모리는, 반드시 delete를 통해서 메모리 해제가 이루어져야 합니다.C++에서 메모리 누수로부터 프로그램의 안정적으로 관리할 수 있도록스마트 포인터를 제공하고 있습니다.이 스마트 포인터는 RAII의 개념을 기반으로 제작되었으며,클래스 템플릿으로 구현되어 있습니다.포인터 처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해주고,Dangling 포인터, 할당 실패 등의 버그를 방지하도록 제작되었습니다. 이러한 스마트 포인터의 사용 이유는,스마트 포인터를 사용함으로써,new, delete와 같은 키워드를 사용하는 추가적인 코드를 줄일 수 있으며,RAII 개념을 기반으로 제작되었기 때문에,제작의도에 맞게 사용자가 메모리 관리를 할 때 좀 더 안..

그래서 다형성이 뭐라고요?

간단히 말하자면하나의 개체나 메소드가 여러 가지 형태를 가지는 것이다. 여러 가지 형태를 가지는 것이니,오버로딩과 오버라이딩을 써서 여러 형태를 가지는 기능들을한데 묶어 분류해 놓은 것이다. 다형성은 굉장히 중요하다.그 이유는, 실제 유용성이 굉장히 많다.예를 들어 게임이라고 하면,몬스터의 종류가 많을 것이다.이런 몬스터의 부모 클래스가 되는 BaseMonster 클래스가 있을 것이고,이 클래스에 파생되는 애들도 있을 것이다.그럼 몬스터 종류가 약 20개쯤 된다고 가정해보자. 이 다른 타입들을 배열에 저장하기에는 좀 부담스럽다.귀찮고 번거로운 일이기 때문에. BaseMonster 클래스 내부에virtual 반환형 Move()  함수를 제작한다.이후 monster* 배열을 제작한 후, 이 배열 내부에 있는..

인라인 함수

함수를 호출할 때 필요 조건함수는 메모리 안에 "할당"되어 있다.함수를 호출하기 위해 필요한 단계들변수들을 스택에 push함수 주소로 점프함수를 실행호출자 함수로 다시 점프1번 단계에서 넣어뒀던 변수들을 "pop"함수 주소로 이동되서 써야하니까 변수를 스택에 넣어두고스택에서 가리키는 포인터를 확 뒤돌리는 것 만으로도충분히 그 값을 쓸 수 있다.하나하나 빼서 쓰지는 않다. 여기서 실제 컴퓨터 아키텍처에 따라4,5번은 순서가 뒤바뀔 수 있다. 함수의 단점뭔가 여러 단계를 거치므로 생기는 단점이 있을 것 같지 않은가? 여러 단계를 거치다보니 좀 더 느리다는 단점있다.CPU 캐시에 최적이 아닐 수도 있으면 더 느리다.모던 cpu 아키텍처에서는 더 느리다. 특히나 캐시 최적화나 이런 점 때문에 느린 속도를 가진다..

그래프 순회 - BFS

그래프 구조를 이용해 문제를 해결하기 위해필요한 기본적이고 대표적인 그래프 알고리즘에서BFS,DFS를 빼놓고 논하기는 쉽지 않을 것이다.일단, 그래프 알고리즘을 말하기 전에 그래프에 대해서 말해보자. 그래프란? 그래프는 정점의 집합과 정점들을 서로 잇는 에지의 집합으로 구성된다.수학적으로 표현하면 그래프 G = 형태로 표현하고,여기서 V는 정점의 집합, E는 에지의 집합을 나타낸다. 그래프에는 크게 방향 그래프, 무방향 그래프, 가중 그래프, 비가중 그래프가 있다. 만약 에지가 특정 정점에서 다른 정점으로 향하는 방향있다면 방향 그래프라고 한다.특정 방향을 가리키지 않으면 무방향 그래프라고 한다.에지에 가중치가 있으면 가중 그래프,가중치가 없으면 비가중 그래프라고 한다. (추가적으로 그래프를 다룰 때 ..

DFS 구현 (재귀와 스택) 과 BFS(큐)

DFS 구현 재귀 호출 코드#include #include using namespace std;const int MAX_N = 10;int N, E;int Graph[MAX_N][MAX_N];bool Visited[MAX_N];void dfs(int node) { Visited[node] = true; cout > N >> E; // 배열 초기화 memset(Visited, 0, sizeof(Visited)); memset(Graph, 0, sizeof(Graph)); for (int i = 0; i > u >> v; Graph[u][v] = Graph[v][u] = 1; } dfs(0); return 0;}  스택 코드#include #include #include using namespace st..

백준 실버4 1920 수 찾기

https://www.acmicpc.net/problem/1920  이 문제는 다음과 같이 풀 수 있다.1. 배열의 길이를 입력 받는다.2. 해당 배열에 들어갈 원소들을 순차적으로 입력 받는다3. 비교할 배열의 길이를 입력 받는다   (굳이 배열에 담지 아니해도 된다, 설명 편의상 배열이라고 가정하였다.)4. 먼저 생성된 배열과 비교할 배열의 원소와 일치한다면 1을, 아니라면 0을 출력한다. 해당은 문제는 탐색을 통해 풀 수 있다.필자는 이진 탐색으로 풀었다.using namespace std;int main(void){ ios::sync_with_stdio(false); cin.tie(NULL); std::cout.tie(NULL); int n; cin >> n; vec..

프로그래머스 LV.2 전화번호 목록

https://school.programmers.co.kr/learn/courses/30/lessons/42577 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 해당 문제는 전화번호가 접두어인가? 를 판별하면 된다.접두어이면 FASLE, 아니면 TRUE를 반환한다. 제한 사항폰북의 길이가 1 ~ 1000000이다.각 전화번호의 길이는 1 ~ 20 사이이다.같은 전화번호는 중복해서 들어가 있지 않다 해당 문제의 접근법은 3가지가 있다. 1. 반복문을 활용 - 시간이 너무 오래 걸린다. 폰북의 길이가 너무 길다. - 이중 루프를 돌게된다.(양방향 비교) 2. 정렬과 반복문을 활용 - 이중 루프..

Unreal Object Handling

언리얼 오브젝트 핸들링이란? UObject 시스템의 기능에 대한 개요로,클래스, 프로퍼티, 함수에 적합한 매크로로 마킹해주면,UClass, UProperty, UFunction 으로 변한다.그러면 언리얼 엔진이 접근할 수 있어,다수의 내부적인 처리 기능을 구현할 수 있다. 자동 프로퍼티 초기화 UObject는 생성자 호출 전 초기화시 자동으로 0으로 채워진다.이러한 초기화 과정은1) 전체 클래스, 2) UProperties(GC시스템에 의해 관리되는 변수들), 3) 네이티브 멤버(C++로 선언된 일반 멤버 변수)모두를 포함한다. 이후 생성자에서 원하는 값으로 초기화할 수 있다. 즉, 이 말은자동 초기화 후에, 생성자에서 커스텀 초기화가 가능하다는 뜻이다.자동 추기화는 앞서 말했듯이UObject가 생성될 ..

UE5 2024.12.19