본문 바로가기

Programming399

예외처리(Exception Handling) 예외상황과 예외처리의 이해 예외는 프로그램의 실행 도중에 발생하는 문제상황을 의미합니다. 따라서 컴파일 시 발생하는 문법적인 에러는 예외의 범주에 포함되지 않습니다. #includeusing namespace std; int main(void){int num1, num2;cout > num1 >> num2; cout 2017. 8. 1.
템플릿2 C++ 표준 라이브러리는 템플릿을 기반으로 디자인된다. 따라서 템플렛을 잘 알면, 그만큼 라이브러리에 대한 이해도와 활용능력이 향상됩니다. Point 클래스를 다음의 형태로 템플릿화 하였습니다. BoundCheckArray 클래스 템플릿을 정의하였습니다. 위으 클래스 템플릿을 기반으로 Point 템플릿 클래스의 객체를 저장할 수 있는 객체는 어떻게 생성해야 할까? 템플릿 클래스라 하여 일반 클래스와 비교해서 다른 문법체계를 지니는 것은 아니니, 우리가 알고 있는 C++ 문법의 이해를 기반으로 템플릿과 관련된 다양한 확장이 가능합니다. 특정 템플릿 클래스의 객체를 인자로 받는 일반함수의 정의와 friend 선언 함수 템플릿을 특수화하는 이유는 특정 자료형에 대해서 구분이 되는 다른 행동을 보이기 위해서 입.. 2017. 8. 1.
템플릿(Template) 함수 템플릿은 함수를 만들어 낸다. 함수의 기능은 결정되어 있지만, 자료형은 결정되어 있지 않아서 결정해야 합니다. 함수 템플릿이라는 것은 함수를 만드는 도구가 됩니다. 함수 템플릿도 다양한 자료형의 함수를 만들어 낼 수 있습니다. T는 자료형을 결정짓지 않겠다는 의미로 사용한 것입니다. 즉, 함수를 만들어 내는 템플릿을 정의하기 위해서 사용된 것입니다. #include using namespace std; template T Add(T num1, T num2){return num1 + num2;} int main(void){cout 2017. 8. 1.
연산자 오버로딩 2 대입 연산자의 오버로딩은 클래스 정의에 있어서 생성자, 복사 생성자와 하께 빠질 수 없는 요소입니다. 객체간 대입연산의 비밀: 디폴트 대입 연산자정의하지 않으면 디폴트 복사 생성자가 삽입됩니다. 디폴트 복사 생성자는 멤버 대 멤버의 복사를 진행합니다. 생성자 내에서 동적 할당을 한다면, 깊은 복사가 필요하다면 직접 정의해야 합니다. 정의하지 않으면 디폴트 대입 연산자가 삽입됩니다. 디폴트 대입 연산자는 메버 대 멤버의 복사(얕은 복사)를 진행합니다. 연산자 내에서 동적 할당을 한다면, 깊은 복사가 필요하다면 직접 정의해야 합니다. pos2도, 그리고 pos1도 이미 생성 및 초기화가 진행된 객체라는 사실입니다. #pragma warning(disable:4996) #include using namespa.. 2017. 8. 1.
OOP 단계별 프로젝트 7단계 단계별 프로젝트를 진행하기에 앞서 하나의 파일을 여러 개로 나눠서 내용을 정리할 필요가 있습니다. 하나의 파일 안에 모든 것이 다들어있어서 내용파악이 쉽지 않기 때문입니다. 각각의 클래스마다 선언은 헤더파일에 정의는 시플플파일에 저장하는 것이 좋습니다. 이렇게 하면 프로그램을 관리하기도 좋고, 또 클래스의 구성이 한눈에 들어오기 때문에 프로그램의 내용을 파악하기도 수월해지기 때문입니다. 짧은 프로그램이라 할지라도 하나의 파일에 필요한 모든 요소를 담는 것은 바람직하지 못합니다. NormalAccount 클래스와 HighCreditAccount 클래스는 크기가 작은 관계로 멤버함수의 정의를 별도의 파일에 분리하지 않고 헤더파일에 모두 삽입하는 형태로 파일을 분합합니다. #pragma warning(disa.. 2017. 8. 1.
가상함수 가상함수의 선언은 virtual 키워드의 선언을 통해서 이뤄집니다. 이 함수를 오버라이딩 하는 함수도 가상함수가 됩니다. #include using namespace std; class First{public:virtual void MyFunc() { cout 2017. 8. 1.
상속과 다형성 객체지향에서 가장 중요하다고 할 수 있는 다형성을 공부할 때 입니다. 객체 포인터의 참조 관계Person * ptr;ptr=new Person();위의 두 문장이 실행되면, 포인터 ptr은 Person 객체를 가리키게 됩니다. 그런데 Person형 포인터는 Person 객체뿐만 아니라, Person을 상속하는 유도 클래스의 객체도 가리킬 수 있습니다. C++ 에서, AAA형 포인터 변수는 AAA 객체 또는 AAA를 직접 혹은 간접적으로 상속하는 모든 객체를 가리킬 수 있다. 객체의 주소 값을 저장할 수 있다. #pragma warning(disable:4996) #include using namespace std; class Person{public:void Sleep() { cout 2017. 7. 31.
상속(Inheritance)의 이해 객체지향이 지니는 이점은 모델링에 근거를 둡니다. 기존에 정의해 놓은 클래스의 재활용을 목적으로 만들어진 문법적 요소가 상속이다. #pragma warning(disable:4996)#include #include using namespace std; class PermanentWorker{private:char name[100];int salary;public:PermanentWorker(char* name, int money):salary(money){strcpy(this->name, name);}int GetPay() const{return salary;}void ShowSalaryInfo() const{cout 2017. 7. 31.
friend 와 static 그리고 const const 객체와 const 객체의 특성들다음과 같이 변수를 상수화 하듯이, const int num=10; 다음과 같이 객체를 상수화할 수 있습니다. const SoSimple sim(20); 이 객체를 대상으로는 const 멤버함수만 호출이 가능하다. 이는 객체의 const 선언이 다음의 의미를 갖기 때문입니다. 이 객체의 데이터 변경을 허용하지 않겠습니다. 때문에 const 멤버함수의 호출만 허용하는 것입니다. 변경시킬 능력이 있는 함수는 아예 호출을 허용하지 않는 것입니다. #include using namespace std; class SoSimple{private:int num;public:SoSimple(int n) : num(n){ }SoSimple& AddNum(int n){num += .. 2017. 7. 31.
복사 생성자(Copy Constructor) 복사 생성자가 생소하긴 해도 생성자의 한 형태일 뿐입니다. 우리는 지금까지 다음과 같은 방식으로 변수와 참조자를 선언 및 오기화해 왔습니다. int num=20; int &ref=num; 하지만 C++에서 다음의 방식으로 선언 및 초기화가 가능합니다. int num(20); int &ref(num); 위의 두 가지 초기화 방식은 결과적으로 동일합니다. C++ 의 모든 객체는 생성자의 호출을 동반한다고 했는데, sim2의 생성자 호출에 대해서는 언급한 바가 없습니다. 과연 sim2는 어떠한 과정을 거쳐서 생성되는 것일까요? SoSimple sim2(sim1); 이 문장에 담겨있는 내용을 정리하면 다음과 같습니다. SoSimple형 객체를 생성합니다. 객체의 이름은 sim2로 정합니다. sim1을 인자로 받.. 2017. 7. 31.