1.C 기반의 C++ part 1 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park
함수 Jong Hyuk Park
함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능 같은이름을갖는각함수는인수의형과갯수, 함수의반환형에의해구분 함수뿐만아니라연산자오버로딩도가능 ( 향후다시소개 ) 3
함수오버로딩 (overloading) 함수이름의중복! 파일의확장자는.C 이다! 무엇이문제? int function(void) return 10; int function(int a, int b) return a+b; 4 int main(void) function(); function(12, 13); return 0;
함수오버로딩 (overloading) 함수오버로딩이란? 동일한이름의함수를중복해서정의하는것! 함수오버로딩의조건 매개변수의개수혹은타입이일치하지않는다. 함수오버로딩이가능한이유 호출할함수를매개변수의정보까지참조해서호출 함수의이름 + 매개변수의정보 5
함수오버로딩 (overloading) 함수오버로딩의예 FunctionOverloading.cpp int function1(int n) int function1(char c) int function2(int v) int function2(int v1, int v2) 6
// 절대값함수의중복정의 #include <iostream> 오버로딩예 int abs(int n); // 정수의절대값함수 double abs(double n); // double 형실수의절대값함수 int main(void) -123 절대값 : 123 std::cout << "-123 절대값 : " -12.345 절대값 : 12.345 << abs(-123) << '\n'; std::cout << "-12.345 절대값 : " << abs(-12.345) << '\n'; 절대값을구하는 2 개의함수가 return 0; 모두같은이름의 abs() 로사용 되었으나각함수는서로다른 // 정수형인수의 abs() 함수인수의형에따라구분된다. int abs(int n) return n < 0? -n : n; // double 정수형인수의 abs() 함수 double abs(double n) return n < 0? -n : n; 7
디폴트매개변수 ( 인수 ) 디폴트매개변수란? 전달되지않은인자를대신하기위한기본값이 설정되어있는변수 8 그림 1-2
디폴트매개변수예 #include <iostream> int BoxVolume(int length, int width=1, int height=1); int main(void) std::cout<<"[3, 3, 3] : "<<BoxVolume(3, 3, 3)<<std::endl; std::cout<<"[5, 5, def] : "<<BoxVolume(5, 5)<<std::endl; std::cout<<"[7, def, def] : "<<BoxVolume(7)<<std::endl; return 0; int BoxVolume(int length, int width, int height) return length*width*height; [3, 3, 3] : 27 [5, 5, def] : 25 [7, def, def] : 7 9
디폴트매개변수 ( 인수 ) C++ 언어에서는함수선언시인수의디폴트 (default) 값을지정 디폴트값이지정된인수는함수호출시인수를생략 인수가생략된경우에는자동적으로디폴트값으로선언된값을인수로전달 인수의디폴트값의선언시디폴트값이선언된인수뒤에오는모든인수에대해서는디폴트값을지정해야함. 10
디폴트매개변수와함수오버로딩 #include<iostream> int function(int a=10) return a+1; int function(void) return 10; std::cout<<function()<<std::endl; int main(void) std::cout<<function(10)<<std::endl; return 0; 11
인-라인함수 (inline function) 인-라인함수를이용하여정의된함수를호출하면호출한함수로분기하여함수를실행한후복귀하는것이아니라호출한함수의내용을복사하여실행 C 언어의매크로정의함수를사용하는것과같은기능 매크로정의함수인경우인수의전달시부작용 (side effect) 을갖는데반하여확장함수는일반함수와같이부작용없이안전하게사용 인-라인함수는일반함수와같이함수로분기하여실행한후복귀하는과정이없이직접실행하므로일반함수보다프로그램의실행속도가빠름 함수를호출할때마다함수의내용이복사되므로프로그램의코드길이가길어진다는단점 일반적으로확장함수는코드의길이가짧은경우에주로사용 확장함수의정의는함수정의앞에 inline이란키워드를붙임 12
인라인 - 함수사용예 #include <iostream> #define SQUARE(x) ((x)*(x)) )) int main(void) std::cout<<square(5)<<std::endl; return 0; #include <iostream> inline int SQUARE(int x) return x*x; int main(void) std::cout<<square(5)<<std::endl; return 0; 13
이름공간 (namespace) Jong Hyuk Park
이름공간 (namespace) 이름공간 최근 C++ 에추가된기능으로변수, 함수이름등의영역지정기능 사용예 Lee와 Kim이두사람이독자적으로프로그램개발후통합하는예 두사람모두다른기능의 foo() 함수정의 namespace 으로이름공간정의, :: 으로이름공간표시 15 namespace Lee namespace Kim main() void foo() void foo() Kim::foo(); Lee::foo();
이름공간 (namespace) 16 이름공간이란? 공간에이름을주는행위! "202 호에사는철수야" #include <iostream> void function(void) std::cout<<"a.com에서정의한함수 "<<std::endl; void function(void) std::cout<<"b.com 에서정의한함수 "<<std::endl; int main(void) function(); return 0;
이름공간 (namespace) #include <iostream> Namespace A_COM void function(void) std::cout<<"a.com에서정의한함수 "<<std::endl; Namespace B_COM void function(void) std::cout<<"b.com 에서정의한함수 "<<std::endl; int main(void) A_COM::function(); B_COM::function() return 0; 17
이름공간 (namespace) 이름공간의적용 namespace1.cpp 그림 1-5 18 그림 1-4
이름공간 (namespace) 아하! std 란 namespace! 그림 1-6 19
이름공간 (namespace) 편의를위한 using 선언! using A_COM::function; using namespace A_COM; 20
표준라이브러리이름공간 C++ 컴파일러가제공하는표준라이브러리의함수, 변수, 클래스등은 std 이름공간영역으로지정 새 C++ 에서는.h 확장자생략하고이름공간명시 #include <iostream.h> main() cin >> data; cout << sum; #include <iostream> main() using std::cin; cin >> data; std::cout << sum; #include <iostream> using namespace std; main() cin >> data; cout << sum; 21
변수의범위지정연산자 C 언어에서는자동변수 ( 지역변수 ) 와외부변수 ( 전역변수 ) 가같은이름으로선언되어사용되었을때에는자동변수의값이참조 C++ 언어에서는이와같은경우변수앞에 :: 연산자를해당변수앞에기술하면외부변수를참조하는것이가능 22
범위지정연산자사용예 #include <iostream> using namespace std; int a = 88; 1-1 a = 10 1-2 ::a = 88 int main(void) 2-1 a = 20 int a = 30; 2-2 ::a = 88 3-1 a= 30 int a = 10; 3-2 ::a = 88 cout << "1-1 a = " << a << "\n"; // a = 10 참조 cout << "1-2 ::a = " << ::a << "\n"; // a = 88 참조 int a = 20; cout << "2-1 a = " << a << "\n"; // a = 20 참조 cout << "2-2 ::a = " << ::a << "\n"; // a = 88 참조 :: 연산자는블럭의위치 에관계없이외부변수를 참조한다. cout << "3-1 a = " << a << "\n"; // a = 30 참조 cout << "3-2 ::a = " << ::a << "\n"; // a = 88 참조 return 0; 23
Jong Hyuk Park