[C++] OOP 특징 및 기능
- C++은 Class/Object를 중심으로 하는 OOP이다.
- 여기선 OOP가 가지는 대표적인 특징들을 소개한다.
축약 및 생략
Abstraction
- 구현 디테일을 생략하고, 축약된 핵심만 표시한다.
- 고객 관점에서 궁굼할 정보만 표시한다.
- 대표적으로 Abstract Class(class template), Abstract Interfacce(function template)이 있다.
- Function 자체가 기본적으로 Abstraction
Encapsulation
- access specifier(private, protected)로 데이터를 숨기고, public method(getter, setter)를 통해서만 데이터에 접근할 수 있게 한다.
- 제공자 관점에서 보안을 위해 주로 사용된다.
Polymorphism
- 서로 다른 type이지만 유사한 작업을 하는 기능들을 같은 이름으로 사용한다.
- function overloading에선 parameter list가 달라야 하지만, Class Polymorphism에선 서로 다른 클래스 속에 똑같은 모양의 함수를 사용할 수 있다.
-
키워드
virtual
// method 선언 시, 해당 method 앞에 keyword `virtual`을 붙인다. (부모는 필수) class Bear { public: virtual float Meanness(void) {}; } // 자식은 생략해도 된다. 또한 override 표시를 붙여도 된다. // 적는 이유는 프로그래머의 해석상의 편의를 위한 것이다. class MommaBear{ public: float Meanness(void) {}; virtual Meanness(void) {}; float Meannes(void) override {}; }
-
Virtual Function Table
- 해당 클래스의 virtual method들을 가리키는 포인터들을 모아둔 table
- Class당 1개 생성된다.(object가 여러 개여도)
- virtual function이 하나라도 있는 object는 모두 virtual function table을 가리키는 포인터 1개를 가지고 있다.
- 선언된 형식이 base object라도, virtual이 있으면, runtime에 실제 생성된 object인 derived를 가리킨다.
- virtual function table이 가리킬 실제 method들은 compile time에 정해진다.
- child에 해당 method 없으면 parents의 method 가리킴.
Overloading vs Overriding
- Overloading : 같은 이름. 다른 parameter list. 공존. only compile time
- Overriding : 같은 이름. 같은 parameter list. 하나만 선택하여 사용(덮어씀), both compile&run time
Overloading Operators
-
operator를 overloading하여, 내가 지정한 클래스의 operation을 만들 수 있다.
-
선언 및 호출 : 2가지 형식이 있다.
-
member function
//선언 class CVector{ public: CVector operator+(const CVector&); } CVector CVector::operator+ (const CVector& param){ CVector temp; temp.x = x + param.x; temp.y = y + param.y; return temp; } //호출 CVector foo(3, 1); CVector bar(1,2); CVector result; // 아래 2가지 형태 모두 가능 result = foo + bar; result = foo.operator+ (bar);
-
non-member function
//선언 CVector operator+ (const CVector& lhs, const CVector& rhs){ CVector temp; temp.x = lhs.x + rhs.x; temp.y = lhs.y + rhs.y; return temp; } //호출 CVector foo(3, 1); CVector bar(1,2); CVector result; // 아래 형태만 가능 result = foo + bar;
-