정적 바인딩( static binding ) vs 동적 바인딩( dynamic 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 Overloading | Function Overriding |
---|---|
함수의 중복 | 함수의 재정의 |
같은 이름의 함수를 사용(인자, 매개변수로 구분) | 상속받은 함수를 사용, 재정의 |
리턴 타입만 바꿨을 때엔 적용되지 않음 | virtual 이나 override 키워드 사용 |
Abstract Base Class [ABC]
virtual Animal Lion = 0
의 형태를 취하며 파생 클래스에서 재정의가 가능하다.< In-line function >
함수의 호출 -> 스택에 함수로 전달할 매개변수와 함께 호출이 끝난 뒤 돌아갈 반환 주소값을 저장
프로그램의 제어가 함수의 위치로 넘어와 함수 내에 선언된 지역 변수도 스택에 저장
함수의 모든 코드를 실행 -> 실행 후 반환값을 넘겨 줌
프로그램의 제어는 스택에 저장된 돌아갈 반환 주소값으로 이동, 스택에 저장된 함수 호출 정보를 제거
인라인 함수(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 )
using
키워드 사용시using namespace (네임스페이스 이름);
using 네임스페이스이름::이름;