C++ 19

자료구조 - 연결 리스트

컴퓨터에서는 많은 양의 데이터를 처리하기 위해 자료구조를 사용합니다.자료구조는 일련의 설계규칙에 따라 데이터를 처리하는데이 포스트에서는 그 중에서도 연결 리스트에 대해 알아보겠습니다. 1) 연결 리스트연결 리스트는 자료구조 중에서 선형 자료구조에 속합니다.선형 자료구조는 데이터가 순차적으로 나열되어 있는 자료구조를 일컫는데,대표적으로 배열, 연결 리스트, 스택 등이 있습니다. 연결 리스트의 특징으로는  바로 현재 노드의 정보와 다음 노드만을 갖는 단방향 연결 리스트와  바로 현재 노드의 정보에 추가적으로 앞의 노드와 바로 뒤의 노드 둘다를 갖는 양방향 연결 리스트가 존재합니다.일반적으로는 순회와 삽입/삭제의 용이함을 위해 양방향 연결 리스트를 사용합니다.  연결 리스트의 특징은 자료구조의 방향성을 갖고 ..

C++ 2024.08.18

스마트 포인터 - weak_ptr, unique_ptr

저번 포스팅에 이어 이번에는 나머지 스마트 포인터에 대해 알아보겠습니다.1) shared_ptr의 문제점shared_ptr의 문제점은 무엇일까요?바로 refCount가 0이 되지 않는 이상은 delete가 되지 않는다는 것입니다.  위와 같은 상황이 된다면, 무슨 일이 벌어질까요? 서로가 서로를 참조하고 있는 상황이 되고,한쪽이 delete되지 않는 이상은 삭제가 이루어질 수 없는 상황이 되버리게 됩니다.위와 같은 사이클의 발생은 메모리 누수를 발생시키는 치명적인 문제를 만들게 됩니다. 2) weak_ptrweak_ptr은 shared_ptr만으로는 풀어낼 수 없는 위와 같은 문제를 해결할 수 있습니다.weak_ptr은 다음의 특징을 갖게 됩니다. 첫번째로, weak_ptr은 refCount가 0이 되면..

C++ 2024.05.27

스마트 포인터 - shared_ptr

너무 오랜만에 포스팅을 하게 되어 죄송합니다.그동안 개인적인 사정으로 잠시 포스팅을 멈추게 되었습니다.일이 잘 해결되어 이제 다시 포스팅을 시작하겠습니다. 1) 스마트 포인터란?이름에서 알 수 있듯이, 스마트 포인터는 기존의 포인터에 포인터를 관리하는 추가적인 요소들을 섞어주는 것을 말합니다.즉, 일반적인 포인터보다 더 많은 역할을 수행하는 포인터를 스마트 포인터라고 할 수 있습니다.그리고 현대의 C++에서는 포인터를 사용하기보다는 스마트 포인터를 사용할 것을 권장합니다.이는 C++ 기반의 게임 엔진인 언리얼 엔진도 마찬가지인데,언리얼 엔진에서는 C++을 사용할 때는 스마트 포인터를, 언리얼 C++에서는 가비지 컬렉터를 사용합니다. 그렇다면, 왜 스마트 포인터를 사용하는 것일까요?그것은 포인터의 한계에 ..

C++ 2024.05.27

동적할당

이 포스팅에서는 동적할당에 대해 배워보겠습니다.동적할당은 일반적인 변수를 만드는 것과는 큰 차이가 존재합니다.그러면 지금부터 알아보겠습니다. 1) 동적할당이란? 컴퓨터의 메모리는 간단하게 위와 같이 동작합니다.그리고 이번에 알아볼 동적할당은 힙 영역이라는 공간을 사용합니다. 이 힙 영역은 일반적인 방식으로 사용할 수 없고,운영체제를 통해 힙 영역에 설계자가 요구한 만큼의 공간을 할당받는 식으로 작동합니다. 2) 동적할당의 장단점장점으로는, 정해진 공간에서 정해진 위치만 사용하게 되므로 다른 요소들끼리 겹치거나 부딪힐 이유가 없다는 것입니다.또한 정해진 공간만 사용한다는 점에서 메모리의 낭비도 줄일 수 있게 됩니다. 단점으로는,이렇게 사용한 힙 영역에 대한 관리를 설계자가 직접해주어야 한다는 것입니다.크게..

C++ 2024.04.29

iterator(반복자)

이번 포스팅에서는 iterator, 한국말로 반복자라고 불리는 개념에 대해서 알아보겠습니다. 1) iterator란?iterator는 Wrapper Class의 일종입니다.이때 Wrapper Class란,int, float, long과 같은 기본자료타입(primitive type)을 인스턴스로 다루기 위해 사용하는 클래스를 의미합니다.iterator는 C++외에도 java와 같은 다른 프로그래밍 언어에도 존재합니다. C++에서 iterator는 일반화된 포인터의 형태를 갖고 있지만, 완전히 동일하지는 않습니다.그러나 iterator를 통해 값에 접근하기 위해서는 참조 연산자(*)를 사용하는 등의 접근 방법이 필요합니다. 또한 iterator는 클래스이므로, 이와 관련된 메서드들이 다수 존재합니다.이와 관..

