Skip to content

[CPP] 제 3장. C언어와 CPP

garynoh edited this page Nov 7, 2017 · 4 revisions

C언어와 C++ 의 차이점

  • C++ 은 함수 오버로딩(function overloading) 을 지원한다 (C 언어는 지원하지 않는다)
  • 함수 오버로딩이란, 함수 이름이 같아도 인자의 갯수가 다르거나 타입이 다를 경우, 다른 함수로 인식하는 것을 의미한다.
  • 왜 다를까? C 언어의 경우 함수를 호출할 때 함수의 이름만 이용해서 찾지만, C++ 의 경우 함수의 이름과 매개변수의 선언을 보고 호출대상을 찾는다.
  • 매개 변수의 타입 또는 갯수가 달라야 한다. 반환값은 달라도 함수 오버로딩을 할 수 없다!
  • C++은 매개편수의 디폴트 값을 줄 수 있다. (C언어는 초깃값을 줄 수 없다) <예시>
void myfunc(int a = 1, int b = 2){
	return a + b;
}
myfunc();

결과값 : a = 1, b = 2

myfunc(100);

결과값 : a = 100, b = 2

myfunc(10, 20);

결과값 : a = 10, b = 20

  • a 인자값이 없으면 초깃값을 1로 지정해주고, b 인자값이 없으면 초깃값을 2로 지정해준다. 이 때, 전달된 인자는 왼쪽부터 채워져가고, 부족한 부분은 디폴트 값으로 설정이 된다.
  • ⚠️ 이 점을 고려할 때, 초깃값 지정은 오른쪽부터 채워나가야한다. 초깃값 지정을 왼쪽부터 해나간다면, cpp 컴파일러가 인식할 때, 초깃값 지정되어있는 매개변수를 건너뛰고 그 다음 매개변수부터 값을 대입을 해줄 수가 없기 때문이다.
int myfunc(int a = 1, int b); (🚫)

int main(){
  myfunc(2); (🚫)
  return 0;
}
  • 함수 원형 선언부에서만 초깃값을 지정해줄 수 있다 (컴파일러의 순서를 생각해보면 당연)
#include <iostream>

int myfunc(int a = 1, int b = 2);

int main(){
  cout << myfunc() << "\n";
  return 0;
}

int myfunc(int a, int b){
  return (a + b)*100;
}
  • 초깃값을 설정한 함수의 경우, 함수 오버로딩 문제를 고려해야한다. 예를 들어,
int myfunc(int a = 1);(🚫)
int myfunc(void);(🚫)

int main(){
  myfunc();(🚫)
  return 0;
}
  • 위와 같이 두 개의 함수를 선언하고 매개변수의 타입이 다르기 때문에 함수 오버로딩이 가능할 것 같지만, myfunc(); 이 a = 1 의 초깃값을 가지는 함수로도 인식을 할 수 있기 때문에, 이런 모호성 때문에 위와 같은 사용은 불가능하다.

인라인(inline) 함수

  • 매크로 함수

    • ➕ 전처리기에 의해 처리되기 때문에 속도가 빠르다.
    • ➕ 자료형에 의존적이지 않다.
    • ➖ 복잡한 함수를 정의하는 것이 불편하다.
    • ➖ 디버깅이 어렵다.
  • 인라인 함수 : 매크로 함수가 가지고 있는 장점을 채택(빠르다)하고, 단점(복잡한 함수 정의 어려움)은 해결했다.

    • 컴파일러에 의해서 처리된다 (하지만 빠르다?)
    • ➖ 자료형에 의존성을 가진다 (함수처럼) -> 이것을 해결하는 것이 template 이라는 것 예를 들어,
#define SQUARE(x) ((x)*(x))

일 때, SQUARE(1) 이던지, SQUARE(1.5) 던지 상관없이 자료형이 보존이 된다. 하지만

inline int SQUARE(int x){
  return x*x;
}

는 소수점을 버리게 되므로 자료형(double)이 손실된다. template 사용법은 다음과 같다.

#include <iostream>
using namespace std;
//자료형을 단정짓지 못하는 template T
template <typename T>
//인라인 함수 선언 : 반환값도 T, 매개변수도 T
inline T SQAURE(T x){
    return x*x;
}

int main(int argc, const char * argv[]) {
    cout << SQAURE(3);
    cout << SQAURE(1.5);
    return 0;
}

열혈C++ 프로그래밍 (윤성우)

Clone this wiki locally