C++ 템플릿과 STL 컨테이너템플릿(Template) 기본 개념C++에서의 템플릿은 코드의 재사용성을 높이기 위한 강력한 도구이다.템플릿은 함수나 클래스를 정의할 때 특정한 자료형에 의존하지 않고 일반적으로 사용할 수 있도록 만들어준다.// 예시: 템플릿 함수template T add(T a, T b) { return a + b;}위의 예시에서 typename T는 템플릿 매개변수로, 함수를 호출할 때 실제 자료형으로 대체된다.int result1 = add(3, 5); // add(3, 5)와 동일float result2 = add(3.14, 2.71); // add(3.14, 2.71)와 동일템플릿 함수 사용 예시// myMath.htemplate T add(T a, T b) { ..
Language
C++ Map에 대한 이해 맵(Map)이란? 맵은 키와 값을 저장하는 데이터 구조로, 키와 값의 쌍을 저장합니다. 여러 가지 특징을 갖고 있으며, 주로 중복되지 않는 키를 통해 값을 찾는 데 사용된다. 키와 값의 쌍을 저장한다. 키는 중복될 수 없다. C++ 맵은 자동 정렬되는 컨테이너이다. (키를 기준으로 정렬) 이진 탐색 트리(binary search tree) 기반으로 구현되어 있어 검색 속도가 빠르다. 맵의 사용 예시 std::map simpleScoreMap; simpleScoreMap.insert(std::pair("Coco", 100)); simpleScoreMap.insert(std::pair("Mocha", 50)); simpleScoreMap["Mocha"] = 0; std::pair ..
1. 특징 어떤 자료형도 넣을 수 있는 동적 배열 원시 자료형(primitive data) 클래스 포인터 모든 요소가 연속된 메모리 공간에 위치 자동으로 메모리를 관리 임의의 요소에 접근 가능 (인덱스 사용 가능) vector는 operator[]를 사용할 수 있지만, STL 컨테이너를 순회할 때는 반복자(iterator)를 사용하는 것이 표준 방식 2. [장점] 순서에 상관없이 요소에 임의적 접근 가능 제일 마지막 위치의 요소를 빠르게 삽입 및 삭제 가능 (메모리 재할당이 없을 시) 3. [단점] 중간에 요소 삽입 및 삭제는 느리다. 재할당 및 요소 복사에 드는 비용이 크다. 4. 벡터 변수 생성 방법 빈 벡터의 생성 // std::vector std::vector scores; std::vector ..
1. 종류 벡터 (Vector) 맵 (Map) 셋 (Set) 스택 (Stack) 큐 (Queue) 리스트 (List) 덱 (Deque) 2. STL 컨테이너의 목적 템플릿 기반 모든 컨테이너에 적용되는 표준 인터페이스 std 알고리즘은 많은 컨테이너에서 작동한다. 템플릿 프로그래밍 기반 메모리 자동 관리 3. 모든 컨테이너에 같은 인터페이스가 적용되는 것은 이상하다. 극단적으로 OOP를 추구한 사례에 해당한다. vector와 list의 push_back이 이상하다. 4. 메모리 단편화 빈번한 메모리 재할당은 메모리 단편화를 초래한다. 메모리를 내부적으로 100번을 재할당하든 뭐든 강제하지 않는다. 가상 메모리를 지원하지 않는 플랫폼에서 프로그램을 실행할 때 문제가 생긴다. 메모리 단편화 때문에 애플리케이..
적절한 예외처리 예외상황: 컨트롤 할 수 없는 상황 예외 안정성: 예외가 났지만 나기 전 상황으로 무사히 돌아가야 한다. → 원래 있었던 올바른 상태로 복구가 되어야 함. 1. 유효성 검사/예외는 오직 경계에서만 하기 밖에서 오는 데이터를 제어할 수 없다. (파일을 읽고 있었는데 지워지거나, 데이터를 요청했는데 NULL이 오거나 등의 사유) → 외부에서 들어오는 웹 요청, 파일 읽기/쓰기, 외부 라이브러리 2. 시스템에 들어온 데이터는 모두 올바르다고 간주할 것. assert를 사용하여 개발 중 문제를 잡아내고 고칠 것. assert → 디버그 중 발견할 수 있도록 함. 3. 예외 상황이 발생할 때는 NULL을 능동적으로 반한할 것. 기본적으로 함수가 NULL을 반환하거나 받는 일이 없어야 한다. 만약 ..
1. 예외 처리 사용에 대한 주의 남용해서는 안 된다. 대부분의 예외는 불필요하다. (생성자의 경우에는 유용) 2. 예외를 사용해야 하는 상황 나 이외의 문제로 발생하는 예외이기 때문에 control 할 수 없는 경우 3. 사람의 사고 방식은 선형적 사람은 순서대로 읽는다. 여러 문제를 한 번에 처리하려고 하면 필연적으로 실수가 생긴다. 4. 언어 자체적으로 주는 예외는 없다. 프로그래머가 직접 만든 것. 표준 라이브러리에서 예외를 던져주기는 한다. (std::exception 클래스를 상속받아 사용) 5. 예외상황이 아닌 예외 상황 범위(range) 이탈 #include int main() { std::string catName = "Coco" try { char ch = myCatName.at(5) ..
1. 정적 변수 1.1 멤버 함수 내부에서의 정적 변수 멤버 함수 내부에서 정적 변수를 사용할 수 있다. class Example { public: void MemberFunction() { static int staticVar = 0; // 멤버 함수 내에서의 정적 변수 사용 } }; 1.2 멤버가 아닌 함수 내부에서의 정적 변수 멤버가 아닌 함수 내에서도 정적 변수를 활용할 수 있다. void NonMemberFunction() { static int staticVar = 0; // 멤버가 아닌 함수 내에서의 정적 변수 사용 } 2. 정적 멤버 함수 class Example { public: static void StaticMemberFunction() { // 정적 멤버 함수 } }; 3. 범위(s..
함수와 메모리 할당 함수는 메모리에 할당되어 있다. 함수 호출 시의 일련의 과정 변수들을 스택에 push. 함수 주소로 점프. 함수를 실행. 호출자 함수로 다시 점프. 1번에서 넣어준 변수들을 pop. CPU 캐시 최적화의 한계 현재 실행 중인 함수가 호출한 함수의 메모리가 물리적으로 멀리 있을 수 있다. 최근에 읽은 메모리는 CPU 캐싱되어 빠르게 읽을 수 있지만, 멀리 있는 것은 실제 메모리에 접근한 뒤 캐싱을 하여 읽어오기 때문에 느릴 수 있다. 함수화의 잘못된 극단적인 주장 "모든 걸 함수로 만들어라"라는 주장은 잘못된 것이다. 코드가 길어져 가독성을 높이기 위해 함수를 만드는 것은 재활용 가능성이 있을 때에만 적합하다. 인라인 함수 인라인 함수는 함수 호출 대신 복사/붙여넣기를 수행한다. Cat..