1 분 소요

  • 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 image

    • 해당 클래스의 virtual method들을 가리키는 포인터들을 모아둔 table
    • Class당 1개 생성된다.(object가 여러 개여도)
    • virtual function이 하나라도 있는 object는 모두 virtual function table을 가리키는 포인터 1개를 가지고 있다.

    image

    • 선언된 형식이 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을 만들 수 있다. image

  • 선언 및 호출 : 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;
      

태그:

카테고리:

업데이트: