4강. OOP 2부
추천글 : 【C++】 C++ 목차
1. 상속 [본문]
2. virtual [본문]
3. polymorphism [본문]
4. STL [본문]
a. GitHub
1. 상속(inheritance) [목차]
⑴ 기본 문법
class ParentClass {
public:
int baseInteger;
ParentClass() : baseInteger(0) { }
};
class ChildClass : public ParentClass {
public :
ChildClass( ) {
std::cout << baseInteger << std::endl;
}
};
① ChildClass를 호출하면 ParentClass를 생성하고 그 뒤 ChildClass를 생성함 : java에서도 동일
⑵ constructor overloading : ":"를 명시적으로 표시해야 함 (추후 업데이트)
⑶ C++에서는 multiple inheritance가 가능함
① 그러나 diamond problem이 발생할 수 있음
② 충돌되는 함수가 있더라도 호출하지만 않으면 오류가 나지 않음
2. virtual [목차]
⑴ virtual class
① C++에서 multiple inheritance로 인한 diamond problem을 방지하기 위해 virtual을 사용함
⑵ virtual function
① 선언
Monster* m = new FireMon(); m -> critical_attack();
○ java의 경우 FireMon의 type을 따라가는데, C++의 경우 Monster의 type을 따라감
○ critical_attack();을 정의할 때 별도로 virtual을 써주어야 C++에서 FireMon의 type을 따라감
○ (출제 예상) java의 abstract는 구현을 포함하지 않지만 virtual은 그 자체로 구현을 포함함
② 요건
○ static이 아닐 것
○ object pointer로만 접근할 것
○ parent class에 정의돼 있을 것
○ parent class와 child class에서 signature가 동일할 것
③ 기타 문법
○ virtual function이 아니면 function overriding이 안 일어남
④ 응용 1. abstract class
○ 정의 : 적어도 한 개의 pure virtual function을 포함하는 class
○ pure virtual function
virtual void pureVirtualFunc() = 0; // = 0 is not actually 0
○ abstract class는 instance를 만들 수 없음
⑤ 응용 2. virtual destructor
○ virtual을 쓰지 않는 경우
○ parent class로 upcasting한 instance를 소멸시킬 때는 parent class의 소멸자가 호출됨
○ child class의 소멸자는 호출되지 않음
○ virtual을 쓰는 경우
○ parent class로 upcasting한 instance를 소멸시킬 때 child class, parent class 순으로 소멸자가 호출
3. polymorphism [목차]
⑴ function overriding
① 정의 : inheritance 관계에 있는 경우 child class에서 parent class의 function을 정의하는 경우
⑵ function overloading
① 정의 : function name이 같은데 서로 다른 parameter를 signature로 하는 경우
② constructor overloading
Foo(int y) : Foo('a', y) { }
⑶ operator overloading (ref)
① java와 달리 user-defined operator를 생성할 수 있음
② operator라는 키워드를 사용하면 됨
⑷ type casting
① 종류 1. implicit type casting (not recommended)
○ narrowing casting과 widening casting이 모두 가능함
○ implicit narrowing casting에서는 information loss가 있을 수 있음
② 종류 2. explicit type casting : C-style (not recommended)
○ float mean = (float) sum / count;과 같은 경우
③ 종류 3. explicit type casting : function expression (recommended)
○ float mean = float(sum) / count;과 같은 경우
④ 종류 4. static_cast
○ compile time에 casting error가 나는지 체크하는 명령어
○ dynamic binding까지 보장해 주는 것은 아님
○ 예 : int b = static_cast<int>(a);
⑤ 종류 5. dynamic_cast
○ 타겟 type이 pointer인 경우 : casting을 실패하면 null pointer를 반환
○ 타겟 type이 reference인 경우 : casting을 실패하면 std::bad_cast exception을 throw
○ pointer나 reference가 아니면 dynamic_cast를 사용할 수 없음
○ 보통 down casting을 안전하게 할 때 사용됨
○ 예 : B* b = dynamic_cast<B*>(a);
⑥ 종류 6. const_cast
○ constness 또는 non-constness(volatility)를 제거하기 위해 사용
○ non-const argument를 이용하는 함수에 const pointer를 넘기는 경우 등에서 사용
○ 예 : MyFunction(const_cast<char*>(c));
⑦ 종류 7. reinterpret_cast (not recommended) (ref)
○ bit 단위로 들어가서 one-by-one으로 casting하는 것
○ 전혀 관련 없는 두 class도 casting할 수 있음
⑸ template
① 개요
○ java에서의 generic과 대응됨
○ java는 객체만을 대상으로 하지만 C++은 primitive type도 대상으로 한다는 점에서 차이가 있음
② 종류 1. function template
○ 정의 : function들의 family를 정의할 때 쓰는 template
○ 예제
template<typename T1, typename T2>
T1 add(T1 t1, T2 t2) {
return t1 + t2;
}
③ 종류 2. class template
○ 정의 : class들의 family를 정의할 때 쓰는 template
○ 예제
template<class T>
class Pair { ... }
○ non-template class 안에 template variable은 올 수 없지만 template function은 올 수 있긴 함
④ 종류 3. variable template (C++14부터)
○ 정의 : 변수나 static data member의 family를 정의할 때 쓰는 template
○ 예제
template<class T>
const T pi = T(3.141592L);
⑤ 종류 4. alias template (C++11부터)
○ 정의 : 특정 type들의 family를 정의할 때 쓰는 template
○ 예제
template<typename T>
using vector2d = vector<vector<T>>;
4. STL(standard template library) [목차]
⑴ 개요
① container, iterator, algorithm 등을 제공함
② vector, algorithm 등
③ java의 Collection과 비슷함
⑵ 함수
① std::remove : value를 찾아서 끝으로 옮기기만 하고 그 value의 position의 iterator를 리턴 (ref)
② std::erase : iterator부터 다음 포인터 위치까지 전부 조건 없이 지우는 것
입력: 2020.12.02 16:03
'▶ 자연과학 > ▷ C, C++' 카테고리의 다른 글
【C++】 C++ 목차 (0) | 2020.12.01 |
---|---|
【C++】 3강. OOP 1부 (0) | 2020.11.21 |
【C++】 2강. 포인터 (0) | 2020.11.21 |
【C++】 1강. C++ 시작하기 (0) | 2020.11.18 |
【코딩】 C 언어로 이항계수 (0) | 2016.06.27 |
최근댓글