반응형

언어 자료구조 알고리즘/Escort C++ 59

[C++] 전역 템플릿 함수

9.1 템플릿이란? 템플릿은 '틀'이라는 사전적 의미를 지니고 있습니다. C++언어의 템플릿 문법은 가상의 코드를 정의하면 컴파일러가 이를 사용하는 부분을 컴파일하면서 구체화한 코드를 생성하는 틀을 말합니다. 즉, 템플릿으로 정의한 코드는 가상의 코드이며 실제 구체화한 코드는 컴파일 시에 컴파일 전개로 생성됩니다. 이러한 이유로 템플릿 코드는 헤더에 작성하는 것이 일반적입니다. 템플릿으로 가상의 코드를 정의하면 대부분 사용할 인자의 형식은 다르지만 수행해야 할 논리가 같을 경우입니다. 9.2 전역 템플릿 함수 템플릿 문법을 이용하여 template 전역 함수를 만드는 방법에 대해 살펴봅시다. 템플릿 함수는 다음과 같이 작성합니다. template [리턴형식] 템플릿 함수명(입력인자리스트){ [코드]} 이..

[C++] 8. 구조화 된 예외처리

8. 구조화 된 예외처리 C++ 언어는 탄생 후에 시대 흐름에 맞게 생존하기 위해 새로운 문법들이 계속 추가되었습니다. 이 중의 하나가 namespace이고 또 다른 하나로 구조화된 예외처리가 있습니다. 이 외에도 #pragma 를 비롯하여 여러 종류의 확장자를 가능하게 하는 등의 많은 사항이 추가되었는데 여기에서는 구조화된 예외처리에 대해 살펴보기로 하겠습니다. 구조화된 예외처리는 특정 구문을 수행함에 개발자의 논리적 버그나 사용자의 잘못된 사용으로 인한 오류 외에도 발생하지 말아야 할 특수한 상황으로 더이상 진행하지 못하는 예외 등을 개발 단계에서 빠르게 확인할 수 있고 개발자의 의도에 맞게 해당 상황을 처리하기 위해 생겨났습니다. 어떻게 보면 이미 Java에서 제공되었는 구조화된 예외처리를 C++에..

[C++] 함수 개체 실습의 Zone 클래스 구현 예제 코드

다음은 Zone 클래스의 전체 구현된 예제 코드입니다. Zone.cpp #include "Zone.h" //번호로 검색 시에 사용할 클래스 정의 class SearchByNumFun :public Search { int num; public: SearchByNumFun(int _num){num = _num;} virtual bool operator()(Member *mem) { return mem->GetNum() == num; } }; //이름으로 검색 시에 사용할 클래스 정의 class SearchByNameFun :public Search { string name; public: SearchByNameFun(string _name){name = _name;} virtual bool operator(..

[C++] 함수 개체

7.4 함수 개체 함수 개체란 함수 호출 연산자가 중복 정의되어 해당 개체를 함수처럼 사용할 수 있는 개체를 말합니다. 이는 직접 연관 관계에 있을 때에 명령을 내릴 수 있는 개체는 명령을 받아 수행하는 개체의 위치를 알고 있지만, 역으로 명령을 받아 수행하는 개체가 명령을 내리는 개체를 알게 구현하는 것은 전체 프로그램 구조를 취약하게 만듭니다. 하지만 특정한 경우에 피 명령 개체가 특정 사실을 명령 개체에게 알려줄 필요가 생기는데 이 같은 경우에 콜백(호출하는 방향이 제공자에서 사용자를 호출하는 것)을 구현하게 됩니다. 이와 같은 콜백을 구현함에 있어 명령 개체에서 정의한 함수를 피 명령 개체에게 명령을 지시할 때 입력 인자로 전달하여 해당 함수가 정의된 코드를 수행하게 할 수 있습니다. 또 다른 방..

[C++] 개체 출력자

7.3 개체 출력자 C++ 표준 기구에서는 iostream은 프로그램의 데이터를 출력 스트림에 보내거나 입력 스트림으로부터 데이터를 얻어오기 위한 목적으로 제공하고 있습니다. 여기에서는 우리가 정의하는 형식 개체에 대해서도 출력 스트림인 ostream을 통해 내보내는 방법에 대해 먼저 얘기를 해 보도록 합시다. 개체의 정보를 다른 매체로 내보내는 도구를 개체 출력자라 합니다. 여기에서는 ostream을 통해 개체의 정보를 다른 매체로 내보내기 위한 방법을 살펴볼 것입니다. 우리는 이미 cout이라는 ostream 기반의 개체와 LikeAsOStream.cpp #include "LikeAsOStream.h" const char *Endl="\n"; LikeAsOStream &LikeAsOStream::op..

[C++] 증감 연산자 중복 정의

