440 likes | 644 Views
C++ 프로그래밍 10. 2008 년 2 학기 전자정보공학대학 컴퓨터공학부. Outline. Review: 구조체와 포인터 함수. Review: 구조체를 가리키는 포인터. 구조체를 변수형처럼 사용해서 포인터를 정의 할 수 있다. struct rectangle { int x,y; int width, height; }; rectangle rc; rectangle * p = &rc;. Review: 구조체의 맴버 변수 접근. 구조체변수 . 맴버변수. 구조체에서는 : 구조체포인터는 :.
E N D
C++ 프로그래밍 10 2008년 2학기 전자정보공학대학 컴퓨터공학부
Outline • Review: 구조체와 포인터 • 함수
Review: 구조체를 가리키는 포인터 • 구조체를 변수형처럼 사용해서 포인터를 정의할 수 있다 • struct rectangle • { • int x,y; • int width, height; • }; • rectangle rc; • rectangle * p = &rc;
Review: 구조체의 맴버 변수 접근 구조체변수.맴버변수 • 구조체에서는: • 구조체포인터는: (*구조체포인터).맴버변수 구조체포인터->맴버변수 구조체포인터->맴버변수
Review: 구조체의 맴버 변수 접근 예 • struct rectangle • { • int x,y; • int width, height; • }; • rectangle rc; • rectangle * p = &rc; • rc.x=10; • (*p).x = 10; • p->x = 10; 모두 같다
구조체를 가리키는 맴버 포인터 • struct Dizzy • { • int id; • Dizzy * p; • }; • Dizzy a,b,c; • a.id = 1; a.p=&b; • b.id = 2; b.p=&c; • c.id = 3; c.p=&a; • cout<<“a.id:”<<a.id<<“\n”; • cout<<“b.id:”<<a.p->id<<“\n”; • cout<<“c.id:”<<a.p->p->id<<“\n”;
휴강공고 • 9월 30일 (화요일) • 보강: 차후 공고 예정
함수 • 코드를 정리하고 정돈한다! 사후관리용이
함수란 • 작은 프로그램 (subprogram)
함수를 쓰는 이유 • 프로그램 작성 용이 • 절차의 추상화 • Procedural Abstraction • 일을 여러 단계의 작은 일로 쪼개는 것 • Divide-and-conquer • 반복적인 일의 수행 시 소스코드의 크기를 줄여준다
함수의 모양 • 초등학교 산수시간에… ?
함수의 모양 • 고등학교 수학시간에… 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; void printMessage() { cout<<“My first function! \n”; } int main() { printMessage(); printMessage(); 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; }
간단한 함수 예제2 • 함수는 하나의 값만을 반환할 수 있다
Return 의 활용 • 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]
함수의 연습 • 인자 n을받아서 “*”을 n개 만큼 출력하는 함수를 만들어라. • example) n=5인 경우 ***** • 이 함수를 이용하여 다음과 같은 삼각형을 출력!********** *****
포인터와 레퍼런스의 사용 • 반환되어야 하는 값이 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) { * 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) • 화살표까지 실행된 순간의 메모리 상태 void Div_Rem(int a, int b, int * pdiv, int * prem) { * div = a/b; * rem = 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) { * div = a/b; * rem = 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& pdiv, int& prem) { 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) • 레퍼런스 타입의 인자를 사용해서 함수의 결과 값을 얻어오는 방법의 정리 • 함수의 매개 변수는 레퍼런스 타입으로 정의한다. • 인자를 넘겨줄 때는 결과 값을 담고 싶은 변수를 그대로 넘겨준다. • 함수 안에서 결과를 넘겨줄 때는 매개 변수에 값을 넣어준다.