이번 포스팅에서는 포큐 아카데미 C++ 강의 중 스마트 포인터 부분에 대한 내용을 정리해 보려고 한다. 스마트 포인터에는 다음과 같이 세 가지가 있다. unique_ptr, shared_ptr, weak_ptr. 이 중에서 unique_ptr는 정말 많이 쓰이고, shared_ptr는 적당히 쓰이며, weak_ptr는 잘 쓰이지 않는다. 포인터는 다음과 같이 사용할 수 있다. #include "Vector.h" int main() { Vector* myVector = new Vector(10.f, 30.f); // ... delete myVector; return 0; } 문제는 더 이상 포인터가 필요하지 않을 때 메모리를 해제해야 한다. 스마트 포인터를 쓰면, delete를 직접 호출할 필요가 없다. ..
Prog. Langs & Tools/C++
지난 포스팅에 이어서 C++ 최신 버전에서 추가된 문법들에 대해서 공부한 내용을 정리해 보려고 한다. 새로운 자료형 nullptr NULL을 쓰면 가끔 이상한 일이 발생된다. C++에서 NULL은 어떤 타입이 아니라 0이다. 따라서 함수를 호출할 때 적합하지가 않다. 따라서 nullptr가 등장하였다. nullptr는 null 포인터 상수이다. nullptr는 다음과 같이 사용할 수 있다. // Main.cpp Class* myClass = new Class("COMP3200"); const Student* student = myClass->GetStudent("Coco"); if (student != nullptr) { std::cout GetID()
이번 포스팅에서는 STL 알고리즘에 대한 간단할 설명 및 C++ 최신 문법에서 추가된 키워드, 자료형, STL 등에 대해서 알아보고자 한다. STL 알고리즘 STL 알고리즘이란 요소 범위에서 쓸 수 있는 함수들을 의미한다. 따라서 배열 또는 몇몇 STL 컨테이너에서 쓸 수가 있다. 이 때 반복자를 통해 컨테이너에 접근한다. 컨테이너의 크기를 변경하지 않기 때문에 추가 메모리 할당도 없다. 유형별로 다음과 같이 호출하는 include 문이 다르다. #include 변경 불가 순차(sequence) 연산 : find(), for_each() 변경 가능 순차 연산 : copy(), swap() 정렬 관련 연산 : sort(), merge() #include 범용 수치 연산 : accumulate() 예를 들어..
이번 포스팅에서는 템플릿 프로그래밍에 대해서 정리해 보려고 한다. 첨부한 이미지는 포큐 아카데미의 C++ 강의 내용 화면이다. 템플릿이란 Java나 C#에서 제네릭(generic) 메서드/클래스와 비슷하다. 컴파일 도중 모든 코드를 만들어 준다. STL 컨테이너 또한 템플릿이라고 볼 수 있다. 템플릿이 가진 첫 번째 장점은 코드를 자료형마다 중복으로 작성하지 않아도 된다는 점이며, 두 번째로는 컴파일러가 미리 코드를 만들어 주기 때문에 런타임에서 돌리면 느린 함수들을 컴파일 시에 미리 호출해서 최종 결과만 상수로 뽑아서 쓸 수가 있다. 함수 템플릿 예를 들어 두 수를 더하는 Add 함수가 있다고 가정해 보자. int를 더할 수도 있고, float를 더할 수도 있고, double을 더할 수도 있다. // ..
이번 포스팅에서는 STL의 맵(Map)에 대해서 정리해 보려고 한다. 첨부한 이미지는 포큐 아카데미의 C++ 강의 내용 화면이다. 맵(Map) 맵은 STL 컨테이너에서 Key-Value 형태로 데이터를 저장하는 구조이다. 키는 중복될 수 없다. C++맵은 키 값을 기준으로 자동으로 정렬이 되는 컨테이너이다. 그리고 맵은 이진 탐색 트리(BST) 기반이다. 빈 맵을 만들 때는 key와 value의 타입을 반드시 선언해 주어야 한다. 그리고 어떤 맵과 같은 크기 및 데이터를 가지는 맵을 초기값으로 생성해서 맵을 만들 수도 있다. 두 개의 데이터를 하나의 단위로 저장하는 구조를 pair 라고 한다. 맵에 새로운 요소를 삽입하려고 할 때에는 insert() 메서드를 사용한다. 이 때 반환은 반복자(iterato..
이번 포스팅에서는 STL의 벡터(Vector)에 대해서 정리해 보려고 한다. C++의 표준 템플릿 라이브러리(STL)는 C++ 프로그래밍에서 필요한 자료구조와 알고리즘을 템플릿으로 제공하는 라이브러리이다. STL은 일반적으로 다음 세 가지 라이브러리를 의미한다. 컨테이너(Container) : 임의 타입의 객체를 보관. 객체를 저장하는 자료구조 시퀀스 컨테이너(Sequence Container) : Array, Vector, List, Deque 협력 컨테이너(Associative Container) : Set, Multiset, Map, Multimap 반복자(Iterator) : 포인터와 유사한 개념. 컨테이너에 보관된 원소에 접근하여 다음 원소를 가리킴. 순회 알고리즘(Algorithm) : 반복자..
C++에서 예외를 어떻게 처리하는지에 대해서 알아보도록 한다. C++에서도 예외를 지원한다. 다만 C++에서는 예외의 중요성이 다른 언어(ex. JAVA)에 비해서 좀 떨어진다. JAVA나 C#에 당연히 있는 예외가 C++에는 없는 경우도 있다. 그래서 이번 포스팅에서는 올바른 사용법 위주로만 알아본다. 예외를 남용하는 것은 지양해야 한다. 예외가 발생하는 상황 첫 번째 예외 발생 상황은 범위 이탈이다. 다음과 같이 범위를 넘어서서 참조를 하는 상황일 경우 에러가 발생하고 try/catch를 통해서 예외 처리를 해줄 수 있다. try/catch가 없는 경우 Visual Studio는 핸들링이 되지 않은 exception이 있는 경우 breakpoint를 걸어주는 기능이 있다. 참고로 아래와 같은 코드는 ..
이번 포스팅에서는 POCU 아카데미 강의를 들으며 C++의 인라인 함수, 그리고 static 키워드에 대해 공부한 내용을 정리해 보려고 한다. 인라인 함수 함수를 호출할 때는 다음과 같은 단계를 거친다. 함수는 메모리 안에 "할당"되어 있다. 변수들을 스택에 push 함수 주소로 점프 함수를 실행 호출자 함수로 다시 점프 1번 단계에서 넣어두었던 변수들을 pop 따라서 함수가 저 멀리 저장공간(메모리)에 있는 경우는 CPU 캐시에 저장이 되어있지 않기 때문에 최적화가 이루어지지 않게 된다. 따라서 모든 걸 함수로 만들라는 조언은 적합하지 않다. 물론 함수를 써서 가독성이 좋아질 수도 있기에, 좋다고 볼 수도 있지만 함수를 호출함으로써 필요한 오버헤드를 떠맡는 것이 부담이 됨은 기억해야 한다. C++에서는..