상세 컨텐츠

본문 제목

C++언어 강좌(공부) #15~17장

카테고리 없음

by 바래다주기 2024. 5. 8. 00:16

본문

15. 바인딩

정적 바인딩 : 컴파일 타임에 자료형 / 타입에 따라 어떤 함수를 호출할 지 결정하는 바인딩 방식
                      CObj* player = new CPlayer => CObj의 함수를 호출한다
                      정적 바인딩에서는 앞쪽에 선언된 Type에 따른다

 

동적 바인딩 : 런 타임에 가지고 있는 가상 함수 테이블에 따라 어떤 함수를 호출할 지 결정하는 바인딩 방식
                      CObj* player = new CPlayer; => 동적 바인딩 방식의 경우 뒤에 CPlayer의 함수를 호출 한다
                      동적 바인딩에서는 뒤쪽에 선언된 Type에 따른다

16. inline 함수

함수 매크로 - 전처리기 문법


장점 : 1. 단순 치환 기능으로 속도가 매우 빠름
          2. 자료형에 구애받지 않음

 

단점 : 1. 컴파일 타임의 문법으로 런타임의 에러 파악 불가
          2. 단순 치환이므로 연산자 우선 순위 지정이 중요함
          3. 긴 함수는 가독성이 떨어짐

inline함수

ex)
inline void Func() { cout << "hello world!" << endl }
함수 매크로(define)의 장단점을 보완하기 위한 문법
inline함수는 함수 매크로가 컴파일 타임에 동작하는 단점을 해결하는 문법
but... 자료형에 의존적이며 선언 여부에 관계 없이 컴파일러 스스로 inline 여부 적용

 

유의 사항 - 자동적으로 일반 함수로 변환되는 경우

  1. inline함수를 함수 포인터로써 사용하는 경우
    포인터라는 문법 자체가 주소에 접근하는 문법
    주소를 가지기 위해선 메모리에 할당되어야 함
    하지만 inline함수는 메모리에 등록되지 않는다 -> 자동적으로 일반 함수로 변환됨

  2. inline함수를 재귀 함수로써 사용하는 경우
    재귀 호출은 스택 프레임을 활용하여 함수 호출 횟수를 파악함
    하지만 inline함수는 메모리에 등록된 적이 없으므로 스택 프레임 확인이 불가능하다

17. 연산자 오버로딩

연산자 오버로딩 : 함수의 오버로딩 문법을 연산자에 적용시킨 문법 좌측의 객체를 기준으로 수행, C++클래스에서 가능한                               문법

 

일반적으로 클래스끼리의 합, 차 연산은 각 클래스 내부의 멤버 수를 알 수 없기에 진행 불가 => 연산자 오버로딩을 통해서 가능하게 할 수 있다


ex)
class COperator
{
private:
       int m_First;
       int m_Second;

 

public:
      COperator() {}
      COperator(int _First, int _Second) : m_First(_First), m_Second(_Second) {}
      ~COperator() {}

 

public:
       COperator operator + (COperator& rObj)
       {
                       COperator Result((m_First + rObj.m_First), (m_Second + rObj.m_Second));
                       return Result;
        }
        COperator operator - (COperator& rObj)
       {
                       COperator Result((m_First - rObj.m_First), (m_Second - rObj.m_Second));
                       return Result;
        }
       COperator& operator = (COperator& rObj)
       {
                        // 자기 자신을 가공해야 하므로 &를 통해 실제 값에 접근
                        m_First = rObj.m_First;
                        m_Second = rObj.m_Second;
                        return *this;
        }
       COperator& operator ++ ()
       {
                          // 전위 연산의 경우
                          m_First += 1;
                          m_Second += 1;
                          return *this;
       }
      COperator& operator ++ (int)
      {
                          // 후위 연산의 경우 -> 매개변수에 연산할 자료형을 명시
                         COperator Obj(*this); // 자기 자신을 먼저 불러온 후 연산을 진행하기 위함
                         m_First -= 1;
                         m_Second -= 1;

                         return Obj;
       }
};

 

operator : 다른 객체를 매개변수로 받아 함수 내에서 연산

 

default 대입 연산자 : 클래스 생성 시 자동 생성도는 4요소 중 하나
                                   대입 연산자를 따로 선언하더라도 객체를 초기화 하는 순간에는 default 대입 연산자 작동
                                   얕은 대입 / 깊은 대입 존재하지만, 깊은 대입은 잘 사용되지 않음