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