C++
46C++ 예외(Exception)와 Abort함수
프로그램을 실행하다 보면 가끔 정상적으로 실행을 계속할 수 없는 상황이 있습니다. 사용 가능한 메모리보다 더 많은 양의 메모리를 요구함 파일을 읽으려고 하는데 해당 파일이 없음 인터넷 웹사이트에서 값을 가져오는데 인터넷 연결이 안 되어 있음 위와 같은 여러 상황이 생길 수 있습니다. 대부분의 프로그래머들은 이런 상황을 미리 예상하려고 노력합니다. 그래서 C++은 이러한 상황을 처리하기 위해서 예외를 추가했습니다. abort() 호출 abort함수의 원형은 cstdlib헤더 파일에 들어있습니다. 일반적으로 abort()함수는 호출되었을 때 표준 에러 스트림에 "abnormal program temination"(비정상적인 프로그램 종료)과 같은 메시지를 보내고 프로그램을 종료시키도록 구현되어 있습니다. #..
프로그래밍/C++ 2019.11.01 PlorenceC++ 내포 클래스(nested class)
C++에서는 클래스 선언을 다른 클래스 안에 내포시킬 수 있습니다. 다른 클래스 안에 선언된 클래스를 내포 클래스(nested class)라고 합니다. 이 방법은 새로운 데이터형에 클래스 사용 범위를 제공함으로써 이름이 난잡해지는 것을 막습니다. (구형 C++에서는 내포 클래스를 아예 지원하지 않거나 그 개념이 불완전하게 구현됩니다.) class Person { private: int age; class Card { public: char* number; int money; void Show(); }; public: Card card; }; void Person::Card::Show() { } 클래스를 내포시키는 일반적인 이유는 다른 클래스의 구현을 지원하고 이름 충돌을 막는 것입니다. 내포 클래스를 어..
프로그래밍/C++ 2019.11.01 PlorenceC++ 클래스 프렌드(class friend)
이번 프렌드는 클래스에 대한 프렌드인데 클래스도 프렌드가 될 수 있습니다. 이러면 프렌드 클래스의 모든 멤버 함수는 오리지널 클래스의 private 멤버와 protected 멤버에 접근할 수 있습니다. class Plorence { private: int age; public: friend class Guest; }; class Guest { public: int GetAge(const Plorence & plo) { return plo.age; } }; Guest클래스에서 Plorence 클래스의 private인 age멤버에 접근하려면 프렌드여야 됩니다. 프렌드로 인하여 Guest 클래스에서 Plorence 클래스의 private,protected멤버에 접근할 수 있습니다. 프렌드 멤버 함수 위에서 프..
프로그래밍/C++ 2019.11.01 PlorenceC++ 클래스 템플릿과 프렌드 함수
클래스 템플릿도 프렌드를 가질 수 있습니다. 템플릿의 프렌드를 3가지로 분류할 수 있습니다. 템플릿이 아닌 프렌드 바운드 템플릿 프렌드(클래스가 구체화될 때 클래스의 데이터형에 의해 프렌드의 데이터형이 결정됩니다.) 언바운드 템플릿 프렌드(프렌드의 모든 특수화가 그 클래스의 각 특수화에 대해 프렌드들입니다.) 템플릿이 아닌 프렌드 template class ClassTemplate { friend void Show(); }; void Show() { } 이 선언은 Show 함수를 그 템플릿의 가능한 모든 구체화들에 대해 프렌드로 만듭니다. 즉 어떤 타입으로 구체화가 되든 항상 프렌드라는 것입니다.(ClassTemplate, ClassTemplate) 그런데 Show 함수가 매개변수로 해당 객체를 가지지 ..
프로그래밍/C++ 2019.10.31 PlorenceC++ 클래스 템플릿(Class Template)
클래스 템플릿을 학습하기 전, 반드시 함수 템플릿을 공부하시는 것을 권합니다. 저번에는 함수 템플릿이었지만, 이번에는 클래스 템플릿입니다. 둘 다 똑같은 템플릿이고 비슷하기도 합니다. 다만 이번에는 함수가 아닌 클래스입니다. 클래스 템플릿 정의 template //class 대신 typename도 가능 class Array { }; 함수 템플릿처럼 클래스 정의 위에 template을 써주면 됩니다. 이때 키워드 class는 데이터형을 값으로 받아들이는 어떤 변수의 데이터형 이름의 역할을 합니다 Type은 그 변수의 이름을 나타냅니다. 키워드 class는 템플릿 매개변수의 타입이 반드시 클래스여야 한다는 것은 아닙니다. 단지 실제 데이터형으로 대체되는 포괄 데이터형의 지정자 역할을 한다는 뜻입니다. (ty..
프로그래밍/C++ 2019.10.31 PlorenceC++ 다중 상속(Multiple inheritance : MI)
다중 상속은 파생 클래스가 여러 기초 클래스를 상속받았을 때 다중 상속이라고 부릅니다. 다중 상속을 사용하게 된다면 다음과 같은 문제가 생깁니다. 두 개 이상의 기초 클래스로부터 이름은 같지만 서로 다른 메서드들을 상속하는 문제 둘 이상의 서로 관련된 인접 기초 클래스들로부터 어떤 클래스의 다중 인스턴스를 상속하는 문제 이러한 다중 상속의 문제 때문에 추가된 기능이 있습니다. 다중 상속을 사용하기 전에 고려해야할 사항, 조상 클래스는 어떻게 할 것인가? 다중 상속을 사용할 때 기초 클래스의 N개만큼 포함할 것인지 하나의 독립적인 것으로 만들 것인지 설계해야 합니다. 만약 조상 클래스를 독립적인 형태로 만들려면 새로운 기능을 사용해야 합니다. class Person { }; class Student : P..
프로그래밍/C++ 2019.10.31 PlorenceC++ private상속, protected 상속을 정리하며
private 상속이나 protected 상속이 됐을 때 기초 클래스의 멤버들은 private나 protected가 될 겁니다. 이 둘의 공통점은 외부에서 접근이 불가능하다는 건데 public으로 사용하고 싶은 경우도 있을 겁니다. 데이터 은닉에서 했던 것과 비슷한 방법 #define _CRT_SECURE_NO_WARNINGS #include #include using namespace std; class Student : private valarray { public: Student() : valarray(3) { //멤버 초기자 리스트로 초기화 } int Size() { return valarray::size(); } }; int main(void) { Student stu = Student(); c..
프로그래밍/C++ 2019.10.24 PlorenceC++ protected 상속
protected 상속은 private 상속과 사용방법, 의미면에서 큰 차이는 없습니다. protected 상속은 기초 클래스의 public 멤버와 protected멤버가 파생 클래스에서 protected멤버로 됩니다 private 상속과 마찬가지로 클래스 내에서는 사용이 가능하지만 외부에서는 불가능합니다. class Student : protected valarray { public: Student() : valarray(3) { //멤버 초기자 리스트로 초기화 } }; protected상속은 파생 클래스보다는 파생클로스로 부터 또 다른 클래스를 파생시킬 때 드러납니다. 즉 3세대에서 접근이 가능하게 되는데 3세대까지 파생할거라고 설계를 안 했을 경우에는 별 필요 없습니다.
프로그래밍/C++ 2019.10.24 PlorenceC++ private 상속
private 상속은 기초 클래스의 public 멤버와 protected 멤버가 파생 클래스의 private 멤버가 됩니다. public 상속도 기초 클래스의 public 멤버와 protected 멤버가 파생 클래스의 public 멤버가 된 겁니다. has-a 관계를 모델링하는 방법 중 나머지 한 가지의 방법이 private 상속입니다. 파생 클래스는 기초 클래스의 인터페이스를 상속하는 것이 is-a관계의 역할이었지만 private상속은 파생 클래스가 기초 클래스의 인터페이스를 상속하지 않습니다. 상속이 안 되는 것은 has-a관계의 역할입니다. 컴포지션(컨테인먼트)과 다른 점 컨테인먼트는 객체를 이름이 있는 멤버 객체로 클래스에 추가하지만 private상속은 객체를 이름이 없는 상속된 객체로 클래스에 ..
프로그래밍/C++ 2019.10.24 PlorenceC++ 멤버 함수(생성자, 파괴자, 연산자 오버로딩 등)의 특성(표로 요약)
함수 상속 멤버 또는 프렌드 디폴트로 생성 가상으로 선언 리턴형 생성자 X 멤버 O X X 파괴자 X 멤버 O O X = X 멤버 O O O & O 둘 중 하나 O O O 변환 O 멤버 X O X () O 멤버 X O O [] O 멤버 X O O -> O 멤버 X O O op= O 둘 중 하나 X O O new O static 멤버 X X void * delete O static 멤버 X X void 기타 연산자 O 둘 중 하나 X O O 기타 멤버 O 멤버 X O O 프렌드 X 프렌드 X X O op=는 +=,*=와같은 복합 대입 연산자들을 말합니다.
프로그래밍/C++ 2019.10.24 PlorenceC++ 추상화 기초 클래스(abstract base class; ABC)와 순수 가상 함수(pure virtual function)
추상화 기초 클래스(abstract base class) 추상화 기초 클래스는 기초 클래스로 쓰이고 순수 가상 함수가 1개 이상의 클래스를 추상화 기초 클래스라고 부릅니다. 줄여서 ABC라고 부르기도 합니다. 그리고 이 추상화 기초 클래스의 모든 멤버 함수가 순수 가상 함수일 때 인터페이스(Interface)라고 부릅니다. 이러한 추상화 기초 클래스를 상속받는 클래스를 구체화 클래스(concrete class)라고 부릅니다. 추상화 기초 클래스는 기초 클래스로부터 상속받는 여러가지 클래스가 있을 때, 공통적인걸 하나로 묶는 클래스입니다. 하나로 묶으면서 파생 클래스마다 다른 동작을 해야하는건 순수 가상 함수로 선언을 합니다. "대충 이런일은 할 건데 이 행동은 파생 클래스마다 다를 거니까 설계만 해놓았어..
프로그래밍/C++ 2019.10.22 PlorenceC++ 가상 함수의 동작 원리
C++는 가상 함수들이 어떻게 동작해야 하는지 규정하고 있고 그 구현은 컴파일러 개발자의 몫입니다. 구현된 방법을 알면 가상 함수의 개념을 좀 더 잘 이해할 수 있습니다. 컴파일러는 가상 함수를 어떻게 처리하는가? 먼저 각각의 객체에 숨겨진 멤버를 하나씩 추가합니다. 숨겨진 멤버는 함수의 주소들로 이루어진 배열을 지시하는 포인터를 저장합니다. 일반적으로 그 배열을 가상 함수 테이블(VirTual Function Table, 줄여서 vtbl)이라고 합니다. vtbl에는 클래스의 객체들을 위해 선언된 가상 함수들의 주소가 저장되어 있습니다. 기초 클래스의 한 객체는 그 클래스를 위한 모든 가상 함수들의 주소로 이루어진 테이블을 지시하는 포인터를 가집니다. 파생 클래스도 가상 함수들의 주소로 이루어진 별개의 ..
프로그래밍/C++ 2019.10.22 Plorence