7.2.4 증감 연산자 중복 정의 이번에는 증감 연산자 중복 정의에 대하여 살펴보기로 합시다. 아시는 것처럼 증감 연산자는 단항 연산자이면서 전위에 연산자가 오거나 후위에 연산자가 올 수 있습니다. 그리고 전위에 왔을 때와 후위에 왔을 떄 수행되는 연산의 결과는 내부의 값이 1 증가 혹은 1 감소이지만 연산 결과는 전위에 왔을 떄에는 연산 후의 결과 자체가 오고 후위에 왔을 떄에는 연산을 수행하기 이전의 값이 오게 됩니다. 그런데 증감 연산자를 중복 정의할 때 입력 매개 변수 리스트는 어떻게 결정해야 전위인지 후위인지 컴파일러가 판단할 수 있을까요? C++언어에서 증감 연산자의 후위 연산을 중복 정의할 때에는 피연산자를 int 형식이 추가로 오는 것으로 표현하도록 약속하였습니다. 간단한 예를 통해 살펴보..

[C++] 묵시적 형 변환 연산자 중복 정의

7.2.3 묵시적 형 변환 연산자 중복 정의 C++언어에서 int 형식과 char 형식은 상호 묵시적 형 변환이 가능합니다. 이는 int 형식 변수에 char 형식의 값을 대입한다고 하더라도 컴파일 내부에서 묵시적으로 char 형식의 값을 int 형식의 값으로 묵시적 형 변환하여 대입하기 때문입니다. C++언어에서는 사용자 정의 형식에 대해서도 묵시적 형 변환 연산자를 중복 정의할 수 있게 문법을 제공하고 있습니다. 이 경우 형 변환하고자 하는 형식명을 묵시적 형 변환 연산자 중복 정의에 나타내는 연산 기호로 사용이 되며 리턴 형식은 형 변환하고자 하는 형식임이 자명하므로 개발자가 잘못된 리턴 형식을 기재할 수 없도록 하고 있습니다. 즉, 묵시적 형 변환 연산자를 중복 정의할 때 리턴 형식을 명시할 수 ..

[C++] 인덱스 연산자 중복 정의 (배열 클래스 정의)

7.2.2 [ ] 연산자 중복 정의 이번에는 배열과 같은 다른 자료들을 보관하는 컬렉션에서 보관된 자료에 접근하기 위해 제공하는 [] 연산자 중복 정의에 관해 얘기해 보도록 하겠습니다. 먼저, [] 연산자의 피 연산자를 무엇으로 할 것인지와 리턴 형식을 무엇으로 하는 것이 타당한지에 대해 살펴봅시다. 이를 위해 C언어와 C++에서 배열을 사용하는 예를 살펴볼게요. int arr[10];int i=0;arr[8]=i;i=arr[8]; 위의 코드와 같이 [] 연산자에는 배열의 이름과 index가 피 산자로 오게 됩니다. 우리는 배열과 같이 자료들을 보관할 컬렉션을 구현할 것이기 때문에 []연산자의 좌항은 우리가 정의할 컬렉션 형식이 오게 하고 우항으로 index에 해당하는 정수가 오게 하면 되겠네요. 그렇다..

[C++] 대입 연산자 중복 정의

7.2 연산자 중복 정의 예 C++ 언어에서 연산자 중복 정의를 할 때 연산 종류에 따라 좀 더 세심한 주의를 해야 하는 연산들이 있습니다. 여기에서는 이러한 연산 중에 대입 연산, [] 연산, 묵시적 형 변환 연산, 증감 연산에 대해 살펴봅시다. 7.2.1 대입 연산자 중복 정의 C++에서 클래스를 정의할 때 사용자가 정의하지 않아도 컴파일러에 의해 기본적으로 제공되는 디폴트 멤버들이 있습니다. 이러한 멤버에는 this, 디폴트 기본 생성자, 디폴트 소멸자, 디폴트 복사 생성자 및 디폴트 대입 연산자가 있습니다. 여기서는 디폴트 대입 연산자에 대해 알아보기로 하겠습니다. C++에서 클래스를 정의할 때 대입 연산자를 중복정의를 하지 않으면 컴파일러에 의해 기본적으로 디폴트 대입 연산자를 정의해 줍니다. ..

[C++] 클래스에 연산자 중복 정의

7.1.2 클래스에 연산자 중복 정의 연산자 중복 정의는 전역과 클래스에서 할 수 있다고 하였습니다. 이번에는 클래스에서 연산자 중복 정의를 하는 방법에 관하서 얘기해 보도록 합시다. 클래스에서 연산자 중복 정의를 할 때에는 클래스 내에 어떠한 연산에 대해서 중복 정의할 것인지 캡슐화하고 이에 대해 구현을 해야 합니다. 이때, 전역에서 정의하는 것과 다른 점은 피연산자 중에 좌항은 해당 클래스 형식으로 약속된다는 점입니다. 그리고 캡슐화할 때 자신의 형식에 대한 피연산자는 입력 매개변수 리스트에서 생략합니다. Stu.cpp #include "Stu.h" Stu::Stu(int _num,string _name):num(_num) { name = _name; } int Stu::GetNum()const { ..

반응형