[C++1] 함수 오버로딩, 디폴트 값, 인라인함수, namespcae

모옹·2023년 12월 1일
0

C++

목록 보기
1/10

1. C++의 특성

1-1. 함수 오버로딩

int Func(int num){
	num++;
    return num;
}

int Func(int numA, int numB){
	return numA - numB;
}

C언어에서는 함수 이름이 같은 것을 허용하지 않는다. 하지만 C++에서는 함수 호출 시 전달되는 인자를 통해서 호출하는 함수의 구분이 가능하기 때문에 이런 함수 정의를 허용하고 있다. 이를 함수 오버로딩(Overloading) 이라고 한다.
C언어는 호출할 함수를 찾을 때, 함수의 이름만을 이용해서 대상을 찾는다. C++에서는 함수의 이름, 매개변수의 선언을 이용해서 호출 대상을 찾으므로 오버로딩이 가능하게 된다. 매개변수의 개수, 자료형이 다른 경우 오버로딩이 가능하고 함수의 반환형만 다른 경우에는 오버로딩의 예시가 아니다.

1-2. 매개변수의 디폴트 값

int Func(int num=2){
	return num+1;
}

위와 같이 매개변수를 int num=2 처럼 값을 지정하는 경우, 매개변수 값이 주어지지 않는 경우 디폴트값을 2로 설정하겠다는 의미이다. 이 경우, Func()Func(2)는 같은 값을 반환받는다.
필요한 인자보다 적은 매개변수가 전달되면, 왼쪽 부터 전달되고 남은 것들은 디폴트 값으로 설정된다. 디폴트 값은 오른쪽 인자부터 설정하는 것이 가능하다.
예를 들어, Func(int a, int b, int c = 5) 는 정의가 가능하지만, Func(int a = 1, int b, int c) 는 정의가 불가능하다.

Func(int a = 10){
	return a;
}

Func(char x = 'A'){
	return 0;
}

위의 경우 Func()로 보냈을 때, 어떤 함수를 호출한 지 모르게 된다. 따라서, 매개변수의 디폴트 값이 있는 함수 두 개 이상을 함께 쓰면 문제가 생긴다.

1-3. 인라인 함수

C언어에 존재하는 매크로 함수는 [인라인화] 함수의 몸체 부분이 함수의 호출 부분을 대신해주며, 다음과 같은 장단점이 있다.

장점
1. 단순 치환만 해주므로, 인수의 타입을 신경 쓰지 않는다.
2. 여러 개의 명령문을 동시에 포함할 수 있다.
3. 함수 호출에 의한 성능 저하가 일어나지 않으므로, 실행 속도가 향상된다.

단점
1. 원하는 결과를 얻는 정확한 매크로 함수의 정의가 어렵고 디버깅도 매우 어렵다.
2. 복잡해질수록 괄호로 인해 가독성이 떨어진다.

정의하기 어렵다는 매크로 함수의 단점을 일반 함수처럼 정의가 가능하면 좋겠다는 필요를 C++에서는 인라인 함수가 만족한다.

inline 함수의 사용 예제

인라인 함수는 몸체부분이 호출문을 대체하며, 일반 함수와 같은 정의가 가능하다.

매크로를 이용하면 전처리기에 의해 인라인화되지만, inline 키워드를 이용하면 컴파일러에 의해서 인라인화된다. 컴파일러는 inline 키워드가 성능에 문제를 일으킨다고 판단하면 무시하거나 임의로 inline 처리를 하기도 한다.

매크로함수의 장점을 완전히 대체하지는 못한 인라인 함수

또한, 타입에 제약이 없는 매크로 함수와는 달리 인라인 함수는 타입형에 제약을 받는다. 함수의 오버로딩으로 해결할 수는 있다. (하지만 그럼 또 매크로 함수의 장점이 옅어지는.. ) 템플릿을 이용해 극복할 수도 있다.

1-4. namespace

namespace 설명 코드

여럿이서 하나의 프로그램을 개발할 경우, 같은 기능을 다른 이름으로 구현하거나 다른 기능을 같은 이름으로 구현하는 경우가 생길 수도 있다.
위와 같은 상황에서 Func()라는 함수 이름이 중첩되지만 각각 A, B 라는 namespace에서 정의되고 있으므로 문제가 발생하지 않는다.

:: 는 범위지정연산자로, 이름 공간을 지정할 때 사용한다.

int a = 5;

int main(){
	int a = 5;
    a++;		// 지역변수에 접근
    ::a++;		// 전역변수에 접근

전역변수와 지역변수의 이름이 중첩될 때, 범위지정연산자를 사용해 전역변수에 접근할 수도 있다.


<출처 : 윤성우의 열혈 C++ 프로그래밍>
위 책을 공부하며 정리한 내용입니다.

0개의 댓글