Presentation is loading. Please wait.

Presentation is loading. Please wait.

명품 C++ 프로그래밍 2장. C++ 프로그래밍의 기본.

Similar presentations


Presentation on theme: "명품 C++ 프로그래밍 2장. C++ 프로그래밍의 기본."— Presentation transcript:

1 명품 C++ 프로그래밍 2장. C++ 프로그래밍의 기본

2 2장 요약(1) C++ 프로그램은 main() 함수에서 실행이 시작하며, ______ main()으로 표준화되어 있다.
C++ 프로그램에서 입출력을 하기 위해서는 #include<_______> 문이 반드시 필요하다. ______객체는 표준 출력 객체로 ___ 연산자를 이용하여 데이터 를 화면에 출력한다. ______객체는 표준 입력 객체로 ____연산자를 이용하여 키보드 로부터 데이터를 입력받는다.

3 2장 요약(2) 여러명이 나누어 작성한 코드나 오픈 소스 코드 사이에 클래스, 변수, 함수 등의 이름(identifier)이 충돌하는 오 류를 해결하기 위해 ________개념을 도입했다.(영어로 기 재) ____는 C++ 표준 라이브러리가 모두 선언된 표준 이름 공간이다. 그러므로 C++ 표준 라이브러리를 사용하려면 _______ __________ ______; 를 표기해야한다.

