(09_11) C++ 학습일지

런치·2023년 9월 25일
0

정적 바인딩( static binding ) vs 동적 바인딩( dynamic binding )

  • 바인딩 ( binding ) : 프로그램 소스에 쓰인 각종 내부 요소, 이름 식별자들에 대해 값 또는 속성이 확정되어 변경할 수 없어 묶이게(bind) 되는 과정(binding)
  • 정적 바인딩( static binding ) : 프로그램 소스에 명시적으로 타입과 그 타입의 변수 명을 선언
    컴파일 시 점프할 주소가 바인딩되며 비교적 속도가 빠르고 타입 오류시 해결이 쉬움

    // 정적 바인딩 예시 "int" 라는 타입과 "a"라는 변수명을 가짐
    int main()
    {
    	int a = 0 
    }
    
  • 동적 바인딩( dynamic binding ) : 실행(Runtime) 도중에 바인딩하므로 소스코드를 줄일 수 있고 유연하지만 정적 바인딩에 비해 실행 속도가 느리며 메모리 낭비가 발생할 수 있다.

    class A
    {
        virtual void print() {}
    }
    class B : A
    {
        override void print() {}
    }
    int main()
    {
        A* a = new A();
        a->print();
    
        B* b = new B();
        a = b;
        a->print();
    }
정적 바인딩(Static binding)동적 바인딩(Dynamic binding)
Compile 시 바인딩Runtime 시 바인딩
일반 함수 호출, 함수 오버로딩 및 연산자 오버로딩을 사용가상 함수를 사용
유연하지 않음 / 속도 빠름유연함/ 속도 느림

Function Overloading Vs Function Overriding

Function OverloadingFunction Overriding
함수의 중복함수의 재정의
같은 이름의 함수를 사용(인자, 매개변수로 구분)상속받은 함수를 사용, 재정의
리턴 타입만 바꿨을 때엔 적용되지 않음virtual 이나 override 키워드 사용

Abstract Base Class [ABC]

  • 순수 가상함수(Pure virtual function)
    virtual Animal Lion = 0 의 형태를 취하며 파생 클래스에서 재정의가 가능하다.
  • 추상 클래스 ( Abstract Class ) 는 하나 이상의 순수 가상함수를 가지며, 이 클래스로 부터 파생된 클래스는 반드시 가상함수를 재정의 해야한다.

< In-line function >

  • C++ 에서의 함수 호출 과정
  1. 함수의 호출 -> 스택에 함수로 전달할 매개변수와 함께 호출이 끝난 뒤 돌아갈 반환 주소값을 저장

  2. 프로그램의 제어가 함수의 위치로 넘어와 함수 내에 선언된 지역 변수도 스택에 저장

  3. 함수의 모든 코드를 실행 -> 실행 후 반환값을 넘겨 줌

  4. 프로그램의 제어는 스택에 저장된 돌아갈 반환 주소값으로 이동, 스택에 저장된 함수 호출 정보를 제거

인라인 함수(In-line function)은 위 과정을 거치지 않고 실행하기 위해서 inline 키워드를 이용해 사용

int min(int x, int y) 		-> inline int min(int x, int y)
{								{
    return x > y ? y : x;   		return x > y ? y : x;
}								}


int main()
{
    std::cout << min(5, 6) << '\n';
    std::cout << min(3, 2) << '\n';
    return 0;
}

매크로 함수 ( Macro function )

/* Macro function 예시 */
#include <stdio.h>
#define square(x) x *x  

int main(int argc, char **argv) {
  printf("square(4) : %d \n", square(4));

  return 0;
} 

#define square(x) x*x처럼 매크로 함수는 #define 함수명(인자) 치환할 것으로 선언
따라서 위 실행 결과는 16이 된다.

네임스페이스 ( Namespace )

  • Namespace 란 C++에서는 변수, 함수, 구조체, 클래스 등을 서로 구분하기 위해서 이름으로 사용되는 다양한 내부 식별자(identifier)를 가지고 있지만 프로그램이 복잡해지고 외부 라이브러리가 많아지게 되면 충돌할 가능성이 생기므로 충돌하지 않기 위해 만들어진 개념
  • 헤더 파일에서 정의
  • using 키워드 사용시
    1. using 지시자 : using namespace (네임스페이스 이름);
    2. using 선언 : using 네임스페이스이름::이름;
profile
점심을 안먹음

0개의 댓글