👩🏻‍💻기초지식/C++ 24

[C++] 템플릿 (Template)

정의 템플릿은 C++ 프로그래밍 언어의 한 기능으로, 함수나 클래스를 일반화하여 여러 타입에 대해 동작하는 코드를 작성할 수 있는 도구입니다. 템플릿을 사용하면, 함수나 클래스가 개별적으로 다시 작성하지 않고도 각기 다른 수많은 자료형에서 동작할 수 있게 합니다. 템플릿의 종류로는 함수를 다양한 타입에 대해 동작하도록 일반화하는 '함수 템플릿'과, 클래스를 일반화하는 '클래스 템플릿'이 있으며, 연산자 오버로딩에서 자주 사용됩니다. 동작 원리 템플릿 코드를 작성하고 나서, 템플릿 함수나 클래스를 사용하면 컴파일러는 제공된 타입에 맞는 코드를 생성합니다. 이를 '템플릿 인스턴스'라고 합니다. 더 자세한 템플릿의 동작원리를 이해하려면 프로그램의 빌드 과정을 이해해야 합니다. 프로그램이 빌드되면 컴파일부터 링..

[C++] STL - std::map과 std::unordered_map

std::map map은 key-value 쌍을 저장하는 자료구조로, 이진 탐색 트리(BST)인 레드-블랙 트리를 기반으로 구현되었습니다. 레드-블랙 트리를 기반으로 구현되어 map의 key 값은 자동 정렬됩니다. 시간복잡도 map 자료구조에 원소를 추가/검색/삭제할 때, 해당 위치를 찾기 위해 이진 탐색을 수행합니다. 그 후 명령에 따라 새로운 노드를 삽입하거나, 주어진 키와 각 노드의 키 값을 비교하며 검색하거나, 노드를 제거하는 등의 역할을 수행합니다. 따라서, 이러한 이진 탐색으로 작동하는 map은 모든 기본 연산이 O(log n)의 시간 복잡도를 갖습니다. map은 왜 정렬을 할까? 1. key-value 쌍을 저장할 때, key 값들이 일정한 순서로 정렬되어야 이진 탐색이 가능하고, 이진 탐색..

[C++] 다중 상속의 문제점 : 다이아몬드 문제 (Diamond Problem)

다중 상속 정의 다중 상속이란, 하나의 클래스가 두 개 이상의 클래스로부터 멤버를 상속받아 파생 클래스를 생성하는 것을 의미합니다. 다중 상속의 문제점 1. 상속받은 여러 기초 클래스에 같은 이름의 멤버가 존재하는 경우 2. 하나의 클래스를 간접적으로 두 번 이상 상속받을 경우 3. 가상 클래스가 아닌 기초 클래스를 다중 상속하여, 기초 클래스 타입의 포인터로 파생 클래스를 가리킬 수 없는 경우 다중 상속을 사용하는 경우 위와 같은 상황이 벌어질 수 있고, 이런 경우 "모호한(ambiguous) 호출"같은 오류가 발생할 수 있습니다. 다이아몬드 상속 구조 다중 상속을 다이아몬드 구조로 사용한 경우 '다중 상속의 모호성 문제'가 발생하게 됩니다. 위 그림과 같이 A, B, C, D 클래스의 구조가 있을 때..

[C++] STL - std::list와 std::vector

std::list 정의 C++ STL의 list는 이중 연결 리스트(double linked list)를 기반으로 구현된 컨테이너입니다. 이중 연결 리스트는각 노드가 앞선 노드(prev)와 다음 노드(next)에 대한 참조 또는 포인터를 가지고 있는 데이터구조입니다. 특징 list는 어느 위치에서든 O(1)의 시간복잡도로 요소를 삽입하거나 삭제할수 있습니다. 그러나 이러한 장점을 가지기 위해, list는 추가적인 메모리(앞 뒤 원소의 연결 정보)를 사용하고, 배열처럼 연속된 메모리 공간을 사용하지 않기 때문에 '캐시 지역성'이 떨어져 속도가 상대적으로 느립니다. > 캐시 지역성 (Cache Locality) 더보기 캐시 지역성(cache locality)은 프로그램의 메모리 접근 패턴이 얼마나 효율적으로..

[C++] STL - C++ 표준 템플릿 라이브러리

정의 C++ STL은 Standard Template Library의 약자로, C++ 표준 라이브러리의 일부입니다. STL은 다양한 유형의 알고리즘과 데이터 구조를 제공하며, 이들은 모두 템플릿으로 제공되어 다양한 데이터 타입에 대해 동작할 수 있습니다. 종류 STL은 크게 컨테이너, 알고리즘, 반복자, 함수 객체(함수자)의 네 가지 구성 요소로 나눌 수 있습니다. 컨테이너 (Container) 컨테이너는 자료를 저장하는 클래스 템플릿들의 집합이며 연속 컨테이너, 정렬 연관 컨테이너, 비정렬 연관 컨테이너, 컨테이너 어댑터로 나눌 수 있습니다. 연속 컨테이너 (= 시퀀스 컨테이너, Sequence Containers) 연속 컨테이너는 데이터를 순차적으로 저장합니다. 이들은 배열과 비슷한 형태를 가지며, ..