C++ 2024.04.29

오른값 참조

이번 포스팅에서는 오른값 참조에 대해서 알아보겠습니다.오른값 참조는 비교적 최근인 C++11에 등장한 개념으로, 이로 인해 C++의 처리속도가 매우 빨라졌습니다. 그러나 오른값 참조에 대해 배우기 전에, 먼저 확실하게 알고 넘어가야 하는 부분이 있습니다.바로, 왼값(l-value)과 오른값(r-value)이라는 개념입니다. 1) l-value VS r-value우선, l-value는 단일식을 넘어서 계속되는 개체를 의미합니다.그리고 r-value는 l-value가 아닌 나머지로 얘기할 수 있겠습니다. 예시를 들자면,int a = 3;이라는 코드가 있다고 해보겠습니다. 이때, a는 언제든지 값이 변할 수 있습니다.가령, a = 10과 같은 형태로 값을 변하게 하는 것이 가능합니다. 따라서 a는 l-valu..

C++ 2024.04.22

얕은 복사 VS 깊은 복사

본격적인 내용에 들어가기에 앞서 '복사'란 무엇일까요? 게임을 만들 때, 같은 몬스터들을 하나하나 새로 만드는 것보다는하나의 몬스터를 만들고 그 몬스터를 복사하는 것이 훨씬 더 효율적일 것입니다. 복사도 이와 같은 개념으로 적용됩니다.복사도 마찬가지로 같은 타입의 인스턴스를 일일이 새로 만들기 보다는 복사하는 것이 효율적입니다. 그렇다면 복사는 복사인데 얕은 복사와 깊은 복사는 왜 구분되는 것이고, 또 차이는 무엇일까요?한번 알아보도록 하겠습니다. 1) 얕은 복사   위와 같이 구성된 코드를 실행시키면,  위와 같은 실행결과를 확인할 수 있습니다.그런데 결과가 조금 이상합니다.우리는 어찌 되었든, 두 개의 Knight 인스턴스를 만들었고 결과적으로 2개의 Pet 인스턴스가 동적할당되어야 합니다.그러나 생..

C++ 2024.04.21

C++의 캐스팅 - const_cast

C++ 캐스팅의 마지막 파트인 const_cast입니다.구성은 다음과 같습니다. static_castdynamic_castreinterpret_castconst_cast1) const_cast란?const_cast에 대해 알기 이전에 const 키워드가 무슨 역할을 수행하는지 알아야 합니다.https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/const const 키워드 - C# 참조 - C#const 키워드 - C# 참조learn.microsoft.com 설계자들은 상수 필드나 지역 상수를 만들기 위해 const 키워드를 사용합니다.상수를 만들기 위해서는 define을 사용해 매크로를 만들 수도 있고,enum 구조체나 e..

C++ 2024.04.15

C++의 캐스팅 - reinterpret_cast

이번 포스팅에서는 C++의 캐스팅 중에서 reinterpret_cast에 대해 알아보도록 하겠습니다. 구성은 다음과 같습니다. static_castdynamic_castreinterpret_castconst_cast1)  reinterpret_cast란?https://learn.microsoft.com/ko-kr/cpp/cpp/reinterpret-cast-operator?view=msvc-170 reinterpret_cast 연산자자세한 정보: reinterpret_cast 연산자learn.microsoft.com 위의 공식문서의 설명과 같이, retinterpret_cast는 포인터가 다른 포인터 형식으로 변환될 수 있게 합니다.또한 포인터를 전혀 관련없는 타입으로 변환할 수 있게 해줍니다. 2) r..

C++ 2024.04.14

C++의 캐스팅 - dynamic_cast

이번 포스트에서는 저번의 static_cast에 이어 dynamic_cast에 대해 알아보겠습니다.구성은 다음과 같습니다. static_castdynamic_castreinterpret_castconst_cast 1) dynamic_cast란?저번에 알아본 바로는 static_cast는 상속관계를 고려하지 못하고,컴파일러가 판단하기에 문제가 없다면 그대로 캐스팅해버리는 치명적인 문제가 있었습니다. 이러한 문제는 포인터를 사용할 때 잘못된 메모리 주소의 데이터를 덮어씌워 버리는 메모리 오염의 주 원인이 됩니다. 그리고 dynamic_cast는 이러한 상속관계를 고려하여 안전한 변화를 만들어 줍니다. 2) dynamic_cast의 작동원리dynamic_cast는 다형성이 만족되어야 사용가능합니다.그리고 여기..

C++ 2024.04.14