1.C 기반의 C++ 스트림입출력 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park
스트림입출력 Jong Hyuk Park
printf 와 scanf 출력의기본형태 iostream 헤더파일의포함 HelloWorld2.cpp std::cout << 출력대상 ; S td::cout<< 출력대상 1<< 출력대상 2<< 출력대상 3; std::cout<<1<<'a'<<"string"<<std::endl; 3
printf 와 scanf 입력의기본형태 iostream 헤더파일의포함 SimpleAdder2.cpp std::cin>> 입력변수 ; std::cin>> 입력변수 1>> 입력변수 2>> 입력변수 3; std::cin>>val1; 4
입출력연산자 C++ 언어에서는스트림입출력연산자를사용하여표준입출력 스트림 (stream) 이란물리적인입출력장치를입출력이순서대로이루어지는가상의통로로정의 cin, cout, cerr 로정의된예약어와 <<, >> 스트림연산자와함께사용 표준입력 #include <iostream> std::cin >> 변수 [ >> 변수 ]; 표준출력 #include <iostream> std::cout << 식 [ << 식 ]; 표준에러출력 #include <iostrem> std::cerr << 식 [ << 식 ]; 5
입출력예 #include <stdio.h> int main(void) int sum, i, n; scanf( %d, &n); sum = 0; for (i=1; i <= n; i++) sum += i; printf( sum = %d\n, sum); return 0; #include <iostream.h> int main(void) int sum, i, n; cin >> n; sum = 0; for (i=1; i <= n; i++) sum += i; cout << sum = << sum << endl; return 0; #include <iostream> int main(void) int sum, i, n; std::cin >> n; sum = 0; for (i=1; i <= n; i++) sum += i; std::cout << sum = << sum << endl; return 0; 6
함수 Jong Hyuk Park
함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능 같은이름을갖는각함수는인수의형과갯수, 함수의반환형에의해구분 함수뿐만아니라연산자오버로딩도가능한데이에관한자세한소개는 10 장에서소개 8
함수오버로딩 (overloading) 함수이름의중복! 파일의확장자는.C 이다! 무엇이문제? int function(void) return 10; int function(int a, int b) return a+b; int main(void) function(); function(12, 13); return 0; 9
함수오버로딩 (overloading) 함수오버로딩이란? 동일한이름의함수를중복해서정의하는것! 함수오버로딩의조건 매개변수의개수혹은타입이일치하지않는다. 함수오버로딩이가능한이유 호출할함수를매개변수의정보까지참조해서호출 함수의이름 + 매개변수의정보 10
함수오버로딩 (overloading) 함수오버로딩의예 FunctionOverloading.cpp int function1(int n) int function1(char c) int function2(int v) int function2(int v1, int v2) 11
// 절대값함수의중복정의 #include <iostream> 오버로딩예 int abs(int n); // 정수의절대값함수 double abs(double n); // double 형실수의절대값함수 int main(void) std::cout << "-123 절대값 : " << abs(-123) << '\n'; std::cout << "-12.345 절대값 : " << abs(-12.345) << '\n'; return 0; // 정수형인수의 abs() 함수 int abs(int n) return n < 0? -n : n; -123 절대값 : 123-12.345 절대값 : 12.345 절대값을구하는 2 개의함수가모두같은이름의 abs() 로사용되었으나각함수는서로다른인수의형에따라구분된다. // double 정수형인수의 abs() 함수 double abs(double n) return n < 0? -n : n; 12
디폴트매개변수 ( 인수 ) 디폴트매개변수란? 전달되지않은인자를대신하기위한기본값이설정되어있는변수 DefaultParameter1.cpp 13 그림 1-2
디폴트매개변수예 DefaultParameter2.cpp #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 14
디폴트매개변수 ( 인수 ) C++ 언어에서는함수선언시인수의디폴트 (default) 값을지정 디폴트값이지정된인수는함수호출시인수를생략 인수가생략된경우에는자동적으로디폴트값으로선언된값을인수로전달 인수의디폴트값의선언시디폴트값이선언된인수뒤에오는모든인수에대해서는디폴트값을지정해야함. 15
디폴트매개변수와함수오버로딩 #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; 16
인 - 라인함수 (inline function) 인 - 라인함수를이용하여정의된함수를호출하면호출한함수로분기하여함수를실행한후복귀하는것이아니라호출한함수의내용을복사하여실행 C 언어의매크로정의함수를사용하는것과같은기능 매크로정의함수인경우인수의전달시부작용 (side effect) 을갖는데반하여확장함수는일반함수와같이부작용없이안전하게사용 인 - 라인함수는일반함수와같이함수로분기하여실행한후복귀하는과정이없이직접실행하므로일반함수보다프로그램의실행속도가빠름 함수를호출할때마다함수의내용이복사되므로프로그램의코드길이가길어진다는단점 일반적으로확장함수는코드의길이가짧은경우에주로사용 확장함수의정의는함수정의앞에 inline 이란키워드를붙임 17
인라인 - 함수사용예 #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; 18
이름공간 (namespace) Jong Hyuk Park
이름공간 (namespace) 이름공간 최근 C++ 에추가된기능으로변수, 함수이름등의영역지정기능 사용예 Lee 와 Kim 이두사람이독자적으로프로그램개발후통합하는예 두사람모두다른기능의 foo() 함수정의 namespace 으로이름공간정의, :: 으로이름공간표시 20 namespace Lee void foo() namespace Kim void foo() main() Kim::foo(); Lee::foo();
이름공간 (namespace) 21 이름공간이란? 공간에이름을주는행위! "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; 22
이름공간 (namespace) 이름공간의적용 namespace1.cpp 그림 1-5 23 그림 1-4
이름공간 (namespace) 아하! std 란 namespace! 그림 1-6 24
이름공간 (namespace) 편의를위한 using 선언! using1.cpp, HelloWorld3.cpp using2.cpp, HelloWorld4.cpp using A_COM::function; using namespace A_COM; 25
이름공간 (namespace) 범위지정연산자기반전역변수접근 int val=100; int val=100; int main(void) int val=100; val+=1; return 0; int main(void) int val=100; ::val+=1; return 0; 26
표준라이브러리이름공간 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; 27
변수의범위지정연산자 C 언어에서는자동변수 ( 지역변수 ) 와외부변수 ( 전역변수 ) 가같은이름으로선언되어사용되었을때에는자동변수의값이참조 C++ 언어에서는이와같은경우변수앞에 :: 연산자를해당변수앞에기술하면외부변수를참조하는것이가능 28
범위지정연산자사용예 #include <iostream> using namespace std; int a = 88; int main(void) int a = 30; int a = 10; cout << "1-1 a = " << a << "\n"; cout << "1-2 ::a = " << ::a << "\n"; int a = 20; cout << "2-1 a = " << a << "\n"; cout << "2-2 ::a = " << ::a << "\n"; cout << "3-1 a = " << a << "\n"; cout << "3-2 ::a = " << ::a << "\n"; // a = 10 참조 // a = 88 참조 // a = 20 참조 // a = 88 참조 // a = 30 참조 // a = 88 참조 1-1 a = 10 1-2 ::a = 88 2-1 a = 20 2-2 ::a = 88 3-1 a = 30 3-2 ::a = 88 :: 연산자는블럭의위치에관계없이외부변수를참조한다. return 0; 29
실습 : 은행계좌관리프로그램 기능 계좌개설 : MakeAccount() 입금 : DepositMoney() 출금 : WithdrawMoney() 전체고객잔액조회 : ShowAllAccInfo() 자료구조 typedef struct int accid; // 계좌번호 int balance; // 잔액 char cusname[name_len]; // 고객이름 Account; Account accarr[100]; Account 저장을위한배열 int accnum=0; // 저장된 Account 수 30
은행계좌관리프로그램 1 #include <iostream> #include <cstring> using namespace std; const int NAME_LEN=20; void ShowMenu(void); // 메뉴출력 void MakeAccount(void); // 계좌개설을위한함수 void DepositMoney(void); // 입 금 void WithdrawMoney(void); // 출 금 void ShowAllAccInfo(void); // 잔액조회 enum MAKE=1, DEPOSIT, WITHDRAW, INQUIRE, EXIT; typedef struct int accid; // 계좌번호 int balance; // 잔액 char cusname[name_len]; // 고객이름 Account; Account accarr[100]; // Account 저장을위한배열 int accnum=0; // 저장된 Account 수 31 int main(void) selection.."<<endl; int choice; while(1) return 0; ShowMenu(); cout<<" 선택 : "; cin>>choice; cout<<endl; switch(choice) case MAKE: MakeAccount(); break; case DEPOSIT: DepositMoney(); break; case WITHDRAW: WithdrawMoney(); break; case INQUIRE: ShowAllAccInfo(); break; case EXIT: return 0; default: cout<<"illegal
은행계좌관리프로그램 2 void ShowMenu(void) cout<<"-----menu------"<<endl; cout<<"1. 계좌개설 "<<endl; cout<<"2. 입금 "<<endl; cout<<"3. 출금 "<<endl; cout<<"4. 계좌정보전체출력 "<<endl; cout<<"5. 프로그램종료 "<<endl; void MakeAccount(void) int id; char name[name_len]; int balance; cout<<"[ 계좌개설 ]"<<endl; cout<<" 계좌ID: "; cin>>id; cout<<" 이름 : "; cin>>name; cout<<" 입금액 : "; cin>>balance; cout<<endl; accarr[accnum].accid=id; accarr[accnum].balance=balance; strcpy(accarr[accnum].cusname, name); accnum++; void DepositMoney(void) int money; 32 int id; cout<<"[ 입금 ]"<<endl; cout<<" 계좌ID: "; cin>>id; cout<<" 입금액 : "; cin>>money; for(int i=0; i<accnum; i++) if(accarr[i].accid==id) accarr[i].balance+=money; cout<<" 입금완료 "<<endl<<endl; return; cout<<" 유효하지않은 ID 입니다."<<endl<<endl; void WithdrawMoney(void) int money; int id; cout<<"[ 출금 ]"<<endl; cout<<" 계좌ID: "; cin>>id; cout<<" 출금액 : "; cin>>money; for(int i=0; i<accnum; i++) if(accarr[i].accid==id) if(accarr[i].balance<money) cout<<" 잔액부족 "<<endl<<endl; return; accarr[i].balance-=money; cout<<" 출금완료 "<<endl<<endl; return; cout<<" 유효하지않은 ID 입니다."<<endl<<endl; void ShowAllAccInfo(void) for(int i=0; i<accnum; i++) cout<<" 계좌 ID: "<<accarr[i].accid<<endl; cout<<" 이름 : "<<accarr[i].cusname<<endl; cout<<" 잔액 : "<<accarr[i].balance<<endl<<endl;
Jong Hyuk Park