[C++] 상속의 문제점 : 오브젝트 슬라이싱 (Object Slicing)

정의 오브젝트 슬라이싱은 Class 상속과정에서 일어날 수 있는 문제로, 파생 클래스 객체가 기본 클래스 객체에 할당되면, 파생 클래스 객체의 추가적인 특성이 잘려나간 채 기본 클래스 객체로 생성되는 것을 말한다. 쉽게말해, 자식 객체에서 부모 객체로 copy 될 때 자식 객체의 정보가 잘려나가는 것이다. 주로 부모 클래스를 call by value로 받는 경우, 오브젝트 슬라이싱이 발생한다. 오브젝트 슬라이싱 발생 상황 #include using namespace std; class Base { protected: int i; public: Base(int a) { i = a; } virtual void display() { cout

[C++] LValue와 RValue, 얕은 복사와 깊은 복사

L-Value int a = 3; 에서 a에 해당하는 것처럼 참조(&) 연산자를 통해 주소값을 취할 수 있는 값을 LValue라고 합니다. LValue는 표현식의 왼쪽과 오른쪽 모두에 올 수 있습니다. R-Value int a = 3; 에서 3은 주소값을 취할 수 없습니다. 또한 표현식을 연산할 때 잠깐 존재하고, 연산 후에는 사라지는 값입니다. 즉, 이렇게 실체가 없어서 주소 값을 취할 수 없는 값을 RValue라고 합니다. RValue는 표현식의 오른쪽에만 올 수 있습니다. 얕은 복사 (Shallow Copy) 얕은 복사는 의존적인 복사로, 값을 복사하는 것이 아니라, 값을 기리키는 포인터를 복사하는 것입니다. 즉, 동적 할당 받은 변수의 주소값까지 공유합니다. 얕은 복사는 객체가 가진 멤버들의 값을..

[C++] RTTI (RunTime Type Information, 실시간 타입 정보)란?

정의 RTTI란 실시간 타입 정보의 약자로, 프로그램 실행 중에 데이터 타입에 대한 정보가 필요할 때 사용하는 기능입니다. 즉, 런타임에 개체의 형식이 결정될 수 있도록 하는 메커니즘이라고 볼 수 있습니다. RTTI를 사용하면 런타임에 객체의 타입을 식별하거나, 클래스 계층에서 특정 클래스가 다른 클래스의 하위 클래스인지 확인하는 등의 작업을 수행합니다. RTTI는 클래스 타입 관련 정보가 vtable(가상함수 테이블)에 같이 저장되기 때문에, 가상 함수가 있는 클래스에 대해서만 작동합니다. 다르게 말하면 가상함수가 없는 클래스는 실행 중에 타입 정보를 알아야 할 필요가 없다고 볼 수 있습니다. 또한, 컴파일러는 컴파일 번역 작업이 끝나면 타입 이름을 실행파일에 남길 필요가 없어 RTTI로 정보를 가져옵..

[C++] Cast 4종류 (static, dynamic, const, reinterpret)

static_cast : 정적 캐스팅 static_cast는 컴파일 타임에 형변환이 가능한지를 검사하고 캐스팅하는 방식입니다. 컴파일 타임에만 타입검사를 수행하고, 실행 시간(런타임)에는 타입 검사를 수행하지 않습니다. 예를 들어, 정수를 실수로 변환하거나, 기본 클래스 포인터를 파생 클래스 포인터로 변환하는 등의 작업을 수행할 수 있습니다. static_cast는 컴파일러가 타입 안전성을 검사하므로, 불가능한 캐스팅을 시도하는 경우에 컴파일 오류를 발생시킵니다. > 추가 설명 더보기 - 포인터의 타입이 서로 관련 없을때는 static_cast를 적용할 수 없다. - 변환 생성자가 제공되지 않는 타입의 객체에는 static_cast를 적용할 수 없다. - 기본적으로 C++의 타입 규칙에서 허용하지 않는 ..

[C++] 동적할당/바인딩, 가상함수/테이블, 추상클래스, 인터페이스, 가상소멸자

동적할당 컴파일 시에 메모리를 할당하는 정적할당과 달리, 런타임 중에 메모리를 할당하는 것을 말합니다. C++에서는 new 연산자를 사용하여 동적할당하고, 사용이 끝난 이후엔 반드시 메모리를 해제해 줘야 합니다. 그렇지 않을 경우 메모리 누수가 발생하여 성능 저하나 예기치 못한 오류가 발생할 수 있습니다. new/delete와 malloc/free 차이 new와 delete는 호출 시 생성자와 소멸자를 각각 호출합니다. 또한 new는 메모리를 할당할 때 자료형 단위로 할당합니다. malloc과 free는 호출 시 생성자와 소멸자를 호출하지 않습니다. 또한 malloc은 메모리를 할당할 때 바이트 단위로 할당합니다. 바인딩 프로그램 실행 시 변수나 함수들은 그 내용을 저장할 메모리를 할당해야 하는데, 그 ..

728x90