C++ 프로그래밍 11 2009년 2학기 전자정보공학대학 컴퓨터공학부.

Slides:



Advertisements
Similar presentations
1.1 구조체란 1.2 중첩 구조체 1.3 구조체와 배열 1.4 구조체와 포인터 1.5 구조체와 함수 1.6 공용체와 열거형.
Advertisements

1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
제 9 장 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
제14장 동적 메모리.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
제 9 장 구조체와 공용체.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
컴퓨터 프로그래밍 기초 [Final] 기말고사
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
자료 구조: Chapter 3 (2)구조체, 포인터
개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.
5장 배열 작성자 : 변재현.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제 3장. C보다 나은 C++ II.
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.
14장. 함수 1 01_ 함수의 기본 02_ 인자의 전달.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
2007 1학기 11 프로젝트 기초 실습.
Tail-recursive Function, High-order Function
14장. 포인터와 함수에 대한 이해.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
13. 연산자 오버로딩.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
Chapter 08. 함수.
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
C++ Espresso 제11장 예외 처리와 형변환.
강의 소개 컴퓨터시뮬레이션학과 2017년 봄학기 담당교수 : 이형원 E304호,
12. 상속 : 고급.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Canary value 스택 가드(Stack Guard).
^^ Computer Programming 2 dmpr.cnu.ac.kr/~daygax.
제 6 장 함수(functions).
에어 PHP 입문.
7주차: Functions and Arrays
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
함수, 모듈.
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
Summary of Pointers and Arrays
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
7 생성자 함수.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

C++ 프로그래밍 11 2009년 2학기 전자정보공학대학 컴퓨터공학부

Outline 함수

함수1

함수 코드를 정리하고 정돈한다!  사후관리용이

함수란 작은 프로그램 (subprogram)

함수의 모양 초등학교 산수시간에… ?

y = f(x) 함수의 모양 고등학교 수학시간에… x: 함수의 인자 (parameter) f(): 함수 본체(body) y: 함수의 결과값 (반환값:return value)

함수의 모양 함수의 정의: 반환변수형 함수이름(인자1, 인자2,…) { 함수 내용; return 반환값; }

함수의 호출 인자(parameter)의 형태 및 개수가 함수의 정의와 같아야 한다. 함수이름(인자1, 인자2,…);

함수의 가장 간단한 모양 함수의 정의-인자와 반환값이 없을 경우: void 함수이름() { 함수 내용; }

간단한 함수 예제 #include <iostream> using namespace std; void printMessage() { cout<<“My first function! \n”; } int main() printMessage(); return 0;

간단한 함수 예제

함수의 위치 #include <iostream> using namespace std; int main() { printMessage(); return 0; } void printMessage() cout<<“My first function! \n”; ERROR!: main은 printMessage함수가 있는지 모른다!

함수의 위치 #include <iostream> using namespace std; void printMessage(); int main() { printMessage(); return 0; } void printMessage() cout<<“My first function! \n”; 어딘가에 함수가 있음을 알려줌 함수의 원형 (prototype)

함수의 모양 함수의 정의 – 반환값이 있는 경우: 반환변수형 함수이름() { 함수 내용; return 반환값; }

간단한 함수 예제2 #include <iostream> using namespace std; int three() { return 3; } int main() int i; i=three(); cout<<“i=“<<i<<“\n”; return 0;

