선호 이유 간결한 코드 설명을 하기 전에 코드를 먼저 살펴보자. auto spw1(std::make_shared()); std::shared_ptr spw2(new Widget()); 먼저 코드의 길이부터 약간이지만 더 짧아진 것을 확인할 수 있다. 또한 타입 선언을 한 번만 작성하는 곳을 볼 수 있는데, 이는 소프트웨어 공학의 핵심 교의 중 하나인 "코드 중복을 피하라"를 잘 지키는 것이다. 소스 코드의 중복이 많으면 컴파일 시간이 늘어나며 일관성이 없는 코드로 진화하기 일쑤이다. 코드의 비일관성은 버그로 이어지는 경우가 많다. 예외 안정성 이 역시 코드를 먼저 살펴보자. void processWidget(std::shared_ptr spw, int priority); int computePriorit..
std::unique_ptr 는 독점적 소유권 의미론을 재현하는 클래스이다. 그에 따라 복사를 허용하지 않으며, 오직 이동만 가능하다. std::unique_ptr 는 raw 포인터와 거의 같은 크기를 갖는다. 메모리와 CPU 성능이 넉넉하지 않더라도 사용하기에 충분하다는 뜻이다. std::unique_ptr 객체는 자신이 파괴될 때, 가르키는 자원 또한 함께 파괴된다. std::unique_ptr 가 파괴될 때 수행되는 커스텀 삭제자를 사용할 수 있다. 팩터리 패턴의 함수의 예시를 살펴보자. auto delInvmt = [](Investment* pInvestment) { makeLogEntry(pInvestment); delete pInvestment; }; template std::unique_pt..
C++ 에서 말하는 특수 멤버 함수란 C++ 이 스스로 작성하는 멤버 함수들을 가리킨다. 대표적으로 기본 생성자, 소멸자, 복사 생성자 등이 있다. 이 함수들이 생성되기 위한 가장 기본적인 조건은 클라이언트 코드에서 이 함수들을 사용할 때 생성된다. C++11 에 오면서 두 가지의 특수 멤버 함수가 추가됐다. 이 특수 멤버 함수의 조건을 알아보자. 이동 생성자와 이동 배정 연산자 C++ 의 가장 큰 특징이 바로 move semantics 이다. 이와 관련하여 이동 생성자와 이동 배정 연산자가 추가되었다. 이 둘은 아래와 같이 정의된다. class Widget { public: ... Widget(Widget&& rhs); Widget& operator=(Widget&& rhs); ... }; 두 특수 멤..
C++11에 오면서 override라는 키워드가 생겼다. java를 해본 사람이라면 @override라는 어노테이션을 본 사람이 있을 것이다. 이 어노테이션은 컴파일러에게 오버라이된 함수라는 것을 알려줘서 부모 클래스으로 부터 상속 받을 함수가 없다면 컴파일시에 알려준다. C++에서도 override 키워드가 똑같은 역할을 한다. 오버라이드 키워드를 만족하는 조건은 다음과 같다. 기반 클래스 함수가 반드시 가상 함수이어야 한다. 기반 함수와 파생 함수의 이름이 반드시 동일해야 한다(단, 소멸자는 예외). 기반 함수와 파생 함수의 매개변수 형식들이 반드시 동일해야 한다. 기반 함수와 파생 함수의 const성이 반드시 동일해야 한다. 기반 함수와 파생 함수의 반환 형식과 예외 명세가 반드시 호환되어야 한다...
제목만 보면 내용이 어려워보일수 있는데 사실은 어렵지 않다. 다시 정리해보면 private 를 이용해 함수를 숨기지 말고 delete 키워드를 사용하라는 의미이다. 이렇게 고의적으로 함수를 없애는 경우는 우리가 많이 사용하는 싱글턴이나 팩토리 패턴들을 사용하는 경우이니 알아두는것이 좋다. 어떻게 다른지 예제를 보자. class MyObject { // private을 사용하는 경우 private: MyObject(); // delete 키워드를 사용하는 경우 public: MyObject() = delete; }; 여기서 delete 키워드를 사용한 경우에 public으로 사용한 것을 볼 수 있는데 이는 의도적으로 더 나은 오류 메시지를 받기 위함임을 알아두길 바란다. 위의 두 코드의 목적은 똑같다. 외..
이전 포스트에서는 auto 를 써야하는 이유를 보았다면 이번 글에서는 auto 를 사용할 때, 주의해야하는 점을 알아보도록 하자. std::vector::reference vector::reference 가 무엇인지 아는 사람은 드물것이다. 먼저 vector 에 대해 생각해보자. bool 형식을 원소로 갖는 배열을 의미한다. 여기서 bool 의 특징을 생각해보자. bool 은 true, false 만 저장하는데도 속도를 위해 1byte 의 크기를 갖고 있다. 그런데 우리는 bool 배열을 사용할 것이기 때문에 굳이 1byte만 사용하지 않아도 된다. 1bit에 1개의 원소를 저장해도 아무런 문제가 없다. 이를 bool 처럼 사용하게 해주는 컨테이너가 바로 vector::reference 이다. 여기서 a..
처음 C++ 에서 auto 라는 키워드를 알게 되었을 때, 'auto가 있어서 편하다' 라는 생각보다는 왜 필요한지 의문이 든 적이 있을 것이다. 타입을 알아서 지정해준다는 장점 하나만으로 쓰기에는 auto를 사용함으로써 타입을 알아내기 힘들다는 생각이 들게된다. 대표적으로 처음 javascript 나 python 을 사용하게 되면 타입을 알지 못해 생기는 귀찮은 일들이 생긴다. 그러나 auto 는 이를 감수할 충분한 가치가 있다. 어떠한 장점들이 있는지 알아보자. 초기화를 빼먹는 실수 종종 생길 수 있는 실수로 선언만하고 초기화를 하지 않는 경우가 생길 수 있다. 이런 실수 때문에 예상치 못한 문제들이 발생할 수 있어 항상 조심해야한다. 그런데 만약 auto를 사용했다면 컴파일러가 에러를 발생시켜 실수..
C++을 사용할때 가장 실수하기 쉬운 부분이 바로 memory leak 이다. memory leak 은 즉시 알아채기 어렵고 메모리가 부족하다는 것을 깨달아도 어떤 코드에서 memory leak 이 발생하는지 찾기가 쉽지 않다. 미리 예방하는 것이 최선이며 이때 알아야할 가장 중요한 부분이 바로 소멸조건이다. 이 소멸조건은 포인터를 사용하는 변수와 포인터를 사용하지 않는 변수가 다르다는 것을 주의해야한다. 해당 포스트에서는 지역변수와 멤버변수를 위주로 다루도록 하겠다. 일반 변수 먼저 포인터를 사용하지 않고 선언한 일반 변수의 소멸조건을 알아보도록 하겠다. 소멸조건은 다음과 같다. 블록을 벗어나는 경우 새로 변수를 할당하는 경우 두번째 조건은 아주 쉽다. MyClass myClass; MyClass ne..
- Total
- Today
- Yesterday
- forward
- 람다
- thread
- C++14
- std::move
- 보편 참조
- Modern
- 포인터
- C
- 다이소
- C++11
- 발아시기
- std::forward
- Effective
- Effective Modern C++
- Override
- 보편참조
- const
- Future
- auto
- Unreal
- MOVE
- CPP
- Forwarding
- detach
- async
- C++
- Join
- Perfect
- Overloading
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |