상세 컨텐츠

본문 제목

[TIL] 1 - 4. 객체지향 기본 문법 - C++에서 확장된 함수의 기능

언어/C++

by 민:하 2022. 2. 8. 02:55

본문

1. 함수 오버로딩(overloading)

C++에서 같은 이름의 함수를 두 개 이상 정의(구현)하여 사용하는 것.

  • 함수명은 같고 parameter list 부분이 달라야 함 (함수 리턴 값의 type은 상관X)
    • parameter의 개수, parameter의 type, 배치 순서로 구분
    • const 포인터와 일반 포인터는 다른 type으로 인식
  • 하나의 함수명으로 다양한 type에 대한 처리를 수행할 때 유용


2. 함수 오버로딩(overloading)시의 주의 사항

  • 오버로딩을 하게 되면 함수를 호출할 때 전달인자를 각 자료형의 대표 type으로 지정할 경우 해당 대표 type으로 자동형변환한다.
    • 대표 type : 정수형(int형) , 실수형(double형)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
void square(int);
void square(double);
int main(void) {
    char ch = 'A';
    short sh = 10;
    float ft = 3.4f;
    double db = 3.14;
 
    square(ch);        // square(int) 호출
    square(sh);        // square(int) 호출
    square(ft);        // square(double) 호출
    square(db);        // square(double) 호출
 
    return 0;
}
 
void square(int a) {
    cout << "int형으로 호출 : " << a*<< endl;
}
 
void square(double d) {
    cout << "double형으로 호출 : " << a*<< endl;
}
cs

3. 기본 전달인자(default parameter)

  • 함수 prototype에서 전달인자의 기본값을 정의
    • 매개변수의 변수명은 생략 가능
    • 기본 전달인자를 한 번 설정한 경우, 그 이후의 모든 parameter에도 기본 전달인자를 설정해야 한다.
    • argument를 기본 전달인자를 줄 경우, 처음부터 차례로 넣어야 한다. (퐁당퐁당 불가)
  • 전달 인자 없이 함수를 호출하는 경우 기본값이 사용됨
  • 모든 전달인자에 기본 전달인자를 준다면 전달인자 없이도 함수 호출이 가능
    • 기본 전달인자를 n개 사용하면 n + 1가지 형태의 함수 호출 가능
  • 기본 전달인자는 함수 호출부보다 이전에 표기되는 함수 선언부에서 지정해주는 것이 일반적
    • 함수 선언부가 있는데 함수 정의부에서 기본 전달인자를 지정하면 에러 발생
    • 함수 선언부와 함수 정의부 양 쪽에 기본 전달인자를 지정하면 에러 발생
  • 함수정의부만 사용하는 경우에는 함수정의부에서 지정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
void char_prn(char ch = '#'int cnt = 5); // 함수 prototype
//void char_prn(char = '#', int = 5);
 
int main(void) {
    char_prn();            // char_prn('#', 5);
    char_prn('@');         // char_prn('@', 5);
    char_prn('@'10);
    char_prn(10);         // char_prn((ASCII값이 10인 문자), 5);
    char_prn( , 10);     // 컴파일 에러
 
    return 0;
}
 
void char_prn(char ch, int cnt) {
    for(int i = 0; i < cnt; i++) {
        cout << ch;
    }
    cout << endl;
}
cs

4. 기본 전달인자(default parameter) 사용 시의 주의 사항

  • 기본 전달인자를 지정하면 그 이후의 모든 매개변수는 기본 전달인자로 지정되어야 한다.
    • void func ( int a = 10, int b, int c );          ( X )
    • void func ( int a = 10, int b = 20, int c );   ( X )
    • void func ( int a, int b = 20, int c );          ( X )
    • void func ( int a = 10, int b, int c = 30 );   ( X )
    • void func ( int a, int b = 20, int c = 30 );   ( O )
    • void func ( int a, int b, int c = 30 );          ( O )

5. 함수 오버로딩과 기본 전달인자 동시 사용 시 주의사항

  • 함수 오버로딩에 기본 전달인자를 설정하는 건 문제되지 않으나, 모호한 부분 발생시 오류
  • 아래 예시처럼 함수 오버로딩되어 있는 함수에게 default parameter를 지정하면 오류 발생
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
void prn(char *);
void prn(char *int = 10);
 
