본문 바로가기

Study/C++

[C++] Virtual principle and Multiple Inheritance 가상의 원리와 다중상속 1. 가상함수의 공유와 가상함수 테이블 C++에서 클래스의 객체가 생성되면, 멤버변수는 객체 내에 존재하지만, 멤버함수는 메모리의 한 공간에 별도로 위치하고선, 이 함수가 정의된 클래스의 모든 객체가 이를 공유하는 형태를 취한다. 클래스에 가상함수가 포함되면, 가상함수 테이블이 생성되고, 이 테이블을 참조하여 호출될 함수가 결정된다. 이러한 과정 때문에 속의 저하가 생기지만 많은 이점 때문에 가상함수는 자주 사용된다. 즉, 한 개 이상의 가상함수 생성 시, 무조건 가상 함수 테이블이 생성되고, 이 가상함수 테이블은 모든 멤버함수를 포함한다. 2. 다중상속 C++의 특이한 점 하나는, 다중상속을 지원한다는 점이다. 물론, 부정적인 의견이 강하기 때문에 간단한 예시를 통해 사용법만 알.. 더보기
[C++] Polymorphism 다형성(多形性) 다형성은 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 말한다. 1. 객체 포인터 변수 객체의 주소 값을 저장하는 포인터 변수이다. Student * ptr;// 포인터 변수 선언 ptr = new Student();// 포인터 변수의 객체 참조 // ------------------------------------------------ Student * ptr = new StudentHandler();(O) StudentHandler * ptr = new StudentHandler();(O) 이렇듯, C++에서, 어떠한 데이터형의 포인터 변수는 해당 데이터형 객체 또는 해당 데이터형을 직접 혹은 간접적으로 상속하는 모든 객체를 가리킬 수 있다. 즉, 객.. 더보기
[C++] Inheritance 상속 C++의 상속은 사전에 정의해 놓은 클래스를 다시금 활용하기 위한 목적으로 만들어진 문법적 요소이다. 클래스를 정의한 뒤, 해당 클래스에 존재하는 변수를 수정하는 등 데이터를 추가적으로 처리하기 위해서는 어떠한 방법이 유리할까? 보통 이러한 경우를 위해 사용하는 클래스를 '컨트롤(Control) 클래스' 혹은 '핸들러(Handler) 클래스'라고 하며, 이러한 클래스는 기능의 처리를 실제로 담당하는 클래스 전체를 의미한다. 아래 이미지가 일반 클래스와 컨트롤 클래스의 의미를 추상적으로 보여준다. 이러한 핸들러 클래스는 보통, 처리하고자 하는 클래스를 '상속'하면 프로그램을 더 OOP하게 할 수 있다. 만일, Student Clss에 추가적인 변수 혹은 함수가 추가되고, 이를 별도의 Handler로 .. 더보기
[C++] Static Static 전역변수에 선언된 static의 의미는 선언된 파일 내에서만 참조를 허용하겠다는 의미이다. 함수 내에 선언된 static의 의미는 한번만 초기화되고, 지역변수와 달리, 함수를 빠져나가도 소멸되지 않는다. 이러한 static 선언은 공유 변수의 민감도를 낮추기 위해 자주 사용되어 왔다. 특히, static이 선언된 멤버변수는 static 멤버변수, 클래스 변수라고도 한다. 이러한 static 변수는 전역변수처럼 사용도며, 생성된 객체 모두에서 접근이 가능하다. 이러한 static 변수는 생성자에서 초기화 하면 안되는데, 그 이유는 객체가 생성될때마다 해당 static 변수가 할당된 메모리에 그 값이 할당되기 때문이다. 즉, staitc 멤버변수는 어디서든 접근이 가능한 변수이다. 물론, sta.. 더보기
[C++] Friend Friend 한 클래스가 다른 클래스 내부의 private 멤버에 접근하기 위해서 사용하는 방법이다. A와 B 클래스가 있다고 가정할 때, A 클래스가 B 클래스를 대상으로 friend 선언을 하면, B 클래스는 A클래스의 private 멤버에 직접 접근이 가능하다. 단, 역도 성립하기 위해서는 B 클래스가 A 클래스를 대상으로 friend 선언을 해줘야 한다. 또한 함수도 선언이 가능하다. class Girl { private: friend class Boy; ... public: ... } class Boy { private: friend class Girl; ... public: ... } SomeClass { ... public: friend SonmeFunc(...); ... } SomeClas.. 더보기
[C++] Init 초기화 앞선 참조자와 생성자의 내용을 복습해본다면, C++는 다음과 같은 초기화를 지원한다는 것을 할 수 있다. int num = 20 -> int num(20) int &ref = num -> int &ref(num) 즉, 이러한 초기화를 응용해본다면, class 선언 시 class의 객체 또한 복사가 가능하다는 점을 유추할 수 있다. int main(void) { SoSimple sim1(10, 100); SoSimple sim2 = sim1; SoSimple sim3(sim1); } 이러한 별도의 생성자가 존재하는 것이 아닌, 객체를 복제하는 경우의 생성자를 '복사 생성자'라고 부른다. 또한 앞선 생성자와 마찬가지로, 복사 생성자를 정의하지 않으면, 멤버 대 멤버의 복사를 진행한느 디폴트 복사 생성.. 더보기
[C++] Class, Array and this pointer Class, Array and this pointer 객체 또한 배열의 선언이 가능하나, 배열의 선언과정에서는 호출할 생성자를 별도로 명시하지 못한다. 즉, 배열 생성을 위해서는 반드시 생성자가 정의되어 있어야 한다. 배열 선언 시, '객체 배열'과 '객체 포인터 배열'의 차이점을 정확히 이해해야한다. 저장의 대상을 객체로 하고 싶다면 '객체 배열'을 사용하고, 객체의 주소 값으로 할 경우 '객체 포인터 배열'을 사용한다. 맴버함수 내에서는 this라는 이름의 포인터를 사용할 수 있다. 이는, 객체 자신을 가리키는 용도로 사용된다. this는 객체자신의 주소 값을 의미한다. 즉, this 포인터는 그 주소 값과 자료형이 정해져 있지 않은 포인터이다. this는 객체 자신의 변수 접근에도 도움을 준다. 가.. 더보기
[C++] Constructor & Destructor 생성자(Constructor)와 소멸자(Destructor) 생성자는 다음과 같은 특징을 가지고 있다. 클래스의 이름과 함수의 이름이 동일하다. 반환형이 선언되어 있지 않으며, 실제로 반환하지 않는다. 객체 생성시 딱 한번 호출된다. 함수의 일종으로, 오버로딩이 가능하다. 함수의 일종으로, 매개변수에 디폴트 값 설정이 가능하다. 이러한 생성자를 이용하면, 객체 생성과 동시에 초기화가 가능하다. #includes using namespace std; class SimpleClass { private: int num1; int num2; public: SimpleClass() { num1 = 0; num2 = 0; } SimpleClass(int n) { num1 = n; num2 = 0; } SimpleC.. 더보기