Programming Study 썸네일형 리스트형 가상(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.. 더보기 friend와 static 그리고 const 1. const와 관련해서 아직 못다한 이야기 const 객체와 const 객체의 특성들 다음과 같이 변수를 상수화 하듯이, const int num=10; 다음과 같이 객체도 상수화할 수 있다. const SoSimple sim(20); 그리고 이렇게 객체에 const 선언이 붙게 되면, 이 객체를 대상으로는 const 멤버함수만 호출이 가능하다. 이는 객체의 const 선언이 다음의 의미를 갖기 때문이다. "이 객체의 데이터 변경을 허용하지 않겠다!" 때문에 const 멤버함수의 호출만 허용하는 것이다. 물론 const로 선언되지 않은 함수 중에도 데이터를 변경하지 않는 함수가 있을 수 있다. 하지만 변경시킬 능력이 있는 함수는 아예 호출을 허용하지 않는 것이다. 멤버변수에 저장된 값을 수정하지 않는.. 더보기 복사 생성자(Copy Constructor) 1. '복사 생성자'와의 첫 만남 C++ 스타일의 초기화 우리는 지금까지 다음과 같은 방식으로 변수와 참조자를 선언 및 초기화해 왔다. int num=20; int &ref = num; 하지만 C++에서는 다음의 방식으로 선언 및 초기화가 가능하다. int num(20); int &ref(num); 위의 두 가지 초기화 방식은 결과적으로 동일하다. 즉, C++에서는 위의 두 가지 초기화 방식을 동시에 지원하고 있다. 그렇다면 이야기를 객체의 생성으로 옮겨가 보자. 그리고 이를 위해서 다음과 같이 클래스를 하나 정의하겠다. class SoSimple { private: int num1; int num2; public: SoSimple(int n1, int n2) : num1(n1), num(n2) { } .. 더보기 클래스의 완성 우리는 객체의 생성을 목적으로 클래스를 디자인한다. 그렇다면 좋은 클래스가 되기 위한 조건으로는 어떤 것들이 있을까? 여기에는 '정보은닉'과 '캡슐화'가 있다. 이는 좋은 클래스가 되기 위한 최소한의 조건이다. 1. 정보은닉(Information Hiding) 정보은닉이란 멤버변수를 private로 선언하고, 해당 변수에 접근하는 변수를 별도로 정의해서, 안전한 형태로 멤버 변수의 접근을 유도하는 것이다. const 함수 함수에 const선언이 추가 되 있는 경우에 const는 다음 내용을 선언하는 것이다. "이 함수 내에서는 멤버변수에 저장된 값을 변경하지 않겠다!" 즉 멤버변수에 저장된 값을 변경하지 않겠다는 선언이다. const함수 내에서는 const가 아닌 함수의 호출이 제한된다. const로 선.. 더보기 클래스의 기본 1. C++에서의 구조체 구조체가 주는 이점 - 연관 있는 데이터를 하나로 묶으면, 프로그램의 구현 및 관리가 용이하다. 소프트웨어를 단순히 표현하면 소프트웨어 = 데이터의 표현 + 데이터의 처리 표현해야 하는 데이터는 항상 부류를 형성하기 마련이다. 그리고 이렇게 부류를 형성하는 데이터들은 함께 생성, 이동 및 소멸된다는 특성이 있다. 그래서 구조체는 연관 있는 데이터를 묶을 수 있는 문법적 장치로 데이터의 표현에 큰 도움을 준다. C언어에서 구조체 변수를 선언하는 방법은 다음과 같다. struct Car basicCar; struct Car SimpleCar; 앞에 삽입된 키워드 struct는 이어서 선언되는 자료형이 구조체를 기반으로 정의된 자료형임을 나타낸다. 그리고 키워드 struct를 생략하려.. 더보기 C언어 기반의 C++_2 1. 새로운 자료형 bool bool형은 C언어에는 존재하지 않고, C++에만 존재하는 자료형이다. 그러나 C는 최근 표준에서는 bool을 기본 자료형에 추가하였다. '참'을 의미하는 true와 '거짓'을 의미하는 false C와 C++모두, 정수 0은 '거짓'을 의미하는 숫자로, 그리고 0이 아닌 모든 정수는 '참'을 의미하는 숫자로 정의하고 있다. 따라서 참과 거짓의 표현을 위해서 다음과 같이 상수를 정의하는 것이 보통이다. #define TRUE 1 #define FALSE 0 이러한 참과 거짓의 표현방법은 C++에서도 여전히 사용된다. 그러나 C++에서는(그리고 새로운 C 표준에서는) 참과 거짓의 표현을 위한 키워드 true와 false를 정의하고 있기 때문에, 굳이 상수를 이용해서 참과 거짓을 .. 더보기 그리기 1.DC(Device Context) DC의 정의 윈도우즈에서 그리기가 복잡하고 난해한 근본적인 이유는 여러 개의 프로그램이 동시에 실행되는 멀티 태스킹 운영체제이기 때문이다. 이런 복잡함을 조금이나마 단순화하기 위한 장치가 DC이다. DC에는 그리기에 필요한 여러 가지 정보가 저장되어 있으며 프로그램은 DC의 정보를 참조하여 그리기를 하고 DC의 정보를 조작하여 그리는 방법을 변경한다. 운영체제는 프로그램들끼리 상호 영역을 침범하지 않고 최대한 효율적으로 그리기를 할 수 있도록 DC의 정보를 관리한다. DC의 구조 윈도우즈에서 모든 그리기를 조율하는 DC의 실체는 단순한 데이터 구조체이다. 그리기 관련 정보의 집합이라고 할 수 있는데 대단히 복잡할 것 같지만 알고 보면 멤버가 좀 많은 구조체일 뿐이다... 더보기 메시지 1.윈도우 프로시저 윈도우 프로시저(Window Procedure) 윈도우 프로시저는 윈도우 클래스당 하나씩(윈도우당 하나씩이 아니라) 배정되며 메시지에 대응하는 방식을 정의함으로써 윈도우의 행동양식을 결정한다. 윈도우 프로시저는 다음과 같은 원형을 가는 함수이다. LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam); 윈도우 프로시저는 재진입(ReEntrant)이 가능한 함수이다. 재진입이 가능하다는 것은 WndProc 실행 중에 또 WndProc이 호출 될 수 있다는 뜻이다. 메시지 큐 메시지는 시스템이나 사용자에 의해 발생한다. 메시지는 크게 메시지 큐로 들어가는 큐(Queued) 메시지와 큐에 들어가지 않고.. 더보기 이전 1 2 3 4 5 6 ··· 9 다음