목록C++/Effective C++ (32)
방프리
항목 34 : 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자 public 상속의 개념을 두 가지로 분류해서 나누어 볼 수 있습니다. (1). 함수 인터페이스의 상속 (2). 함수 구현의 상속 이 두가지를 간단하게 나누어보자면 함수인터페이스 상속 = 순수가상함수 함수 구현의 상속 = 단순가상함수 로 나눌 수 있습니다. 다음 예제 코드를 보면서 천천히 살펴보겠습니다. ex1) class Shape { public: virtual void draw() const = 0; //순수가상함수 virtual void error(const std::string&); //단순가상함수 int ObjectID() const(); //비가상함수 ... }; class Rectangle : public Shap..
항목 33: 상속된 이름을 숨기는 일은 피하자 이 세상에 존재하는 모든 것들은 이름을 가지고 있습니다. 사람들도 각각 이름을 가지고 있으며 동물, 식물들도 모두 이름을 가지고 있죠. 이번 항목에서는 모든 존재하는 것들이 이름을 가지듯이 프로그래밍에서도 이름이 중요하다는 것을 필자는 강조하고 있습니다. 일단 예제 코드를 먼저 보겠습니다. ex1) int x; // 전역 변수 void someFunc() { double x; //지역 변수 std::cin >> x; //입력을 받아, 지역변수 x에 새 값을 읽어 넣는다. } 어떤 변수에 사용이 될까요?? 전역 변수인 x? 아님 지역변수인 x??? 정답은 바로 지역변수인 x입니다. 이유가 궁금하신 분들을 위해 그림으로 간단하게 표현해보겠습니다. (그림 1-1)..
항목 32 : public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자 객체 지향 OOP의 3대 요소 중 하나인 상속!! 짚고 넘어가지 않을 수 없는데요. 책에서도 다른 건 다 까먹어도 되지만 이 항목만큼은 항상 기억하고 넘어가야 한다고 강조하고 있습니다. 그만큼 중요하다는 뜻이겠죠? 일반적으로 public 상속은 "...는 ...의 일종이다~" 라고 정의할 때 사용합니다. 이해가 잘 안되시죠? 차근차근 예를 들어서 살펴보겠습니다. 간단한 몬스터를 생성하는 클래스를 통해 알아보겠습니다. ex1) class cMonster { //do Something };//몬스터 모두를 지징하는 클래스 class cGoblin : public cMonster { //do Somethi..
항목 31 : 파일 사이의 컴파일 의존성을 최대로 줄이자 C++로 코딩을 하면서 기초로 배우는 것이 바로 #include란 키워드 입니다. .h파일을 포함함으로써 헤더파일 안에 있는 클래스의 정의나 구현부를 컴파일할 때 불러오는 역할을 하는 키워드인데요. 이번 항목에서는 #include 의 사용을 줄이자? 라고 할 수 있겠네요. C++의 클래스 정의는 클래스 인터페이스 뿐만 아니라 세부 구현 사항까지 많은 부분을 다루고 있습니다. 예를 들어 MMORPG게임의 경우엔 User 클래스 안에 수 많은 변수와 구현 함수들이 존재하죠. (기존 3~4만줄은 그냥 뛰어 넘는다고 보시면 됩니다.) 이렇게 수많은 작업을 처리하는 클래스에서 일을 하려면 같이 작업 해야하는 수 많은 클래스들을 User 클래스는 알아야 하기..
항목 30 : 인라인 함수는 미주알고주알 따져서 이해해 두자 - inline 함수... 정말 좋은 키워드입니다. 원래라면 함수를 호출할 때 메모리에 함수의 이름을 저장 한 후 함수를 호출 시 메모리에 기록된 함수의 포인터를 보고 함수를 실행시키는데요. 인라인 함수는 그 과정을 다 무시하고 함수의 내용 자체를 메모리에 올리도록 해줍니다. 그 덕분에 실행속도도 일반 함수에 비해 굉장히 빨라지게 됩니다. 최적화에 정말 도움이 많이 되는 키워드죠 하지만 이런 좋은 inline 함수도 나름의 단점을 가지고 있습니다. 1) 최적화에 오히려 방해가 될 수 있습니다. - inline 함수는 함수의 내용을 통째로 컴파일러에 요청을 하는 것입니다. 즉, 내용이 많으면 많을 수록 처리량 또한 많아진다는 뜻이죠. 2) 라이브..
항목 29 : 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! 코딩을 할 때 가장 염두해야할 것 중 하나를 고르자면 예외처리가 빠질 수 없습니다. 필자도 동물에 비유하면서까지 예외처리의 중요성을 설명할 정도이니깐요. 예외 안전성을 가진 함수면 예외가 발생시 다음과 같이 동작해야 합니다. 1) 자원이 새도록 만들지 않습니다. 2) 자료구조가 더럽혀지는 것을 허용하지 않습니다. 예외 안전성을 가진 함수는 아래의 세 가지 보장 중 하나를 제공하여 줍니다. 1) 기본적인 보장(basic guarantee) : 함수 동작 중에 예외가 발생하면, 실행 중인 프로그램에 관련된 모든 것들을 유효한 상태로 유지하겠다는 보장입니다. 하지만 사용자측에서는 예측할 수 없습니다. 2) 강력한 보장(string guaran..
항목 28 : 내부에서 사용하는 객체에 대한 '핸들'을 반환하는 코드는 되도록 피하자 이 항목에 대해 알아보기 전 '핸들'에 대해 먼저 짚고 가는 것이 좋을 것 같습니다. 핸들이란? 다른 객체에 접근할 수 있게 해주는 매개자를 말합니다. 간단하게 get, set 함수를 예를 들 수 있겠네요 get, set 함수는 캡슐화의 규약을 지키면서 데이터를 조작, 접근을 가능하게 해줍니다. 하지만 get, set 함수를 가지고 있는 클래스를 멤버변수로 가지고 있는 클래스에서도 데이터 조작이 가능해집니다. 즉, 캡슐화를 위해 만든 함수가 다른 방법을 통해 조작이 이루어진다는거죠 private 또는 protected로 선언된 변수들은 보호받을 권리가 있습니다. 이들 변수 외에도 포인터와 같은 핸들을 반환하는 코드로 된..
항목 27 : 캐스팅은 절약, 또 절약! 잊지 말자 - 필자는 캐스팅 스타일에 따라 다음과 같이 분류했습니다. (1) (DataType)expression // 표현식 부분을 DataType으로 캐스팅 합니다. (2) DataType(expression) // 표현식 부분을 DataType으로 캐스팅 합니다. (1)의 경우 C 문법 스타일의 캐스팅 방법이고, (2)의 경우 함수호출문과 비슷한 캐스팅 방법입니다. 두 방법은 서로 작성방식이 다르지만 결과값은 같습니다. 이 두가지 방식을 통틀어서 '구형 스타일의 캐스트'라고 합니다. C++의 경우엔 새로운 4가지의 캐스트 연산자를 독자적으로 제공합니다. const_cast : 객체 상수성을 없애는 용도로 사용됩니다. dynamic_cast : 안전한 다운캐스..