Return 의 활용 Return의 두가지 의미 void printMessage() { return; 값을 반환 함수를 끝내라 void printMessage() { return; cout<<“My first function! \n”; } int main() printMessage(); return 0;

함수 활용 시의 주의점 다른 함수에 정의되어 있는 변수를 사용할 수 없다. void sub(); int main() { // 변수를 정의한다. int a = 3; // 함수 호출 sub(); return 0; } void sub() // 변수를 사용한다. ++a; // Error

인자(Arguments)의 전달 (1) 함수를 호출하면서 인자를 전달하는 예 int Factorial(int n); int main() { int result = Factorial( 5 ); cout << "5! 는 " << result << "입니다.\n"; return 0; } int Factorial(int n) int result = 1; for (int i = 1; i <= n; ++i) result *= i; return result;

인자(Arguments)의 전달 (1) 함수를 호출하면서 인자를 전달하는 예 [그림 14-10]

인자의 전달 (2) 인자는 함수의 매개 변수(Parameters)에 대입된다. [그림 14-11]

인자 전달의 규칙 함수가 호출될 때마다 인자의 값이 매개 변수로 대입되는 가상의 코드가 실행된다. int max(int a, int b) { return a > b ? a : b; } int main() // 3과 5중에 큰 값을 구한다. int ret = max(3, 5); return 0;

인자 전달의 규칙 함수가 호출될 때마다 인자의 값이 매개 변수로 대입되는 가상의 코드가 실행된다. [그림 14-13]

인자의 전달과 메모리 구조(1) main() 함수가 시작되고 화살표까지 실행된 순간의 메모리 상태 int max(int a, int b) { return a > b ? a : b; } int main() int arg1 = 3; int arg2 = 5; int ret = max(arg1, arg2); return 0; [그림 14-15]

인자의 전달과 메모리 구조(2) max() 함수가 호출되고 화살표까지 실행된 순간의 메모리 상태 이때 다음과 같은 가상의 코드가 실행된다. int max(int a, int b) { return a > b ? a : b; } int main() int arg1 = 3; int arg2 = 5; int ret = max(arg1, arg2); return 0; [그림 14-16] int a = arg1; int b = arg2;

인자의 전달과 메모리 구조(3) max() 함수가 끝나고 화살표까지 실행된 순간의 메모리 상태 int max(int a, int b) { return a > b ? a : b; } int main() int arg1 = 3; int arg2 = 5; int ret = max(arg1, arg2); return 0; [그림 14-17]

Announcement 중간 필기 고사 일정: 시간: 다음주 목요일 수업시간 (10월 22일 오후 4시30분~오후 6시) 시간: 다음주 목요일 수업시간 (10월 22일 오후 4시30분~오후 6시) 장소: 수업장소 (율곡관304호) 범위: 10월 15일까지의 수업내용 방법: closed everything

포인터와 레퍼런스의 사용 반환되어야 하는 값이 2개 이상일 때? 포인터를 사용 레퍼런스를 사용

포인터 변수를 인자로 전달하기(1) 나누기를 하여 몫과 나머지를 구한다 void Div_Rem(int a, int b, int div, int rem) { div = a/b; rem = a%b } int main() int div=0; int rem=0; Div_Rem(23,5, div, rem); cout<<“23 = 5*“<<div<<“+”<<rem<<“\n”; return 0;

포인터 변수를 인자로 전달하기(1) 나누기를 하여 몫과 나머지를 구한다 void Div_Rem(int a, int b, int * pdiv, int * prem) { * pdiv = a/b; * prem = a%b } int main() int div=0; int rem=0; Div_Rem(23,5, &div, &rem); cout<<“23 = 5*“<<div<<“+”<<rem<<“\n”; return 0;

포인터 변수를 인자로 전달하기(2) 화살표까지 실행된 순간의 메모리 상태 void Div_Rem(int a, int b, int * pdiv, int * prem) { * pdiv = a/b; * prem = a%b } int main() int div=0; int rem=0; Div_Rem(23,5, &div, &rem); return 0; pdiv prem [그림 14-21] 23 5 div rem

포인터 변수를 인자로 전달하기(2) 화살표까지 실행된 순간의 메모리 상태 void Div_Rem(int a, int b, int * pdiv, int * prem) { * pdiv = a/b; * prem = a%b } int main() int div=0; int rem=0; Div_Rem(23,5, &div, &rem); return 0; pdiv prem [그림 14-21] 23 5 div 4 rem 3

포인터 변수를 인자로 전달하기(4) 포인터 타입의 인자를 사용해서 함수의 결과 값을 얻어오는 방법의 정리 함수의 매개 변수는 포인터 타입으로 정의한다. 인자를 넘겨줄 때는 결과 값을 담고 싶은 변수의 주소를 넘겨준다. 함수 안에서 결과를 넘겨줄 때는 매개변수가 가리키는 곳에 값을 넣어준다.

레퍼런스 변수를 인자로 전달하기(1) 레퍼런스 변수를 사용해서 함수 밖으로 결과를 전달 void Div_Rem(int a, int b, int& div, int& rem) { div = a/b; rem = a%b } int main() int div=0; int rem=0; Div_Rem(23,5, div, rem); cout<<“23 = 5*“<<div<<“+”<<rem<<“\n”; return 0;

레퍼런스 변수를 인자로 전달하기(2) 레퍼런스 타입의 인자를 사용해서 함수의 결과 값을 얻어오는 방법의 정리 함수의 매개 변수는 레퍼런스 타입으로 정의한다. 인자를 넘겨줄 때는 결과 값을 담고 싶은 변수를 그대로 넘겨준다. 함수 안에서 결과를 넘겨줄 때는 매개 변수에 값을 넣어준다.

코딩연습1 문자열을 입력 받아 입력 받은 문자열을 한 글자씩 미루게 만들어 주는 함수를 만들어라: 입력 문자열: abcde 함수 호출뒤: bcdea 이 함수를 이용하여 다음과 같이 출력하는 코드를 작성하라 입력: abcde 출력: abcde bcdea cdeab deabc eabcd

코딩연습2 아래와 같은 구조체를 정의하고 이 구조체 변수, a, b, c, d를 정의 한 뒤 두 변수를 연결시켜 주는 다음의 함수를 만들고, void Connect(test * front, test * back); 이를 이용해 a  b  c  d  NULL 로 연결되는 구조를 만들라. 연결된 변수들을 출력해 주는 다음의 함수 void print(test * a); 를 만들고 값들을 출력해 보여라. struct test { int val; test * p; };

배열을 인자로 전달하기(1) 배열 타입의 인자는 실제로는 포인터를 사용해서 전달된다. int main() { char array[20] = "Hello, World!"; UsingArray( array); cout << "In main() : " << array << "\n"; return 0; } void UsingArray(char arr[] ) cout << "In UsingArray() : " << arr << "\n"; arr[12] = '?';

배열을 인자로 전달하기(2) 배열을 인자로 전달하는 방법의 정리 매개 변수의 타입을 적어줄 때 ‘배열의 원소 개수’는 적지 않는다. 인자로 넘겨줄 때는 배열의 이름을 넘겨준다. 인자로 넘어온 배열을 사용할 때는 그냥 평범한 배열을 사용하듯이 하면 된다.

const를 사용한 배열의 보호 인자에 const 속성을 부여해서 배열의 내용이 변경되는 것을 막을 수 있다. UsingArray()가 호출될 때 실행되는 가상의 코드 void UsingArray( const char arr[] ) { cout << "In UsingArray() : " << arr << "\n"; arr[12] = '?'; // Error } const char* arr = array;

2차원 배열의 전달 int main() { int array[5][3] = {{ 1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}, {13, 14, 15}}; Using2DArray( array); return 0; } void Using2DArray( int arr[][3] ) for (int i = 0; i < 5; ++i) for (int j = 0; j < 3; ++ j) cout<<"arr[" << i << “][" << j << "]”; cout<<“=“<< arr[i][j] << "\n";

기본적인 구조체의 전달 두 점 사이의 거리 구하기 struct Point { int x, y; }; int main() Point a = {0, 0}; Point b = {3, 4}; double dist_a_b = Distance(a, b); return 0; } double Distance(Point pt1, Point pt2) // 두 점의 거리를 반환한다. (임시로 0을 반환) return 0.0f;

기본적인 구조체의 전달 구조체 변수를 인자로 전달하는 예 [그림 14-32] struct Point { int x, y; }; int main() Point a = {0, 0}; Point b = {3, 4}; double dist_a_b = Distance(a, b); return 0; } double Distance(Point pt1, Point pt2) // 두 점의 거리를 반환한다. // (임시로 0을 반환) return 0.0f; [그림 14-32]

