반응형

언어 자료구조 알고리즘 1251

[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 { ..

[C++] 전역 연산자 중복 정의

7.1.1 전역 연산자 중복 정의 전역에서 연산자 중복 정의를 할 때에는 다음과 같은 포맷을 갖게 됩니다. [리턴 형식] operator [연산기호] (피 연산자 리스트){ [기능 구현]} 전역 연산자 중복 정의를 하는 간단한 예를 들어 보기로 할게요. 학생 클래스에 기본 키 역할을 하는 번호 필드를 반환하는 메서드를 이용을 하는 것을 == 연산자를 사용할 수 있도록 만들어 보겠습니다. Stu.cpp #include "Stu.h" Stu::Stu(int _num,string _name):num(_num) { name = _name; } int Stu::GetNum()const { return num; } bool operator == (int num, const Stu &stu) { return stu...

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

7.1 연산자 중복 정의 연산자 중복 정의란 "피연산자 중에 최소 하나 이상이 사용자 정의 형식일 경우에 해당 연산에 대한 기능을 정의하는 것"을 말합니다. (참고로, 포인터 형식은 사용자 정의 형식이 아닙니다.) C++에서 연산자 중복 정의를 지원하는 이유는 사용자로서 ==와 같은 연산자를 사용하는 것이 IsEqual이라는 메서드를 사용하는 것보다 더 직관적일 수 있기 때문입니다. 하지만 사용자가 생각하는 것과 제공자의 의도가 서로 다르다면 오히려 이는 신뢰성이 떨어지고 유지 보수 비용이 늘어나게 되는 요인이 될 수가 있습니다. 이러한 이유로 모든 OOP언어에서 연산자 중복 정의를 문법적으로 지원하는 것은 아닙니다. 그리고 이를 지원하는 언어들도 사용자가 연산자 중복 정의를 할 때 지켜야 하는 수준이 ..

반응형