본문 바로가기

Contact English

【C++】 4강. OOP 2부

 

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