본문 바로가기

분류 전체보기

(71)
[C++] 4-1 클래스의 상속 (inheritance) 클래스의 상속 클래스 상속(inheritance)이란 이미 정의되어 있는 클래스의 속성 (데이터 멤버, 멤버 함수)를 다른 클래스에게 넘겨주는 것을 말한다. 이때 자신의 속성을 다른 클래스에 넘겨주는 클래스를 base class 혹은 parent class라 부른다. 속성을 상속받는 클래스는 derived(파생) class 혹은 child class로 불린다. Parent class는 자신의 속성을 child class에게 넘겨줄 때 접근 지정자 public, private, protected를 사용해서 넘겨주게 된다. 접근 지정자는 상속의 유형을 결정하기 때문에 child class가 parent class의 멤버에 접근할 수 있는 범위는 접근 지정자에 따라 결정된다. 만약 접근 지정자를 지정하지 않으..
[C++] 3-5 프렌드 (friend) 함수 사용 이유 및 예제 프렌드 함수 프렌드 함수(friend function)는 클래스의 멤버 함수가 아니면서 클래스의 private 데이터 멤버에 접근할 때 사용하는 함수이다. 프로그래밍을 하다 보면 외부 함수에 특정 클래스의 private 데이터 멤버를 참조해야 하는 경우가 생긴다. 이때 외부 함수를 특정 클래스의 프렌드 함수로 선언하면 해당 클래스의 private 데이터 멤버들을 참조할 수 있다. 프렌드 함수를 사용하기 위해서는 함수의 원형 앞에 예약어 friend를 붙인다. 멤버 함수를 호출하면 그 멤버함수를 호출한 object의 시작 주소를 가리키는 포인터 this가 자동으로 전달되어 클래스 내에서는 데이터 멤버들을 직접 참조하는 것이 가능하다. 그러나 프렌드 함수는 this 포인터가 전달되지 않으므로 프렌드 함수 내..
[C++] 3-4 함수에 클래스 객체를 call by reference로 전달 클래스 객체를 참조자로 전달 Call by value방식에 의해 객체를 전달하는 경우, 그 객체의 복사본이 작성되어 함수에 전달한다. 이것은 새로운 객체가 생성된 것을 의미하며 호출 함수의 실행이 종료되면 객체의 복사본은 소멸한다. 따라서 call by value 방식으로 객체의 복사본이 생성되면 생성자 함수와 소멸자 함수가 자동으로 소멸되어야 한다. 하지만 call by value 방식에 의해 생성된 객체는 생성자 함수는 호출되지 않는다. 객체의 현재 상태를 함수에 그대로 전달할 필요가 있는데, 만일 생성자 함수가 다시 호출되면 원래 객체 상태로 변하기 때문이다. 단, 호출 함수의 실행이 종료되면 복사된 객체가 소멸되면서 소멸자 함수가 자동으로 호출된다. 프로그래밍을 하다 보면 call by value..
[C++] 3-3 소멸자 (Destructor) 설명 및 예제 소멸자 소멸자(Destructor) 함수는 클래스 사용이 종료될때 자동으로 호출되어 수행되는 멤버 함수이다. 소멸자 함수는 클래스의 이름과 같은 이름을 가지며 앞에 틸드 기호(~)를 붙여 사용한다. 생성자와 마찬가지로 소멸자도 반드시 클래스 내에 public멤버로 지정되어야 한다. 그리고 return 값이 없으므로 함수형이 void이지만 이를 생략하여 사용한다. 소멸자 함수는 인수를 전달할 수 없으므로 오버로드가 불가능하다. 소멸자 함수는 주로 생성자 함수에 의해 할당된 동적 메모리를 클래스 종료와 함께 자동으로 동적 메모리 영역을 해제하고자 사용된다. 아래 예제에서 자세히 확인할 수 있다. 예제 #define _CRT_SECURE_NO_WARNINGS #include #include //물자열 처리 헤..
[C++] 3-2 클래스 생성자와 포인터 클래스 생성자(Constructor)와 포인터(Pointer) 이번 포스팅에서 클래스 내부에 생성자 함수가 포함되어 있는 경우에 대하여 클래스 포인터를 다루어 보겠다. 예제 1 #include using namespace std; class myclass { private: int a; public: myclass(int i) { a = i; } int output_return() { return a; } }; int main() { myclass ob(100), * p; p = &ob; cout output_return()과 ob.output_return()은 동일하다. 예제 2 #include using namespace std; class myclass { private: int a; public:..
[C++] 3-1 클래스 생성자(Constructor) 생성자 (Constructor) 생성자 (Constructor)는 클래스 객체를 선언할 때 자동으로 수행되는 멤버함수로 클래스 이름과 동일하며 public멤버로 지정되어야 한다. 생성자 함수의 return 값이 없으므로 void형이지만 이마저 생략하고 사용한다. 생성자 함수는 오버로드가 가능하고 매개변수를 전달할 수 있다. 일반 멤버함수로도 데이터 멤버들의 값을 초기화할 수 있지만, 생성자 함수는 클래스 객체가 선언됨과 동시에 자동적으로 실행하므로 일반 멤버 함수보다 더욱 편리하다. 예제 #include using namespace std; class score { private: char* name; int kor; int eng; double ave; public: score(char* n, int ..
[C++] 2-10 클래스 객체 반환 (return) 객체 반환 함수를 홈추할 때 함수에서 객체(object)를 전달할 수 있듯이 역으로 객체를 함수의 호출 측에 반환할 수 있다. 이때 함수의 데이터형은 해당 클래스형으로 지정해야 하며, return문을 사용하여 그 형의 객체를 호출측에 반환한다. 예제 #include using namespace std; class myclass { private: int a, b; public: void set(int i, int j) { a = i; b = j; } int sum_return() { return a + b; } }; myclass input();//일반 함수 input()의 원형 선언 int main() { myclass ob; ob = input();//일반 함수 input()의 호출 // 반환된 객체..
[C++] 2-9 함수의 객체 전달 (value 및 포인터) 함수의 객체 전달 함수를 호출하는 경우에 데이터를 매개변수로 함수에 넘거질 수 있듯이 클래스 객체들을 함수에 전달할 수 있다. 이때 매개변수는 call by value 방식으로 함수에 전달된다. 즉, 객체의 복사본은 stack이라는 메모리 영역에 저장하여 매개변수로 전달하기 때문에 함수의 호출이 늦어지게 된다. 함수의 매개변수로 구주체나 객체를 사용하는 경우에는 call by reference 방식을 사용하면 함수 호출 속도를 향상시킬 수 있다. 예제 1 #include using namespace std; class myclass { private: int a; public: void set(int i) { a = i; } void re_set(int i) { a = i; } int output_ret..
[C++] 2-8 클래스 객체의 대입 객체의 대입 두 개의 객체 ob1과 ob2가 동일한 클래스형으로 선언된 경우 하나의 객체를 다른 객체에 대입할 수 있다. 예를 들어 객체 ob2을 객체 ob1에 대입하면 객체 ob2의 모든 데이터 멤버들이 비트 단위로 객체 ob1의 대응되는 멤버에 복사된다. 예제 #include using namespace std; class myclass { private: int a, b; public: void set(int i, int j) { a = i; b = j;//클래스 내부에 멤버 함수를 정의 } void output() {//클래스 내부에 멤버 함수를 정의 cout
[C++] 2-6 this 포인터 사용 이유 및 예제 This 포인터 클래스의 멤버 함수 내에서 클래스의 데이터 멤버들을 참조하는 경우에 직접 참조가 가능하기 때문에 객체명을 지정해서 도트 연산자를 사용할 필요가 없다. 멤버 함수는 특정 객체에 대해 호출되기 때문에 컴파일러는 어떤 객체의 데이터 멤버를 참조해야 하는지를 판단할 수 있기 때문이다. this 포인터는 클래스의 멤버 함수에만 전달되기 때문에 프렌드 함수에는 this 포인터가 전달되지 않는다. this 포인터는 연산자를 오버로드 하는 경우에 매우 중요하게 사용된다. 예제 #include using namespace std; class testdata { private: int i, j; public: void input(int a, int b) { this->i = a; // i = a; 와 동일..