2 장더나은 C 로서의 C++ (1) 표준입출력네임스페이스 ( 고전 C++ 와표준 C++) 함수오버로딩디폴트매개변수 new와 delete bool 자료형 C++ is not C C++ 프로그래밍입문
1. 표준입출력 C++ : C의모든라이브러리를포함 printf, scanf 함수사용가능예 : int, double, 문자열값을입력받고출력하기 #include <cstdio> int ivar; double dvar; char str[20]; printf("int, double, 문자열입력 : "); scanf("%d %lf %s", &ivar, &dvar, str); cstdio :?? VC++ 6.0의경우삭제 à 2.2 네임스페이스참고주소전달 printf("int 값 : %d\n", ivar); printf("double 값 : %f\n", dvar); printf(" 문자열 : %s\n", str); 2 장더나은 C 로서의 C++ (1) 1
1. 표준입출력 : cin, cout 의사용 C++ 의표준입출력방법 cin : 표준입력객체, >> 연산자와함께사용 cout : 표준출력객체, << 연산자와함께사용 예 : cout // cin, cout 표준입출력포함 // 반드시들어가야함 int ivar = 55; double dvar = 1.11; char str[20] = "C++"; 연속적인 << 사용가능더이상타입에신경쓰지않아도됨! cout << ivar << endl; // 표준출력연산자 << 사용 cout << dvar << endl << str << endl; endl à \n 과동일. 바꾸어수행해보라. 2 장더나은 C 로서의 C++ (1) 2
1. 표준입출력 : cin, cout 의사용 예 : cin, cout 의사용 int ivar; double dvar; char str[20]; 문자열입력 : 공백문자로구분줄단위입력 à 11 장 cout << "int, double, 문자열값입력 : "; cin >> ivar >> dvar; // 표준입력연산자 >> 사용 cin >> str; 연속적인 >> 사용가능 cout << "int 값 : " << ivar << endl; 더이상타입에신경쓰지않아도됨! cout << "double 값 : " << dvar << endl; cout << " 문자열 : " << str << endl; 2 장더나은 C 로서의 C++ (1) 3
2. 네임스페이스 다음시나리오의문제점은? 프로그래머A와프로그래머B가만든라이브러리를사용하여프로그램을작성하고자한다. 문제점 : 이름 ( 함수명, 변수명등 ) 의충돌가능성이있음 해결방안 : 네임스페이스 ( 이름공간 ) sum 함수는 LibA 의 sum 인가, LibB 의 sum 인가? 2 장더나은 C 로서의 C++ (1) 4
2. 네임스페이스 네임스페이스 : 식별자들에대한그룹 예 : Microsoft, Samsung 네임스페이스작성 using Microsoft namespace 네임스페이스 std; namespace Microsoft int g_mvar; int Plus(int x, int y) return (x + y); int Minus(int x, int y) return (x - y); Samsung 네임스페이스 namespace Samsung int g_svar; int Plus(int x, int y) 둘다 Plus, Minus 존재 return (x + y); int Minus(int x, int y); int Samsung::Minus(int x, int y) return (x - y); 함수의외부정의 :: 사용 네임스페이스이름을통해구별 Microsoft::g_MVar = Microsoft::Minus(5, 2); cout << Microsoft::g_MVar << endl; 2 장더나은 C 로서의 C++ (1) 5
2. 네임스페이스 전역네임스페이스 어떤네임스페이스에도포함되어있지않는영역 예 : 전역네임스페이스에 Sum 함수가있는경우 Sum(3, 4) 또는 ::Sum(3, 4) 특정네임스페이스에포함되어있는식별자를전역네임스페이스 ( 또는다른네임스페이스 ) 에있는것처럼사용하는방법 using Microsoft::Minus; using Samsung::Plus; 특정네임스페이스에포함되어있는모든식별자를전역네임스페이스에있는것처럼사용하는방법 using namespace Microsoft; using namespace Samsung; 단, 중복선언되어있는식별자의경우여전히해당네임스페이스명을붙여야함! 2 장더나은 C 로서의 C++ (1) 6
2. 네임스페이스 : 고전 C++ 와표준 C++ 고전 C++ : 네임스페이스의개념이없음 #include <iostream.h> cout << " 고전 C++" << endl; // 고전 C++ 헤더파일 표준 C++ : library 의모든식별자 à std 네임스페이스 using std::cout; using std::endl; VC++ 6.0 지원함 VC++ 8.0 지원하지않음 cout << " 표준 C++" << endl; // std::cout << " 표준 C++" << std::endl; // using 선언이없을경우 모든식별자사용가능! 표준 C++ 의헤더파일 VC++ 6.0, 8.0 모두지원 2 장더나은 C 로서의 C++ (1) 7
2. 네임스페이스 : 고전 C++ 와표준 C++ 기존 C 함수의사용 ß 실제로 C 라이브러리를사용함 #include <stdio.h> printf("c++ Programming"); 다음과같이대체가능 #include <cstdio> 원리 cstdio 파일은다음과같이 stdio.h 를 include 하고있으며, stdio.h 내의모든식별자를 std 네임스페이스로포함시키고있음 using 선언이란특정네임스페이스의식별자를다른네임스페이스에위치시키는것! 모든 C 라이브러리들이이와같은방식으로사용되고있음 주의 : VC++ 6.0 의경우 cstdio 파일에는단순히 #include <stdio.h> 만기술되어있음따라서, std 에포함되지않으며 using 사용불가 // cstdio 파일 #include <stdio.h> namespace std using ::printf; using ::scanf; using ::fread; using ::fwrite; using ::FILE:... // 생략 전역에있는 printf 를 std 네임스페이스에포함시킴 2 장더나은 C 로서의 C++ (1) 8
2. 네임스페이스 : 중첩네임스페이스 예 : CompanyA 네임스페이스내에 DeptC 라는네임스페이스선언 namespace CompanyA // 네임스페이스 CompanyA 작성 int g_vara; void func1() cout << "ComapanyA::func1" << endl; void func2() cout << "ComapanyA::func2" << endl; namespace CompanyB // 네임스페이스 CompanyB 작성 using namespace CompanyA; // 네임스페이스 CompanyA를 CompanyB로포함 int g_varb; void func1() cout << "ComapanyB::func1" << endl; namespace DeptC // CompanyB 내에네임스페이스 DeptC 작성 void func1() cout << "CompanyB::DeptC::func1" << endl; CompanyB::func1(); CompanyB::func2(); CompanyB::DeptC::func1(); // 실제로는 CompanyA 의 func2 함수실행 2 장더나은 C 로서의 C++ (1) 9
3. 함수오버로딩 예 : 다음프로그램의문제점은? void swap(int *x, int *y) int temp = *x; *x = *y; *y = temp; int a = 3, b = 4; double c = 1.1, d = 2.2; swap(&a, &b); swap(&c, &d); // 실매개변수 2 개의값교환 컴파일에러 : double * à int * 묵시적형변환불가 swap((int *) &c, (int *) &d) 로변경한다면? 논리적에러 : 소수점이하처리불가해결책 : int, double 형별도의 swap 함수작성! cout << "a = " << a << ", b = " << b << endl; cout << "c = " << c << ", d = " << d << endl; 2 장더나은 C 로서의 C++ (1) 10
3. 함수오버로딩 swap 함수의수정 void swapi(int *x, int *y) int temp = *x; *x = *y; *y = temp; // int 형값 2 개교환 void swapd(double *x, double *y) double temp = *x; *x = *y; *y = temp; 문제점 : 호출하는곳에서도 swapi(&a, &b); swapd(&c, &d); 로변경 * 동일한함수명사용가능 à 함수오버로딩 // double 형값 2 개교환 void swap(int *x, int *y) int temp = *x; *x = *y; *y = temp; void swap(double *x, double *y) double temp = *x; *x = *y; *y = temp; 2 장더나은 C 로서의 C++ (1) 11
3. 함수오버로딩 함수오버로딩의조건 함수명또는매개변수 ( 개수또는타입 ) 가달라야함 반환형은무관 int func(int n); char func(int n); // 오버로딩불가능 함수오버로딩시모호성주의 char square(char c) return (c * c); long square(long val) return (val * val); cout << square(3) << endl; // char 값제곱 // long 값제곱 컴파일에러발생 // 3(int) 은 char, long 둘다로형변환가능 2 장더나은 C 로서의 C++ (1) 12
4. 디폴트매개변수 예 : x 의 y 승을구하는 power 함수작성. 단, 두번째매개변수 y 가전달되지않으면 x 의 2 승을반환 함수오버로딩을통해작성가능 int power(int x) return (x * x); int power(int x, int y) int i; int result = 1; for (i = 0; i < y; i++) result *= x; return result; // x 의 2 승 // x 의 y 승 디폴트매개변수를사용한다면하나의함수로작성끝! int power(int x, int y = 2) int i; int result = 1; for (i = 0; i < y; i++) result *= x; return result; cout << power(3) << endl; // 3의 2승 cout << power(3, 3) << endl; // 3의 3승 2 장더나은 C 로서의 C++ (1) 13
4. 디폴트매개변수 디폴트매개변수의복잡한사용예 int power(int a, int b); int f(int x, int y = power(3, 4)); // 디폴트값 : 함수호출가능주의사항 디폴트매개변수값은뒤에서부터줄수있음 즉, 함수호출시마지막값부터역순으로생략가능 int f(int a, int b = 3, int c = 5); f(5); // O int g(int a, int b = 3, int c); g(1,, 3); // X 디폴트매개변수값은함수프로토타입또는정의둘중하나에만기술 à 일반적으로프로토타입에기술 int f(int a = 3); int f(int a = 3) return a; // X 함수오버로딩과함께사용할경우모호성주의 int power(int x, int y = 2); int power(int x); power(3); // 둘다호출가능, 어떤함수? 2 장더나은 C 로서의 C++ (1) 14
5. new 와 delete C malloc과 free를사용한동적할당및해제 int *p1 = (int *) malloc(sizeof(int)); free(p1); int *p2 = (int *) malloc(sizeof(int) *3); free(p1); C++ malloc, free 사용가능 new, delete 연산자사용 malloc, free 보다편리 int *p1 = new int; delete p1; int *p2 = new int[3]; delete [] p2; // 배열메모리해제 메모리할당과동시에초기화가능 int *p1 = new int(100); // 배열의경우초기화불가능 2 장더나은 C 로서의 C++ (1) 15
5. new 와 delete 예 : int 형변수하나의동적할당및초기화 int *p = new int(100); // int 형변수동적할당및 100 으로초기화 cout << " 포인터변수의주소 : " << &p << endl; cout << " 포인터변수의값 : " << p << endl; cout << " 동적변수의값 : " << *p << endl; delete p; 2 장더나은 C 로서의 C++ (1) 16
5. new 와 delete 예 : 배열의동적할당 int i; int *p = new int[5]; for (i = 0; i < 5; i++) p[i] = i; // int 형변수 5 개동적할당 // 포인터를통해배열처럼사용 for (i = 0; i < 5; i++) cout << p[i] << " "; cout << endl; delete [] p; // 배열동적할당시해제 2 장더나은 C 로서의 C++ (1) 17
5. new 와 delete 예 : 2 차원배열의동적할당 int형포인터에대한포인터 int **p; p[0],, p[3] 이 int형포인터 int i, j; p = new int *[4]; for (i = 0; i < 4; i++) p[i] = new int[5]; for (i = 0; i < 4; i++) for (j = 0; j < 5; j++) p[i][j] = i + j; 2차원배열처럼사용 각포인터에대해 int 형 5 개배열생성 for (i = 0; i < 4; i++) for (j = 0; j < 5; j++) cout << p[i][j] << "\t"; cout << endl; for (i = 0; i < 4; i++) delete [] p[i]; delete [] p; 2 장더나은 C 로서의 C++ (1) 18 동적메모리해제
6. bool 자료형 C 스타일의 bool 자료형 typedef을통해참, 거짓을표시하는타입선언, 내부적으론 int형 typedef int BOOL; C++ : bool 형도입 값 : true, false 수식연산에사용가능 true à 1, false à 0 다른타입의값을 bool형으로자동형변환가능 0 à false, 그외 à true ü bool tf1 = true; ü int a = 1 tf1 // a는 0이됨 ü bool tf2 = a; // tf2는 false가됨 2 장더나은 C 로서의 C++ (1) 19
6. bool 자료형 예 : C, C++ 의비교 typedef int BOOL; C 스타일 BOOL bvar1 = 3; bool bvar2 = 3; cout << "bvar1 : " << bvar1 << endl; cout << "bvar2 : " << bvar2 << endl; int a = bvar1 + 2; int b = bvar2 + 2; // BOOL은 int형으로취급됨 // bool은 true, false로취급됨 cout << "a : " << a << endl; cout << "b : " << b << endl; 2 장더나은 C 로서의 C++ (1) 20
7. C++ is not C C 와 C++ 사이의차이 ( 몇가지예 ) 1. void 포인터와다른타입의포인터사이의자동형변환 2. 지역변수의선언위치 3. 함수프로토타입에서매개변수가없는경우의해석 4. 구조체변수의선언방법 1. void 포인터 ßà 다른타입의포인터자동형변환 C에서는가능 : 자동형변환 O int *p = malloc(sizeof(int) * 3); // (void *) 반환, C++ 자동형변환 X free(p); int *p = (int *) malloc(sizeof(int) * 3); 2 장더나은 C 로서의 C++ (1) 21
7. C++ is not C 2. 지역변수의선언위치 C : 다른문장이나오기이전 C++ : 중간에도선언가능 int i = 5; int Sum; Sum = 0; C++ : for 문에서도선언가능, 두개의 i 는서로다른변수 for (int i = 1; i <= 100; i++) // i는 for 블록내에서만사용가능 Sum += i; cout << "i : " << i << endl; cout << " 합계 : " << Sum << endl; 주의 : VC++ 6.0 에서는 for 문에서선언한변수를그이후에계속사용가능 à 컴파일에러발생 à 두개의 i 를같은변수로봄 à 표준 C++ 의개념에맞지않음 2 장더나은 C 로서의 C++ (1) 22
7. C++ is not C 3. 함수의매개변수가없는경우의해석 C : 해당함수호출시실매개변수의개수, 타입을검사하지않음 à 실매개변수에관계없이호출가능 ( 실매개변수무시 ) C++ : void로간주 void f(); // void f(void); 와동일 #include <stdio.h> void f() printf("test\n"); f(3.5); f(3); f('a'); f(1, 2); // 매개변수를지정하지않은경우 C 에서는수행가능 C++ 에서는수행불가능! f 함수호출시실매개변수가없어야함 2 장더나은 C 로서의 C++ (1) 23
7. C++ is not C 4. 구조체변수의선언방법 C : struct Point P1; // struct 반드시동반 C++ : struct Point P1; Point P1; // struct 없이도가능 struct Point int x, y; ; C에서는에러발생 Point P1 = 1, 2 ; // struct를포함하지않고변수선언 C, C++ 모두끊임없이진화 : 서로의장점참고 2 장더나은 C 로서의 C++ (1) 24