목록Tutorials/C++ : Advanced (99)
KoreanFoodie's Study
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 29 : 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! 핵심 : 1. 예외 안전성을 갖춘 함수는 실행 중 예외가 발생되더라도 자원을 누출시키지 않으며 자료구조를 더럽힌 채로 내버려 두지 않는다. 이런 함수들이 제공할 수 있는 예외 안전성 보장은 기본적인 보장, 강력한 보장, 예외 금지 보장이 있다. 2. 강력한 예외 안전성 보장은 '복사-후-맞바꾸기' 방법을 써서 구현할 수 있지만, 모든 함수에 대해 강력한 보장이 실용적인 것은 아니다. 3. 어떤 함수가 제공하는 예외 안전성 보장의 강도는, 그 함수가 내부적으로 호출하는 함수들..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 28 : 내부에서 사용하는 객체에 대한 '핸들'을 반환하는 코드는 되도록 피하자 핵심 : 어떤 객체의 내부요소에 대한 핸들(참조자, 포인터, 반복자) 를 반환하는 것은 되도록 피하자. 캡슐화 정도를 높이고, 상수 멤버 함수가 객체의 상수성을 유지한 채로 동작할 수 있도록 하며, 무효참조 핸들이 생기는 경우를 최소화할 수 있다. 클래스 내부의 데이터를 참조자로 반환하는 것은 주의해야 한다. 다음 예시를 보자. clas Point { public: Point(int x, int y); ... void setX(int newVal); voi..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 27 : 캐스팅은 절약, 또 절약! 잊지 말자 핵심 : 1. 다른 방법이 가능하다면 캐스팅은 피하자. 특히 수행 성능에 민감한 코드에서 dynamic_cast 는 몇 번이고 다시 생각하자. 설계 중에 캐스팅이 필요해졌다면, 캐스팅을 쓰지 않는 다른 방법을 시도해 보자. 2. 캐스팅이 어쩔 수 없이 필요하다면, 함수 안에 숨길 수 있도록 해 보자. 이렇게 하면 최소한 사용자는 자신의 코드에 캐스팅을 넣지 않고 이 함수를 호출할 수 있게 된다. 3. 구형 스타일의 캐스트를 쓰려거든 C++ 스타일의 캐스트를 선호하자. 발견하기도 쉽고, 설계..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 26 : 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자 핵심 : 변수 정의는 늦출 수 있을 때까지 늦추자. 프로그램이 더 깔끔해지며 효율도 좋아진다! 다음 예시를 보자. std::string encryptPassword(const std::string& password) { using namespace std; string encrypted; // 1. encrypted 와 관련 없는 일 ... // 2. encrypted 와 관련 있는 일 ... return encrypted; } 1번에서 예외가 발생해서 의미없게 encr..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 25 : 예외를 던지지 않는 swap 에 대한 지원도 생각해 보자 핵심 : 1. std::swap 이 사용자 정의 타입에 대해 느리게 동작할 여지가 있다면 swap 멤버 함수를 제공하자. 이 멤버 swap 은 예외를 던지지 않도록 만들자. 2. 멤버 swap 을 제공했으면, 이 멤버를 호출하는 비멤버 swap 도 제공하자. 클래스(템플릿이 아닌)에 대해서는, std::swap 도 특수화해 두자. 3. 사용자 입장에서 swap 을 호출할 때는, std::swap 에 대한 using 선언을 넣어 준 후에 네임스페이스 한정 없이 swap 을..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 24 : 타입 변환이 모든 매개변수에 대해 적용되어야 한다면 비멤버 함수를 선언하자 핵심 : 어떤 함수에 들어가는 모든 매개변수(this 포인터가 가리키는 객체도 포함해서) 에 대해 타입 변환을 해 줄 필요가 있다면, 그 함수는 비멤버이어야 한다. 유리수를 나타내는 클래스가 있다고 하고, 곱셉 연산을 만든다고 가정하자. class Rational { public: Rational(int numerator = 0, int denominator = 1); int numerator() const; int denominator() const;..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 23 : 멤버 함수보다는 비멤버 비프렌드 함수와 더 가까워지자 핵심 : 멤버 함수보다는 비멤버 비프렌드 함수를 자주 쓰자. 캡슐화 정도가 높아지고, 패키징 유연성도 커지며, 기능적인 확장성도 늘어난다. 웹 브라우저에서 캐시를 비우는 함수, URL 기록을 없애는 함수, 쿠키를 제거하는 함수가 있다고 하자. 세 동작을 동시에 하도록 만드는 함수를 정의할 때, 멤버 함수로 만드는 것이 좋을까, 비멤버 함수로 제공하는 것이 더 좋을까? class WebBrowser { public: void clearCache(); void clearHist..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 22 : 데이터 멤버가 선언될 곳은 private 영역임을 명심하자 핵심 : 1. 데이터 멤버는 private 멤버로 선언하자 이를 통해 클래스 제작자는 문법적으로 일관성 있는 데이터 접근 통로를 제공할 수 있고, 필요에 따라서는 세밀한 접근 제어도 가능하며, 클래스의 불변속성을 강화할 수 있을 뿐 아니라, 내부 구현의 융통성도 발휘할 수 있다. 2. protected 는 public 보다 더 많이 '보호' 받고 있는 것이 절대로 아니다. 먼저, 데이터 멤버에 public 대신 private 을 써야 하는 이유를 알아보자. 문법적 일관..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 21 : 함수에서 객체를 반환해야 할 경우에 참조자를 반환하려고 들지 말자 핵심 : 1. 지역 스택 객체에 대한 포인터나 참조자를 반환하는 일, 혹은 힙에 할당된 객체에 대한 참조자를 반환하는 일, 또는 지역 정적 객체에 대한 포인터나 참조자를 반환하는 일은 그런 객체가 두 개 이상 필요해질 가능성이 있다면 절대로 하지 말자(항목 4를 보면 단일 스레드 환경에서의 적절한 코드 예제를 찾을 수 있다) 유리수를 표현하는 클래스의 곱셈 operator 를 다음과 같이 정의하면, 각기 다른 문제가 발생한다! // 1. result 객체를 생성..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 20 : '값에 의한 전달' 보다는 '상수객체 참조자에 의한 전달' 방식을 택하는 편이 대개 낫다 핵심 : 1. '값에 의한 전달' 보다는 '상수 객체 참조자에 의한 전달' 을 선호하자. 대체적으로 효율적일 뿐만 아니라 복사손실 문제까지 막아준다. 2. 이번 항목에서 다룬 법칙은 기본제공 타입 및 STL 반복자, 그리고 함수 객체 타입에는 맞지 않는다. 이들에 대해서는 '값에 의한 전달' 이 더 적절하다. 기본적으로 C++ 는 함수로부터 객체를 전달받거나 전달할 때 '값에 의한 전달(pass-by-value)' 방식을 사용한다. 이러한..