목록Tutorials/C++ : Advanced (99)
KoreanFoodie's Study
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 19 : 클래스 설계는 타입 설계와 똑같이 취급하자 핵심 : 클래스 설계는 타입 설계이다. 새로운 타입을 정의하기 전에, 이번 항목에 나온 모든 고려사항을 빠짐없이 점검해 보자! C++ 에서 새로운 클래스를 정의한다는 것은 새로운 타입을 하나 정의하는 것과 같다. 따라서 다음과 같은 요소들을 숙고한 후 만들어 보자! 새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가? (operator new, operator delete[] 등등) 객체 초기화는 객체 대입과 어떻게 달라야 하는가? 새로운 타입으로 만든 객체가 값에 의해..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 18 : 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자 핵심 : 1. 좋은 인터페이스는 제대로 쓰기에 쉬우며 엉터리로 쓰기에 어렵다. 인터페이스를 만들 때는 이 특성을 지닐 수 있도록 고민하고 또 고민하자 2. 인터페이스의 올바른 사용을 이끄는 방법으로는 인터페이스 사이의 일관성 잡아주기, 그리고 기본제공 타입과의 동작 호환성 유지하기가 있다. 3. 사용자의 실수를 방지하는 방법으로는 새로운 타입 만들기, 타입에 대한 연산을 제한하기, 객체의 값에 대해 제약 걸기, 자원 관리 작업을 사용자 책임으로 놓지 않기가 있..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 17 : new 로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자 핵심 : new 로 생상한 객체를 스마트 포인터로 넣는 코드는 별도의 한 문장으로 만들자. 이것이 안 되어 있으면, 예외가 발생될 때 디버깅하기 힘든 자원 누출이 초래될 수 있다! 처리 우선순위를 알려주는 함수가 하나 있고, 동적으로 할당한 Widget 객체에 대해 어떤 우선순위에 따라 처리를 적용하는 함수가 하나 있다고 가정하자. int priority(); void processWidget(std::shared_ptr pw, int prio..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 16 : new 및 delete 를 사용할 때는 형태를 반드시 맞추자 핵심 : new 표현식에 [ ] 를 썼으면, 대응되는 delete 표현식에도 [ ] 를 써야 한다. 마찬가지로, new 표현식에 [ ] 를 안 썼으면, 대응되는 delete 표현식에도 [ ] 를 쓰지 말아야 한다. 아래 코드는 어떤 부분이 잘못되었을까? std::string *stringArray = new std::string[100]; ... delete stringArray; stringArray 는 배열이므로, delete[] 를 사용하지 않으면 배열의 객체 ..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 15 : 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자 핵심 : 1. 실제 자원을 직접 접근해야 하는 기존 API 들도 많기 때문에, RAII 클래스를 만들 때는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어 주어야 한다. 2. 자원 접근은 명시적 변환 혹은 암시적 변환을 통해 가능하다. 안전성만 따지면 명시적 변환이 대체적으로 더 낫지만, 고객 편의성을 놓고 보면 암시적 변환이 괜찮다. 다음의 경우처럼, RAII 클래스의 객체를 그 객제가 감싸고 있는 실제 자원으로 변환해야 하는 경우가 종종 생긴다. ..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 14 : 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자 핵심 : 1. RAII 객체의 복사는 그 객체가 관리하는 자원의 복사 문제를 안고 가기 때문에, 그 자원을 어떻게 복사하느냐에 따라 RAII 객체의 복사 동작이 결정된다. 2. RAII 클래스에 구현하는 일반적인 복사 동작은 복사를 금지하거나 참조 카운팅을 해 주는 선으로 마무리하는 것이다. 하지만 이 외의 방법들도 가능하다! 우리가 직접 RAII 클래스를 만들어야 하는 다음과 같은 상황이 생겼다고 가정하자. class Lock { public: explicit Lock(..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 13 : 자원 관리에는 객체가 그만! 핵심 : 1. 자원 누출을 막기 위해, 생성자 안에서 자원을 획득하고 소멸자에서 그것을 해제하는 RAII 객체를 사용하자 2. 일반적으로 널리 쓰이는 RAII 클래스는 shared_ptr 그리고 auto_ptr 이다. 이 둘 가운데 shared_ptr 이 복사 시의 동작이 직관적이기 때문에 대개 더 좋다. 반면, auto_ptr 은 복사되는 객체(원본 객체) 를 null 로 만들어 버린다. -> auto_ptr 은 C++ 11 이후로 쓸 수 없게 됨! 대신 unique_ptr 를 사용한다 스마트 포..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 12 : 객체의 모든 부분을 빠짐없이 복사하자 핵심 : 1. 객체 복사 함수는 주어진 객체의 모든 데이터 멤버 및 모든 클래스 부분을 빠뜨리지 말고 복사해야 한다. 2. 클래스의 복사 함수 두 개를 구현할 때, 한 쪽을 이용해서 다른 쪽을 구현하려는 시도는 절대로 하지 말자. 그 대신, 공통된 동작을 제 3의 함수에다 분리해 놓고 양쪽에서 이것을 호출하게 만들어서 해결하자. 복사 생성자와 복사 대입 연산자를 통틀어 객체 복사 함수(copying function) 이라고 부른다. 그런데 컴파일러가 이들을 기본으로 만들다 보니, 사용자가 ..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 11 : operator= 에서는 자기대입에 대한 처리가 빠지지 않도록 하자 핵심 : 1. operator= 를 구현할 때, 어떤 객체가 그 자신에 대입되는 경우를 제대로 처리하도록 만들자. 원본 객체와 복사대상 객체의 주소를 비교해도 되고, 문장의 순서를 적절히 조정할 수도 있으며, 복사 후 맞바꾸기 기법을 써도 된다. 2. 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 사실 같은 객체인 경우에 정확하게 동작하는지 확인하자. 이런 코드는 사실 적법한(legal) 코드이다. class Widget{ ...
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 10 : 대입 연산자는 *this 의 참조자를 반환하게 하자 핵심 : 대입 연산자는 *this 의 참조자를 반환하도록 만들어라 C++ 의 대입 연산은 여러 개가 사슬처럼 엮일 수 있다. int x, y, z; // 대입은 우측 연관(right-associative)이다. x = y = z = 15; // 따라서 위 식은 실제로 아래와 같다 x = (y = (z = 15))); 대입 연산이 사슬처럼 엮이려면 대입 연산자가 좌변 인자에 대한 참조자를 반환하도록 구현하는 것이 좋다(일종의 관례[convention] 이다). 이는 += , -..