Programming Study/C++ 썸네일형 리스트형 C++의 형 변환 연산자 1. C++에서의 형 변환 연산 C++ 진영에서는 C 스타일의 형 변환 연산자를 가리켜 '오래된 C 스타일 형 변환 연산자(Old C-style cast operator)'라 부르기도 한다. 이렇듯 C 스타일의 형 변환 연산자는 C언어와의 호환성을 위해서 존재할 뿐, C++에서는 새로운 형 변환 연산자와 규칙을 제공하고 있다. C++에서는 다음과 같이 총 4개의 연산자를 추가로 제공하면서 용도에 맞는 형 변환 연산자의 사용을 유도하고 있다. - static_cast - const_cast - dynamic_cast - reinterpret_cast 위의 형 변환 연산자들을 사용하면 프로그래머는 자신이 의도한 바를 명확히 표시할 수 있다. 따라서 컴파일러도 프로그래머의 실수를 지적해 줄 수 있고, 코드를 .. 더보기 예외처리(Exception Handling) 1. 예외상황과 예외처리의 이해 예외처리에서의 '예외'는 프로그램 실행 도중에 발생하는 '예외적인 상황'을 의미한다. 그리고 C++은 이러한 예외적인 상황의 처리를 위한 문법을 별도로 제공하고 있다. 예외상황을 처리하지 않았을 때의 결과 C++에서 말하는 '예외(Exception)'는 프로그램의 실행 도중에 발생하는 문제상황을 의미한다. 따라서 컴파일 시 발생하는 문법적인 에러는 예외의 범주에 포함되지 않는다. '예외'라는 것은 문법적인 오류가 아닌, 프로그램의 논리에 맞지 않는 상황을 의미한다. 예제를 통해 알아보자. #include using namespace std; int main(void) { int num1, num2; coutnum1>>num2; cout 더보기 템플릿_2 1. 템플릿_1 내용의 확장 Point 클래스 템플릿과 배열 클래스 템플릿 앞에서 우리는 Point 클래스를 다음의 형태로 템플릿화 하였다. template class Point { private: T xpos, ypos; public: Point(T x=0, T y=0); void ShowPosition() const; }; 그리고 다음의 형태로 BoundCheckArray 클래스 템플릿을 정의하였다. template class BoundCheckArray { private: T * arr; int arrlen; BoundCheckArray(const BoundCheckArray& arr){ } BoundCheckArray& operator=(const BoundCheckArray& arr) { } p.. 더보기 템플릿_1 1. 템플릿(Template)에 대한 이해와 함수 템플릿 템플릿에는 '모형자'라는 뜻이 담겨 있다. 함수를 대상으로 템플릿 이해하기 '함수 템플릿'은 함수를 만들어 낸다. 함수의 기능은 결정되어 있지만, 자료형은 결정되어 있지 않아서 결정해야 한다. 예를 통해 살펴보자 int Add(int num1, int num2) { return num1+num2; } T Add(T num1, T num2) { return num1+num2; } - 함수의 기능 덧셈 - 대상 자료형 int형 데이터 - 함수의 기능 덧셈 - 대상 자료형 결정되어 있지 않음 위를 살펴보면 int형 선언을 T로 대신 했음을 알 수 있는데, 이는 자료형을 결정짓지 않은, 그래서 나중에 T를 대신해서 실제 자료형을 결정하겠다는 뜻이다. 그런.. 더보기 String 클래스의 디자인 1. C++의 표준과 표준 string 클래스 표준 string 클래스 C++ 표준 라이브러리에는 string이라는 이름의 클래스가 정의되어 있다. 클래스의 이름이 의미하는 것처럼, 문자열의 처리를 목적으로 정의된 클래스이며, 이 클래스의 사용을 위해서는 헤더파일 을 포함해야 한다. 다음은 string 클래스의 사용 예제이다. #include #include using namespace std; int main(void) { string str1 = "I like "; string str2 = "string class"; string str3 = str1 + str2; cout 더보기 연산자 오버로딩_2 1. 반드시 해야 하는 대입 연산자의 오버로딩 대입 연산자의 오버로딩은 그 성격이 복사 생성자와 매우 유사하다. 객체간 대입연산의 비밀: 디폴트 대입 연산자 잠시 복사 생성자에 대해서 복습해보자. 다음은 이전에 설명한 복사 생성자의 대표적인 특성이다. - 정의하지 않으면 디폴트 복사 생성자가 삽입된다. - 디폴트 복사 생성자는 멤버 대 멤버의 복사(얕은 복사)를 진행한다. - 생성자 내에서 동적할당을 한다면, 그리고 깊은 복사가 필요하다면 직접 정의해야 한다. 그리고 다음은 대입 연산자의 대표적인 특성이다. - 정의하지 않으면 디폴트 대입 연산자가 삽입된다. - 디폴트 대입 연산자는 멤버 대 멤버의 복사(얕은 복사)를 진행한다. - 연산자 내에서 동적 할당을 한다면, 그리고 깊은 복사가 필요하다면 직접 .. 더보기 연산자 오버로딩_1 1. 연산자 오버로딩의 이해와 유형 함수가 오버로딩 되면, 오버로딩 된 수만큼 다양한 기능을 제공하게 된다. 즉, 이름은 하나이지만 기능은(기능을 제공하는 함수는) 여러 가지가 되는 셈이다. 마찬가지로 연산자의 오버로딩을 통해서, 기존에 존재하던 연산자의 기본 기능 이외에 다른 기능을 추가할 수 있다. 연산자를 오버로딩 하는 두 가지 방법 연산자를 오버로딩 하는 방법에는 다음 두 가지가 있다. - 멤버함수에 의한 연산자 오버로딩 - 전역함수에 의한 연산자 오버로딩 동일한 자료형을 대상으로 + 연산자를 전역함수 기반으로, 그리고 멤버함수 기반으로 동시에 오버로딩 할 경우, 멤버함수 기반으로 오버로딩 된 함수가 전역함수 기반으로 오버로딩 된 함수보다 우선시 되어 호출된다. 오버로딩이 불가능한 연산자의 종류 .. 더보기 가상(Virtual)의 원리와 다중상속(Multiple Inheritance) 1. 멤버함수와 가상함수의 동작 원리 지금까지는 객체 내에 멤버함수가 존재한다고 설명해 왔다. 하지만 이는 사실이 아니다. 객체 안에 정말로 멤버함수가 존재하는가? C++로 작성한 코드와 C언어로 이를 흉내낸 코드를 통해서 알아보자 우선 C++로 작성한 간단한 클래스 와 객체에 관한 소스이다. #include using namespace std; class Data { private: int data; public: Data(int num) : data(num) {} void ShowData() {cout 더보기 상속과 다형성(Polymorphism) 1. 객체 포인터의 참조관계 객체 포인터 변수 : 객체의 주소 값을 저장하는 포인터 변수 유도클래스의 객체까지 가리킬 수 있다니! 객체포인터의 다음 특성은, 상속의 IS-A 관계를 통해서 논리적으로 이해가 가능하다. C++에서, AAA형 포인터 변수는 AAA 객체 또는 AAA를 직접 혹은 간접적으로 상속하는 모든 객체를 가리킬 수 있다(객체의 주소 값을 저장할 수 있다). 포인터의 특성을 임의의 클래스 AAA, BBB, CCC를 이용해서 정리해 보자. 아래의 그림은 일반적인 클래스의 상속표현을 나타낸 것이다. 위의 경우 기본적으로 다음 두 문장이 성립한다. "BBB는 AAA이다." 또는 "BBB는 AAA의 일종이다." "CCC는 BBB이다." 또는 "CCC는 BBB의 일종이다." 그리고 IS-A 관게는 .. 더보기 상속(Inheritance)의 이해 1. 상속에 들어가기에 앞서 과거의 상속의 개념 - 기존에 정의해 놓은 클래스의 재활용을 목적으로 만들어진 문법적 요소가 상속이다. 컨트롤 클래스 - 기능의 처리를 실제로 담당하는 클래스를 가리켜 '컨트롤 클래스' 또는 '핸들러 클래스'라 한다. - 기능 제공의 핵심이 되기 때문에 모든 객체지향 프로그램에서 반드시 존재하는 클래스이다. 소프트웨어의 설계에 있어 중요시 하는 것들 중 하나 - 요구사항의 변경에 대응하는 프로그램의 유연성 - 기능의 추가에 따른 프로그램의 확장성 2. 상속의 문법적인 이해 용어의 정리 유도클래스의 객체 생성과정 유도 클래스의 객체생성 과정에서 기초 클래스의 생성자는 100% 호출된다. 유도 클래스의 생성자에서 기초 클래스의 생성자 호출을 명시하지 않으면, 기초 클래스의 voi.. 더보기 이전 1 2 다음