Programming Language/C++

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..
dynamic_cast 동적 캐스트(dynamic_cast)는 실행 중에 형변환을 판단한다. 포인터 또는 참조 형을 캐스팅할 때만 사용할 수 있다. 호환되지 않는 자식으로 캐스팅 하려고 하면 NULL을 반환한다. dynamic_cast가 static_cast보다 안전하다 // C style Animal *myPet = new Cat(); Dog *myDog = (Dog *)myPet; // 컴파일 가능 myDog->getHouseName(); // 컴파일 되지만 Undefined Behavior // C++ style Animal *myPet = new Cat(); Dog *myDog = dynamic_cast(myPet); // 컴파일 되지만, NULL을 반환한다. // 컴파일 되지만 실행되지 않는다...
const_cast const_cast의 사용은 피하는 것이 좋다. // C style void Foo(const Animal *ptr) { Animal *animal = (Animal*)ptr; animal->SetAge(5); } // C++ style void Foo(const Animal *ptr) { Animal *animal = const_cast(ptr); animal->SetAge(5); } const_cast는 자료형을 바꿀 수 없으며, 오로지 const 또는 volatile 어트리뷰트를 제거할 때 사용된다. Animal *myPet = new Cat(2, "Coco"); const Animal *petPtr = myPet; // C style Animal *myAnimal1 = (Ani..
coco_daddy
'Programming Language/C++' 카테고리의 글 목록 (3 Page)