Media Log


1. 함수 오버로딩(Function Overloading)


함수 오버로딩(Function Overloading)이란, 함수명은 같으며 인자의 자료형이나 수가 다른 함수의 선언을 허용하는 것을 말합니다. C에서는 함수 오버로딩을 허용하지 않았지만, C++에서는 아래와 같이 두 함수의 이름이 같아도 컴파일러가 오류를 발생시키지 않습니다.

#include <iostream>

using namespace std;

void func(int a)
{
	cout << "void func(int a)이 호출됨!" << endl; 
}

void func(int a, int b)
{
	cout << "void func(int a, int b)이 호출됨!" << endl;
}

int main()
{
	func(4);
	func(5, 6);

	return 0;
}

결과:

void func(int a)이 호출됨!

void func(int a, int b)이 호출됨!

계속하려면 아무 키나 누르십시오 . . .


바로 전 강좌인 '3편. 네임스페이스'에서 using 지시자를 배웠었죠? 한번 3행을 보시면, std라는 네임스페이스를 사용하겠다는 말이 됩니다. 이제 더는 귀찮게 std::를 일일이 붙여주지 않아도, 그대로 사용할 수 있습니다. 이번 강좌부터는, 편의를 위해 using namespace std;를 포함시킬 생각입니다.


코드로 돌아가, 5행을 먼저 살펴보도록 합시다. 여기서 주목하셔야 할 부분은 매개변수 부분입니다. 정수형 변수 a가 매개변수로 와있습니다. 그리고 10행을 보시면 이번에는 정수형 변수 a, b가 매개변수로 와있습니다. 5행과 10행에서 똑같은 함수명으로 함수가 정의되었으나, 매개변수의 수는 다릅니다. 결과를 살펴보시면 넘겨주는 인자의 수에 따라 출력되는 결과가 다른 것을 확인할 수 있습니다.


17행을 살펴보면, 인자로 4를 넘겨주었는데 이 경우에는 위에 정의된 함수 중 매개변수가 한 개인 함수를 호출합니다. 두 개를 넘겨주면 매개변수가 두 개인 함수를 호출하죠. 물론 세 개를 넘겨주면 인수 목록과 일치하는 오버로드된 함수가 없어 컴파일러에서 오류를 내보냅니다.


함수 오버로딩의 특징을 정리하자면 아래와 같습니다.


(1) 함수명이 같아야 한다.

(2) 매개변수의 수가 다르거나, 아니면 그 매개변수의 수가 같고 자료형이 달라야만 한다.

(3) 위의 두 조건을 모두 만족하면 반환형의 차이는 함수 오버로딩에 영향을 미치지 않는다.


예를 들면 아래와 같습니다. 참고로, 아래에서 double add(int a, int b) { ... } 꼴의 함수를 추가시키면 오류가 발생합니다. 1행의 코드와 비교했을 때, 매개변수의 수나 자료형은 모두 같고 반환형만 다르기 때문입니다.

int add(int a, int b) { ... } // add(3, 4);
int add(double a, double b) { ... } // add(1.2, 3.4);
float add(float a, float b) { ... } // add(3.4f, 5.6f);
int add(int a, int b, int c) { ... } // add(1, 2, 3);

함수 오버로딩에 관한 강좌는 여기서 그만 마치도록 하겠습니다. 수고하셨습니다.


다음 강좌에서는 new, delete에 대해 알아보도록 하겠습니다.

저작자 표시
신고
  1. 김광연 at 2013.02.18 21:43 신고 [edit/del]

    std 라는 네임스페이스 를 선언하지 않았는데 왜 using 하는거죠?

    Reply
  2. EXC at 2014.04.05 03:22 신고 [edit/del]

    설명 잘해주시네요!

    Reply
  3. 9reenw1ch at 2014.06.08 23:50 신고 [edit/del]

    댓글 달게 만드네요 설명 굿입니다.

    Reply
  4. 민상 at 2015.01.16 16:26 신고 [edit/del]

    잘 배우고 있습니다 감사합니다^^

    Reply
  5. 늦깎이 at 2015.02.20 09:25 신고 [edit/del]

    마흔 다되어 프로그래밍배우고 있습니다. 참 좋은 입문 사이트입니다. 감사합니다

    Reply
  6. 공부하자 at 2015.04.01 10:01 신고 [edit/del]

    정말 감사합니다 덕분에 정말 쉽고 많이 배우고 갑니다 정말 감사합니다!!

    Reply
  7. 마이크로소프트정복자 at 2016.03.16 01:08 신고 [edit/del]

    정말 재밌네요^^ C++에 대해 안좋은 감정만 있다가 그런 감정이 사라진 것 같아요~
    이제는 C, Java, Python, C++ 중 2개 만 골라야겠군요!!ㅋㅋ

    Reply
  8. ryan at 2016.05.03 07:54 신고 [edit/del]

    대단히 감사합니다. 정주행 중입니다 ㅎㅎ
    처음 보는 사람을 위해 예제를 cout << "void func int(" < a < ", " < b < " called" ... 요런 식이나 아니면 간단한 연산을 넣는 것은 어떨지 생각이 듭니다 ( 안 그래도 이해는 잘 가고 잼있어요! ㅎㅎ )

    Reply
  9. Hello at 2017.01.10 09:46 신고 [edit/del]

    반환형은 같거나 다르거나 상관 없다고 하셨는데
    다르면 안되지 않을까요?
    매개변수가 똑같은 두 함수가 있고 반환형이 다르면 두 함수중에 누가 호출되는지 알 수 없기 때문에 코드진행이 불가능할 것 같습니다.

    Reply
    • KY at 2017.02.07 23:27 신고 [edit/del]

      한 예시로, func(int a)와 func(double b) 가 있다고 생각해보시면 쉬울 것 같습니다. main에서 호출 시, func(3.2);를 호출하면 double b의 파라메터가 있는 함수로 호출 될 것입니다.

    • 나그네 at 2017.09.27 15:34 신고 [edit/del]

      @Hello 매개변수가 똑같으면 컴파일 자체가 안되기 때문에 그런 상황은 생각할 필요가 없어집니다.

    • BlogIcon EXYNOA at 2017.10.10 20:05 신고 [edit/del]

      의도는 '함수명이 같다.'와 '매개변수의 수가 다르거나, 아니면 그 매개변수의 수가 같고 매개변수의 자료형이 다르다.'를 만족하면 '함수의 반환형은 같거나 달라도 상관이 없다.'였습니다.

      오해가 충분히 발생할 수 있는 부분이라서 해당 부분을 수정했습니다. 감사합니다 ^ㅡ^*

  10. 질문드립니다 at 2017.03.08 21:17 신고 [edit/del]

    C++잘 보고있습니다. C는 학교에서 배웠었는데 가물가물해서 보니까 기억이 다시 나더라구요
    글 잘보고있습니다 감사합니다
    제 질문은
    윗 예제 그대로 따라해봤는데요 매개변수를 받아오는게 아니고 그대로 문구가 출력이 되는데 매개변수를 받아서 출력하려면 어떻게 해야하나요??

    Reply

submit

티스토리 툴바