4 예제 : 키보드로부터 값 입력 받기 #include <iostream> using namespace std;
int main() { cout << "너비와 높이를 입력하세요 :"; //출력구문 int width; int height; cin ; // 너비 높이 입력받는 구문 int area = width*height; // 사각형의 면적 계산 cout << "면적은 " << area << "\n"; // 면적을 출력하고 다음 줄로 넘어감 } 너비와 높이를 입력하세요 : 10 5 면적은 50

5 예제 : 키보드로 문자열 입력 받아 출력 #include <iostream> using namespace std;
int main() { cout << "이름을 입력하세요>>"; char name[11]// 한글은 5개 글자, 영문은 10까지 저장할 수 있는 변수 name 선언 cin >> name; // 키보드로부터 문자열을 읽는다. cout << "이름은 " << name << "입니다\n"; // 이름을 출력한다. } 이름을 입력하세요>> 홍길동 이름은 홍길동입니다.

6 예제 : C-스트링을 이용하여 암호확인 #include <iostream>
#include <cstring> using namespace std; int main() { char password[11]; cout << "프로그램을 종료하려면 암호를 입력하세요." << endl; while(true) { cout << "암호>>"; cin >> password; if(strcmp (password, "C++") == 0 ) { cout << "프로그램을 정상 종료합니다." << endl; break; } else cout << "암호가 틀립니다~~" << endl;

7 예제 : 공백있는 문자열 입력받기 #include <iostream> using namespace std;
int main() { cout << "주소를 입력하세요>>"; char address[100]; cin >> address; cin.getline(address, 100, '\n'); // 키보드로부터 주소 읽기 cout << "주소는 " << address << "입니다\n"; // 주소 출력 } 주소를 입력하세요>> 서울시 마포구 도화동

8 예제 : string클래스를 이용한 문자열 처리
#include <iostream> #include <string> using namespace std; int main() { string song("Falling in love with you"); // 문자열 song string elvis("Elvis Presley"); // 문자열 elvis string singer; // 문자열 singer cout << song + "를 부른 가수는"; // + 로 문자열 연결 cout << "(힌트 : 첫글자는 " << elvis[0] << ")?"; // [] 연산자 사용 getline(cin, singer); // 문자열 입력 if(singer == elvis) // 문자열 비교 cout << "맞았습니다."; else cout << "틀렸습니다. "+ elvis + "입니다." << endl; // +로 문자열 연결 }

9 함수

10 함수 선언과 정의, 함수 호출 함수 선언 반환형 함수명(형식매개변수리스트) ; int sum(int su1, int su2);
함수 정의 반환형 함수명(형식매개변수리스트) { //처리내용 기술 } int sum(int su1, int su2) { int hap; hap=su1 + su2; return hap; 함수 호출 함수명(실매개변수리스트) ; int main() { int a,b; cout << “두 수 입력“; cin >> a >> b; int returnValue = sum(a, b); cout << a << “와” << b <<“의 합은 “ << returnValue << “입니다.<< endㅣ; cout << a << “와” << b <<“의 합은 “ << sum(a,b) << “입니다.<< endㅣ; }

11 함수 유형 4가지 매개변수, 반환값 없는 경우 매개변수 있고, 반환값 없는 경우 매개변수 없고, 반환값 있는 경우
매개변수, 반환값 있는 경우

12 함수유형(1)-매개변수,반환값 없는 경우 함수 정의 : 구구단 3단 출력하는 함수 만들기 : PrintDan 함수 호출 :

13 함수유형(3)-매개변수 있고,반환값 없는 경우
함수정의 : 두수를 매개변수로 입력받아 큰값 출력하는 함수 만들기 : PrintMax 함수호출 : PrintMax(10,30);

14 함수유형(2)-매개변수 없고 반환값 있는 경우
함수정의 : 1부터 10까지 더한 합을 반환하는 함수 만들기 : SumToTen 함수 호출 : int sum = SumToTen();

15 함수유형(4)-매개변수,반환값 있는 경우 함수정의 :
수 하나를 매개변수로 입력받아 홀수이면 참을 아니면 거짓을 반환하는 함수 : IsOdd 함수 호출 : if (IsOdd(5)) then cout << “홀수” << endl; else cout << “짝수” << endl;

16 예제 : EchoName 함수 만들어보기 함수정의 : 이름을 매개변수로 입력받아 이름을 다시 반환하는 에코함수 만들기
함수호출 : cout << EchoName(“김말자”); 또는, char name[10]; strcpy(name, EchoName(“홍길동”));

17 예제 : PrintDan 함수 만들기 함수정의 : 단을 매개변수로 입력받아 단 출력하는 함수 만들기 함수 호출 :
cin >> dan; PrintDan(dan);

18 예제 : Biggest 함수 만들기 함수정의 : 실수형 배열과 배열의 크기를 매개변수로 입력받아 가장 큰 값 반환하는 함수
함수호출 : float fList[10]; for (int i=0; I <10; i++) cin >> fList[i]; int maxValue = Biggest( fList, 10);

19 예제 : SwapValue 함수 만들기 함수정의 : 두 정수를 매개변수로 받아 값을 서로 바꾸는 함수 만들기 함수호출 :
int a=10, b=20; SwapValue(a,b); cout << a << b << endl ;

20 함수 중복 함수 중복 함수 중복 성공 조건 동일한 이름의 함수가 공존 function overloading
다형성 C 언어에서는 불가능 function overloading 함수 중복이 가능한 범위 보통 함수들 사이 클래스의 멤버 함수들 사이 상속 관계에 있는 기본 클래스와 파생 클래스의 멤버 함수들 사이 함수 중복 성공 조건 중복된 함수들의 이름 동일 중복된 함수들의 매개 변수 타입이 다르거나 개수가 달라야 함 리턴 타입은 함수 중복과 무관

21 함수 중복 성공 사례 int sum(int a, int b, int c) { return a + b + c; }
double sum(double a, double b) { return a + b; int sum(int a, int b) { int main(){ cout << sum(2, 5, 33); cout << sum(12.5, 33.6); cout << sum(2, 6); } 중복된 sum() 함수 호출. 컴파일러가 구분 성공적으로 중복된 sum() 함수들

22 컴파일러는 어떤 sum() 함수를 호출하는지 구분할 수 없음
함수 중복 실패 사례 리턴 타입이 다르다고 함수 중복이 성공하지 않는다. int sum(int a, int b) { return a + b; } double sum(int a, int b) { return (double)(a + b); ? int main() { cout << sum(2, 5); } 함수 중복 실패 컴파일러는 어떤 sum() 함수를 호출하는지 구분할 수 없음

23 함수 중복하면 함수 호출의 편리함.오류 가능성 줄임
함수 중복의 편리함 동일한 이름을 사용하면 함수 이름을 구분하여 기억할 필요 없고, 함수 호출을 잘못하는 실수를 줄일 수 있음 void msg1() { cout << "Hello"; } void msg2(string name) { cout << "Hello, " << name; void msg3(int id, string name) { cout << "Hello, " << id << " " << name; void msg() { cout << "Hello"; } void msg(string name) { cout << "Hello, " << name; void msg(int id, string name) { cout << "Hello, " << id << " " << name; (a) 함수 중복하지 않는 경우 (b) 함수 중복한 경우 함수 중복하면 함수 호출의 편리함.오류 가능성 줄임

24 예제 6-1 big() 함수 중복 연습 큰 수를 리턴하는 다음 두 개의 big 함수를 중복 구현하라.
int big(int a, int b); // a와 b 중 큰 수 리턴 int big(int a[], int size); // 배열 a[]에서 가장 큰 수 리턴 #include <iostream> using namespace std; int big(int a, int b) { // a와 b 중 큰 수 리턴 if(a>b) return a; else return b; } int big(int a[], int size) { // 배열 a[]에서 가장 큰 수 리턴 int res = a[0]; for(int i=1; i<size; i++) if(res < a[i]) res = a[i]; return res; int main() { int array[5] = {1, 9, -2, 8, 6}; cout << big(2,3) << endl; cout << big(array, 5) << endl; 3 9

25 예제 6-2(실습) sum() 함수 중복 연습 함수 sum()을 호출하는 경우가
매개 변수는 두 번째 매개 변수보다 작은 정수 값으로 호출된다고 가정한다. sum(3,5); // 3~5까지의 합을 구하여 리턴 sum(3); // 0~3까지의 합을 구하여 리턴 sum(100); // 0~100까지의 합을 구하여 리턴 #include <iostream> using namespace std; int sum(int a, int b) { // a에서 b까지 합하기 int s = 0; for(int i=a; i<=b; i++) s += i; return s; } int sum(int a) { // 0에서 a까지 합하기 for(int i=0; i<=a; i++) int main() { cout << sum(3, 5) << endl; cout << sum(3) << endl; cout << sum(100) << endl; 12 6 5050

26 디폴트 매개 변수 디폴트 매개 변수(default parameter) 디폴트 매개 변수 선언 사례
매개 변수에 값이 넘어오지 않는 경우, 디폴트 값을 받도록 선언 된 매개 변수 ‘매개 변수 = 디폴트값’ 형태로 선언 디폴트 매개 변수 선언 사례 디폴트 매개 변수를 가진 함수 호출 void star(int a=5); // a의 디폴트 값은 5 star(); // 매개 변수 a에 디폴트 값 5가 전달됨. star(5);와 동일 star(10); // 매개 변수 a에 10을 넘겨줌

27 디폴트 매개 변수 사례 사례 1 void msg(int id, string text="Hello"); // text의 디폴트 값은 "Hello" msg(10); // id에 10, text에 “Hello” 전달 msg(20, "Good Morning"); // id에 20, text에 “Good Morning” 전달 msg(); // 컴파일 오류. 첫 번째 매개 변수 id에 반드시 값을 전달하여야 함 msg("Hello"); // 컴파일 오류. 첫 번째 매개 변수 id에 값이 전달되지 않았음 호출 오류

28 디폴트 매개 변수에 관한 제약 조건 디폴트 매개 변수는 보통 매개 변수 앞에 선언될 수 없음
디폴트 매개 변수는 끝 쪽에 몰려 선언되어야 함 컴파일 오류 void calc(int a, int b=5, int c, int d=0); // 컴파일 오류 void sum(int a=0, int b, int c); // 컴파일 오류 void calc(int a, int b=5, int c=0, int d=0); // 컴파일 성공

29 매개변수에 값을 정하는 규칙 사례 2 void square(int width=1, int height=1);
컴파일러에 의해 변환되는 과정

30 디폴트 매개 변수 사례 사례 3 void g(int a, int b=0, int c=0, int d=0);
디폴트 매개 변수를 가진 함수 void g(int a, int b=0, int c=0, int d=0); void g(int a, int b= 0, int c= 0, int d= 0); g(10); g( 10, , , ); g( 10, 0, 0, 0 ); g(10, 5); g( 10, 5 , , ); g( 10, 5, 0, 0 ); g(10, 5, 20); g( 10, 5, 20, ); g( 10, 5, 20, 0 ); g(10, 5, 20, 30); g( 10, 5, 20, 30 ); g( 10, 5, 20, 30 ); 컴파일러에 의해 변환되는 과정

31 예제 6–3 디폴트 매개 변수를 가진 함수 선언 및 호출
#include <iostream> #include <string> using namespace std; // 원형 선언 void star(int a=5); void msg(int id, string text=""); // 함수 구현 void star(int a) { for(int i=0; i<a; i++) cout << '*'; cout << endl; } void msg(int id, string text) { cout << id << ' ' << text << endl; int main() { // star() 호출 star(); star(10); // msg() 호출 msg(10); msg(10, "Hello"); 디폴트 매개 변수 선언 void star(int a=5) { for(int i=0; i<a; i++) cout << '*'; cout << endl; } void msg(int id, string text="") { cout << id << ' ' << text << endl; 동일한코드 star(5); ***** ********** 10 10 Hello msg(10, “”);

32 예제 6-4(실습) 디폴트 매개 변수를 가진 함수 만들기 연습
f(); // 한 줄에 빈칸을 10개 출력한다. f(‘%'); // 한 줄에 ‘%’를 10개 출력한다. 5); // 다섯 줄에 10개 출력한다. 함수 f()를 호출하는 경우가 다음과 같을 때 f()를 디폴트 매개 변수를 가진 함수로 작성하라. #include <iostream> using namespace std; // 원형 선언 void f(char c=' ', int line=1); // 함수 구현 void f(char c, int line) { for(int i=0; i<line; i++) { for(int j=0; j<10; j++) cout << c; cout<< endl; } int main() { f(); // 한줄에 빈칸을 10개 출력한다. f(‘%'); // 한 줄에 ‘%’를 10개 출력한다. 5); // 5 줄에 문자를 10개 출력한다. 빈 칸이 10개 출력됨 %%%%%%%%%%

33 함수 중복 간소화 디폴트 매개 변수의 장점 – 함수 중복 간소화 중복 함수들과 디폴트 매개 변수를 가진 함수를 함께 사용 불가
class Circle { public: Circle() { radius = 1; } Circle(int r) { radius = r; } }; class Circle { public: Circle(int r=1) { radius = r; } }; 2 개의 생성자 함수를 디폴트 매개 변수를 가진 하나의 함수로 간소화 class Circle { public: Circle() { radius = 1; } Circle(int r) { radius = r; } Circle(int r=1) { radius = r; } }; 중복된 함수와 동시 사용 불가

34 예제 6–5(실습) 디폴트 매개 변수를 이용하여 중복 함수 간소화 연습
다음 두 개의 중복 함수를 디폴트 매개 변수를 가진 하나의 함수로 작성하라. void fillLine() { // 25 개의 ‘*’ 문자를 한 라인에 출력 for(int i=0; i<25; i++) cout << ‘*’; cout << endl; } void fillLine(int n, char c) { // n개의 c 문자를 한 라인에 출력 for(int i=0; i<n; i++) cout << c; #include <iostream> using namespace std; void fillLine(int n=25, char c=‘*‘) { // n개의 c 문자를 한 라인에 출력 for(int i=0; i<n; i++) cout << c; cout << endl; } int main() { fillLine(); // 25개의 '*'를 한 라인에 출력 fillLine(10, '%'); // 10개의 '%'를 한 라인에 출력 ************************* %%%%%%%%%%

35 매개변수 전달방식 값에 의한 호출 주소에 의한 호출 참조에 의한 호출

36 함수의 인자 전달 방식 리뷰 인자 전달 방식 값에 의한 호출, call by value
함수가 호출되면 매개 변수가 스택에 생성됨 호출하는 코드에서 값을 넘겨줌 호출하는 코드에서 넘어온 값이 매개 변수에 복사됨 주소에 의한 호출, call by address 함수의 매개 변수는 포인터 타입 함수가 호출되면 포인터 타입의 매개 변수가 스택에 생성됨 호출하는 코드에서는 명시적으로 주소를 넘겨줌 기본 타입 변수나 객체의 경우, 주소 전달 배열의 경우, 배열의 이름 호출하는 코드에서 넘어온 주소 값이 매개 변수에 저장됨

37

38 값에 의한 호출 주소에 의한 호출 #include <iostream> using namespace std;
void swap(int a, int b) { int tmp; tmp = a; a = b; b = tmp; } int main() { int m=2, n=9; swap(m, n); cout << m << ‘ ‘ << n; a, b에 m, n의 값 복사 a 2 a 2 9 b 9 b 9 2 swap() 스택 swap() 스택 m, n 변화 없음 m 2 m 2 m 2 m 2 n 9 n 9 n 9 n 9 main() 스택 main() 스택 main() 스택 main() 스택 (1) swap() 호출 전 (2) swap() 호출 직후 (3) swap() 실행 (4) swap() 리턴 후 2 9 값에 의한 호출 #include <iostream> using namespace std; void swap(int *a, int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; } int main() { int m=2, n=9; swap(&m, &n); cout << m << ‘ ‘ << n; a, b에 m, n의 주소 전달 a a b b swap() 스택 swap() 스택 m, n 변경 m 2 m 2 m 2 9 m 9 n 9 n 9 n 9 2 n 2 main() 스택 main() 스택 main() 스택 main() 스택 9 2 (1) swap() 호출 전 (2) swap() 호출 직후 (3) swap() 실행 (4) swap() 리턴 후 주소에 의한 호출

39 매개 변수 객체의 생성자 소멸자의 비대칭 실행 구조
‘값에 의한 호출’로 객체 전달 함수를 호출하는 쪽에서 객체 전달 객체 이름만 사용 함수의 매개 변수 객체 생성 매개 변수 객체의 공간이 스택에 할당 호출하는 쪽의 객체가 매개 변수 객체에 그대로 복사됨 매개 변수 객체의 생성자는 호출되지 않음 함수 종료 매개 변수 객체의 소멸자 호출 값에 의한 호출 시 매개 변수 객체의 생성자가 실행되지 않는 이 유? 호출되는 순간의 실인자 객체 상태를 매개 변수 객체에 그대로 전달 하기 위함 매개 변수 객체의 생성자 소멸자의 비대칭 실행 구조

40 ‘값에 의한 호출’로 객체 전달 int main() { Circle waffle(30); increase(waffle);
cout << waffle.getRadius() << endl; } call by value void increase(Circle c) { int r = c.getRadius(); c.setRadius(r+1); } 30 Circle waffle(30); waffle radius 30 waffle 생성 main() 스택 객체 복사 increase(waffle); void increase(Circle c) waffle radius 30 c radius 30 함수 호출 매개 변수 객체 c 생성 increase() 스택 c.setRadius(r+1); waffle radius 30 c radius 31 c의 반지름 1 증가 cout << waffle.getRadius() ; 함수가 종료하면 객체 c 소멸 waffle radius 30 화면에 30 출력

41 예제 5-1 ‘값에 의한 호출’시 매개 변수의 생성자 실행되지 않음
#include <iostream> using namespace std; class Circle { private: int radius; public: Circle(); Circle(int r); ~Circle(); double getArea() { return 3.14*radius*radius; } int getRadius() { return radius; } void setRadius(int radius) { this->radius = radius }; Circle::Circle() { radius = 1; cout << "생성자 실행 radius = " << radius << endl; } Circle::Circle(int radius) { this->radius = radius; cout << "생성자 실행 radius = " << radius << endl; Circle::~Circle() { cout << "소멸자 실행 radius = " << radius << endl; void increase(Circle c) { int r = c.getRadius(); c.setRadius(r+1); } int main() { Circle waffle(30); increase(waffle); cout << waffle.getRadius() << endl; waffle의 내용이 그대로 c에 복사 c의 생성자 실행되지 않았음 waffle 생성 생성자 실행 radius = 30 소멸자 실행 radius = 31 30 소멸자 실행 radius = 30 c 소멸 waffle 소멸

42 ‘값에 의한 호출’시에 생성자와 소멸자의 비대칭 실행
Circle waffle(30); waffle radius 30 Circle() 생성자 실행 main() 스택 객체 복사 void increase(Circle c) increase(waffle); waffle radius 30 c radius 30 생성자 실행되지 않음 increase() 스택 increase() 함수 종료 c radius 31 소멸자 실행 main() 함수 종료 waffle radius 30 ~Circle() 소멸자 실행

43 함수에 객체 전달 – ‘주소에 의한 호출’로 함수 호출시 객체의 주소만 전달
함수의 매개 변수는 객체에 대한 포인터 변수로 선언 함수 호출 시 생성자 소멸자가 실행되지 않는 구조

44 ‘주소에 의한 호출’로 객체 전달 int main() { Circle waffle(30); increase(&waffle);
cout << waffle.getRadius() ; } call by address void increase(Circle *p) { int r = p->getRadius(); p->setRadius(r+1); } 31 Circle waffle(30); waffle radius 30 waffle 생성 main() 스택 waffle의 주소가 p에 전달 increase(&waffle); void increase(Circle *p) waffle radius 30 p 함수 호출 매개 변수 p 생성 increase() 스택 p->setRadius(r+1); waffle radius 31 p waffle의 반지름 1 증가 cout << waffle.getRadius(); 함수가 종료하면 포인터 p 소멸 waffle radius 31 31이 화면에 출력됨

45 참조에 의한 호출 참조를 가장 많이 활용하는 사례 call by reference라고 부름 함수 형식
함수의 매개 변수를 참조 타입으로 선언 참조 매개 변수(reference parameter)라고 부름 참조 매개 변수는 실인자 변수를 참조함 참조매개 변수의 이름만 생기고 공간이 생기지 않음 참조 매개 변수는 실인자 변수 공간 공유 참조 매개 변수에 대한 조작은 실인자 변수 조작 효과

46 함수가 호출되면 m, n에 대한 참조 변수 a, b가 생긴다.
참조에 의한 호출 사례 a, b는 m, n의 별명. a, b 이름만 생성. 변수 공간 생기지 않음 #include <iostream> using namespace std; void swap(int &a, int &b) { int tmp; tmp = a; a = b; b = tmp; } int main() { int m=2, n=9; swap(m, n); cout << m << ‘ ‘ << n; 참조 매개 변수 a, b a a b b 참조 매개 변수를 보통 변수처럼 사용 m, n이 변경됨 swap() 스택 swap() 스택 m 2 m 2 m 2 9 m 9 n 9 n 9 n 9 2 n 2 main() 스택 main() 스택 main() 스택 main() 스택 9 2 (1) swap() 호출 전 (2) swap() 호출 직후 (3) swap() 실행 (4) swap() 리턴 후 함수가 호출되면 m, n에 대한 참조 변수 a, b가 생긴다.

47 예제 5-5 참조 매개 변수로 평균 리턴하기 참조 매개 변수를 통해 평균을 리턴하고 리턴문을 통해서는 함수의 성공 여부를 리턴하도록 average() 함수를 작성하라 #include <iostream> using namespace std; bool average(int a[], int size, int& avg) { if(size <= 0) return false; int sum = 0; for(int i=0; i<size; i++) sum += a[i]; avg = sum/size; return true; } int main() { int x[] = {0,1,2,3,4,5}; int avg; if(average(x, 6, avg)) cout << "평균은 " << avg << endl; else cout << "매개 변수 오류" << endl; if(average(x, -2, avg)) cout << "평균은 " << avg << endl; else cout << "매개 변수 오류 " << endl; 참조 매개 변수 avg에 평균 값 전달 avg에 평균이 넘어오고, average()는 true 리턴 avg의 값은 의미없고, average()는 false 리턴 평균은 2 매개 변수 오류


Download ppt "명품 C++ 프로그래밍 2장. C++ 프로그래밍의 기본."

Similar presentations


Ads by Google