int main(void) {
    char str[10= "Star";
    prn(str);
    prn("Moon");            // void prn(char *)인지 void prn(char *, int)인지 모호 
    prn("Universe"3);
    return 0;
}
 
void prn(char *p) {
    cout << p << endl;
}
 
void prn(char *p, int rc) {
    for (int i = 0; i < rc; i++) {
        cout << p << endl;
    }
}
cs

6. 인라인(inline) 함수

  • 인라인 함수는 함수호출로 인한 부담을 줄이고 실행속도를 개선하기 위해 C++에서 추가한 문법
  • 인라인 함수는 함수 호출부에서 함수의 코드가 직접 삽입되는 형태로 컴파일
    • 컴파일러가 하는 일이기 때문에 기계어 상태로 대체된다.
    • 실행될 때는 왔다갔다 없이 쭉 실행된다.
  • 함수의 크기만큼 실행파일이 커지므로 메모리에 부담이 될 수 있으므로 주로 작은 함수에 사용하는 것이 효과적
    • inline 사용 시 : 실행 속도가 빠름. 실행파일 size가 커질 수 있음
    • inline 미사용 시 : 실행 속도가 느림. 실행파일 size는 작음
  • 클래스의 선언부에서 멤버함수를 정의하면 인라인 함수로 정의
  • inline 함수는 희망사항 함수 (컴파일러에 의해 inline 함수가 안될 수도 있다.) 
    • 함수의 머리(head)부분에 inline 예약어를 붙인다.
    • 인라인 함수는 호출하기 전에 반드시 먼저 정의되어야 한다. (header 파일 내에 정의하는 것이 좋다.)

 

< inline 함수가 희망사항 함수인 이유 >

  • inline 함수가 매우 길게 구성된 경우, 실행파일 사이즈가 엄청 커질 것을 컴파일러가 미리 걱정 → inline 불허가
  • 함수가 inline 상태인지 아닌지 알 방법은 없다.
  • 보통 inline으로 만드려는 함수가 적어도 20줄이 넘어가면 inline이 되기 쉽지 않다.

 

< header 파일에는 함수 선언만을 권장하는데 함수 정의를 어떻게 할까? >

  • 하나의 program에 하나의 file에만 헤더파일을 include하는 경우
    • 함수 정의가 헤더파일에 있어도 괜찮다.
  • 하나의 program에 두 개 이상의 file에 헤더파일을 include하는 경우
    • inline 예약어만 붙어있으면 Link과정에서 에러가 발생하므로 static 예약어를 붙인다.
    • static을 붙이면 각 file의 고유한 함수로 사용하기 때문에 문제가 발생하지 않는다.

 

< 인라인 함수와 매크로 함수 비교 >

  • 인라인 함수와 매크로 함수의 기능은 비슷하다.
  • 인라인 함수는 일반적인 함수의 특징을 그대로 가지고 있어 매크로 함수와 같은 부작용은 없다.
  • 인라인 함수는 매개변수의 자료형을 검사할 수 있으므로 정확하고 안전한 코드의 확장이 가능하다.
  • 매크로 함수는 전처리기에 의해 변환되는 것 뿐 일반적인 함수는 아니다.
  • 매크로 함수는 전달인자 type이 존재하지 않는다.
  처 리 특 징 부 작 용
inline 함수 컴파일러
(기계어 상태로 풀려 들어감)
전달인자 type 존재
call, return 등 일반함수 수행의 형태의 결과를 낸다.
X
macro 함수 전처리기
(Text 상태로 풀려 들어감)
전달인자의 type 존재X
return 값의 type 존재X
풀려들어간 상태로 실행
전달인자에 ++, --를 사용했을 때 부작용 발생할 가능성이 있다.

 

< 매크로 함수의 부작용 >

  • 증감연산자( ++, -- ) 사용시 발생
  • 컴파일러마다 값이 다르게 나오는 경우 발생

관련글 더보기

댓글 영역