구조체의 전달과 성능 문제(1) 조금 전의 방식(Call-by-value)으로 구조체 변수를 전달한 경우에 발생하는 성능 문제 인자의 내용이 매개 변수에 복사되는 시간이 낭비된다. 매개 변수의 크기가 커지므로 메모리가 낭비된다. 레퍼런스 변수를 사용해서 넘기면 위의 문제를 해결할 수 있다. double Distance( Point& p1, Point& p2) { // 중간 생략 // return 0.0; }

구조체의 전달과 성능 문제(2) 레퍼런스로 넘긴 경우에 인자의 값이 바뀔 염려가 있으므로 const 속성을 사용해서 인자를 보호할 필요가 있다. 구조체 변수를 인자로 전달하는 방법의 정리 구조체를 인자로 넘겨줄 때는 레퍼런스를 사용하자. 함수의 안쪽에서 구조체의 내용을 읽기만 한다면 const와 레퍼런스를 사용하자. double Distance( const Point& p1, const Point& p2)

CRT 함수의 사용 [그림 14-36] #include <iostream> #include <cmath> using namespce std; // 중간 코드 생략 double Distance(const Point& p1, const Point& p2) { // 피타고라스의 정리를 사용한다. double distance; distance = sqrt( pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2) ); // 결과를 반환한다. return distance; } [그림 14-36]