본문 바로가기

프로그래밍 언어들

CHAPTER11 - 연산자 오버로딩 2 1. 반드시 해야 하는 대입 연산자의 오버로딩 이번에 설명하는 대입 연산자의 오버로딩은 그 성격이 복사 생성자와 매우 유사하다. 따라서 복사 생성자에 대한 이해를 바탕으로 대입 연산자를 이해하기 바란다. 1.1 객체간 대입연산의 비밀: 디폴트 대입 연산자 다음은 이전에 설명한 복사 생성자의 대표적인 특성이다. - 정의하지 않으면 디폴트 복사 생성자가 삽입된다. - 디폴트 복사 생성자는 멤버 대 멤버의 복사(얕은 복사)를 진행한다. - 생성자 내에서 동적 할당을 한다면, 그리고 싶은 복사가 필요하다면 직접 정의해야 한다. 그리고 다음은 이어서 설명할 대입 연산자의 대표적인 특성이다. - 정의하지 않으면 '디폴트 대입 연산자'가 삽입된다. - 디폴트 대입 연산자는 멤버 대 멤버의 복사(얕은 복사)를 진행한다.. 더보기
CHAPTER10 - 연산자 오버로딩 1 C++에서는 함수뿐만 아니라 '연산자도 오버로딩이 가능'하다. 연산자의 오버로딩이 조금 생소하게 느껴질 수 있으나 기본 개념이 매우 단순하니 어렵지 않을 것이다. 참고로 연산자 오버로딩은 C++을 이해하는데 매우 중요한 요소이다. 1. 연산자 오버로딩의 이해와 유형 함수가 오버로딩 되면, 그 수만큼 다양한 기능을 제공하게 된다. 마찬가지로 연산자의 오버로딩을 통해서, 기존에 존재하던 연산자의 기본 기능 이외에 다른 기능을 추가할 수 있다. 1.1 operator+라는 이름의 함수 다음 예제를 이해한다면, 연산자 오버로딩은 쉽게 정복이 가능하다. class Point { private: int xpos; int ypos; public: Point(const int &x, const int &y) : xpo.. 더보기
CHAPTER09 - 가상(Virtual)의 원리와 다중상속 1. 멤버함수와 가상함수와 동작원리 객체 내에 멤버함수가 존재한다고 설명해왔다. 이번 챕터에서는 멤버함수가 실제로 어디에 존재하는지를 설명하고자 한다. 단, 진실을 알고 난 이후에도 객체 내에 멤버함수가 존재한다고 인식하고 객체를 바라보기 바란다. 개념적으로는, 그리고 객체지향적 논리를 기준으로는, 객체 내에 멤버함수가 존재한다고 인식하는 게 옳으니 말이다. (1) 객체 안에 정말로 멤버함수가 존재하는가? 실제로는 객체가 생성되면 멤버변수는 객체 내에 존재하지만, 멤버함수는 메모리의 한 공간에 위치하고선 이 함수가 정의된 클래스의 모든 객체가 이를 공유하는 형태를 취한다. 즉 이것을 C언어 스타일의 구조체로 표현하면 다음과 같다. typedef struct A { int data; void (*showd.. 더보기
CHAPTER08 - 상속과 다형성(Polymorphism) 객체지향에서 가장 중요하다고 할 수 있는 '다형성(Polymorphism)'을 공부하는 챕터이다. 이 책 전체의 내용 중 가장 중요하다고 할 수 있다. 1. 객체 포인터의 참조관계 (1) 객체 포인터 변수 : 객체의 주소 값을 저장하는 포인터 변수 이전에 학습 내용에서 보았듯이, 클래스를 기반으로 포인터 변수를 선언할 수 있다. A *ptr; ptr = new A(); 그런데 클래스 A형 포인터는, A 객체 뿐만 아니라, A를 상속하는 유도 클래스의 객체도 가르킬 수 있다. class A {}; class B : public A {}; class C : public B {}; int main(void) { A *ptr1 = new B(); A *ptr1 = new C(); B *ptr2 = new C().. 더보기
CHAPTER07 - 상속(inheritance)의 이해 1. 상속(Inheritance) 상속은 특히 적용이 중요한 문법이다. 적절한 때에 선별적으로 적용할 수 있어야 한다. 시작에 앞서, '컨트롤(control)' 클래스 또는 '핸들러(handler)' 클래스에 대해 알아보자. - 기능의 처리를 실제로 담당하는 클래스로, 기능 제공의 핵심이 되기 때문에 반드시 존재하는 클래스이다. (1) 상속이란? B 클래스가 A 클래스를 상속하게 되면, A클래스가 지니고 있는 모든 멤버를 물려받는다. 즉, B 클래스에 선언되어 있는 멤버들 뿐만 아니라, A 클래스의 멤버들도 지니게 된다. - 상속받은 클래스는 자신에게 상속한 클래스의 멤버를 초기화할 의무를 지닌다. - 따라서 상속한 클래스의 생성자를 통해 멤버를 초기화하는 것이 좋다. class A { private: .. 더보기
CHAPTER06 - friend와 static, const 1. const C언어와 달리 C++에서는 const와 관련한 내용이 많다. (1) const 객체와 const 객체의 특성들 변수를 상수화 하듯이, 다음과 같이 객체도 상수화할 수 있다. const Simple s(10); 객체에 const 선언이 붙게 되면, 이 객체를 대상으로는 'const 멤버함수'만 호출이 가능하다. 즉, "이 객체의 데이터 변경을 허용하지 않겠다."라는 의미이다. 물론 const로 선언되지 않은 함수 중에도 데이터를 변경하지 않는 함수가 있지만, 가능성이 있는 함수는 모두 배제한다. ※ 멤버변수의 값을 조작하지 않는 함수는 가급적 const로 선언해서, const 객체에서도 호출이 가능하도록 할 필요가 있다. (2) const와 함수 오버로딩(Function Overloadin.. 더보기
CHAPTER05 - 복사 생성자(Copy Constructor) 1. 복사 생성자 복사 생성자란 생성자의 한 형태일 뿐이다. 그러나 생성자가 호출되는 시점이 일반 생성자와 차이가 있다. (1) C++ 스타일의 초기화 우리는 지금까지 다음과 같은 방식으로 변수와 참조자를 선언 및 초기화해 왔다. int num = 20; int &ref= num; 하지만 C++에서는 다음의 방식으로 선언 및 초기화가 가능하다. int num(20); int &ref(num); 위 두 가지 방법은 결과적으로 동일하다. 그렇다면 객체로 넘어와서 다음의 소스코드를 주목해 보자. First f1(10); First f2 = f1; 위의 코드 중, 'First f2 = f1'는 객체의 생성 및 초기화를 연상시킨다. 즉, f1과 f2 사이의 멤버 대 멤버 사이에 복사가 일어난다. 따라서 아래의 문.. 더보기
CHAPTER04 - 클래스의 완성-2 1. 이니셜라이저를 통한 참조자인 멤버변수 초기화 const 변수와 마찬가지로 '참조자'도 선언과 동시에 초기화가 이루어져야 합니다. 따라서 아래와 같이 이니셜라이저를 통해 초기화가 가능합니다. class Second { private: int # public: Second( int &n) : num(n) {} }; 2. 디폴트 생성자(Default Constructor) 객체가 되기 위해서는 반드시 하나의 생성자가 호출되어야 한다. 그리고 이러한 기준에 예외를 두지 않기 위해 생성자를 정의하지 않는 클래스에는 C++ 컴파일러에 의해서 디폴트 생성자라는 것이 자동으로 삽입된다. 즉, 생성자를 선언하지 않으면 다음과 같은 정의와 완전히 동의하다. class Second { private: int &.. 더보기
CHAPTER04 - 클래스의 완성-1 1. 정보은닉(Informaiton Hiding)의 이해 멤버범수를 'private'으로 선언하고, 해당 변수에 접근하는 함수를 별도로 정의해서 안전한 형태로 멤버변수의 접근을 유도하는 것이다. 이는 좋은 클래스가 되기 위한 기본조건이 된다. (1) 엑세스 함수(Access Function) 외부에서 'private'으로 선언된 멤버변수에 접근하기 위한 목적으로 정의되는 함수들이다. 보통 정수형 데이터 XXX 변수에 대해서 아래와 같이 선언한다. int getXXX( void) const; void setXXX( const int); (2) 상수형 함수(Const) 위의 액세스 함수들에 'const' 선언이 추가되어 있다. 이는 "이 함수 내에서 멤버변수의 값을 변경하지 않겠다"라는 의미이다. 따라서 c.. 더보기
CHAPTER03 - 클래스의 기본 1. C++에서의 구조체 구조체는 연관 있는 데이터를 묶을 수 있는 문법적 장치이다. (1) C++에서의 구조체 선언 C에서는 구조체를 나타내는 'struct'를 명시해 주어야 한다. 이것을 생략하려면 'typedef' 선언을 추가해야 한다. 그러나 C++에서는 별도의 선언없이도 구조체 변수를 선언할 수 있다. (2) 구조체 안에 함수 선언 C++에서는 구조체 안에 함수를 선언할 수 있다. 만약 그렇게 되면, 구조체의 멤버 변수를 별다른 연산 없이 참조할 수 있게 된다. struct Stu { int stu_num; char stu_name[10]; void print_information( void) { cout 더보기