이장에서다룰내용 1 함수의기본 2 함수의입출력방법 함수 함수는입력을넣으면출력이나오는마술상자다. 3 4 재귀함수 Inline 함수 01_ 함수의기본 01_ 함수의기본 함수란 함수를사용할때의장점 반복적으로실행해야할내용을함수로만들어필요할때마다호출해사용할수있다. 프로그램이모듈화 ( 블록화 ) 되므로읽기쉽고, 디버그와편집이쉽다. 프로그램의기능과구조을한눈에알아보기쉽다. 다른프로그램에서재사용할수있다. 수학시간에배운 y=f(x) 와같이, 함수에게입력값을주면일련의과정을거쳐출력값이나오게된다. 반복된동작에대한코드들을보기좋게하고, 크기를줄이기위해함수를사용한다. 사용자정의함수의세가지요소 1 함수의정의 2 함수의호출 3 함수의선언
01_ 함수의기본 사용자정의함수의세가지요소 01_ 함수의기본 함수의기본형태 1 함수의정의 2함수의호출 3함수의선언 함수의정의 함수 _ 자료형함수 _ 이름 ( 매개변수리스트 ) { 변수선언 ; 문장 ; return ( 결과값 ); } 위와같이함수를선언하고동작을구현하게되면, 선언된이후에는함수명을이용하여여러번쉽게반복하여수행시킬수있다. 다음의기본예제 [5-1] 을함수를사용하여기본예제 [5-2] 로바꾸는과정을살펴보자. 기본예제에서는한줄짜리코드를함수로바꿨지만, 보다긴코드를함수로바꾼경우에는더욱코드가상대적으로간결해질것이다. [ 기본예제 5-1] 함수를적용하지않은코드 [ 기본예제 5-2] 함수를적용한코드 03 int main(int argc, char* argv[]) 05 int i; 06 for(i=0;i<2;i++) 07 { 08 cout << "print debug message\n"; 09 } 10 11 cout << "print debug message\n"; 12 13 return 0; 14 } 03 printdebugmsg() 05 cout << "print debug message\n"; 06 } 07 08 int main(int argc, char* argv[]) 10 int i; 11 for(i=0;i<2;i++) 12 { 13 printdebugmsg(); 14 } 15 16 printdebugmsg(); 17 18 return 0; 19 } printdebugmsg 함수를선언한다. printdebugmsg 함수를호출한다. printdebugmsg 함수를호출한다.
[ 기본예제 5-3] 함수선언을미리하고, 구현은뒤에한예제. 03 printdebugmsg(); printdebugmsg 함수를선언한다. 04 05 int main(int argc, char* argv[]) 06 { 07 int i; 08 for(i=0;i<2;i++) 10 printdebugmsg(); printdebugmsg 함수를호출한다. 11 } 12 13 printdebugmsg(); 14 15 return 0; 16 } 17 18 printdebugmsg() 19 { printdebugmsg 함수를구현한다. 20 cout << "print debug message\n"; 21 } 01_ 함수의기본 함수의유형 1 매개변수가없고반환값도없는함수 2 매개변수가있고반환값은없는함수 3 매개변수도있고반환값도있는함수 매개변수와반환값이모두없는함수 매개변수도반환값도없는함수작성하기 반환값의유형 01 #include<iostream> using namespace std; 03 void show( ) // 함수의정의 05 cout << "************************\n"; 06 return; 07 } 08 void main( ) 10 cout << " 함수호출하기전 \n"; 11 show( ); // 함수의호출 12 cout << " 함수호출한후 \n"; 13 } return 식 ;
두수의합을구하는함수작성하기 매개변수가있고반환값이없는함수 01 #include<iostream> using namespace std; 03 void sum(int a, int b) // a, b 는형식매개변수 05 cout << " a + b = "<< a + b<<"\n" ; 06 } 07 void main() 08 { 09 int a=10, b=20; 10 sum(a, b); // 변수 a, b는실매개변수 11 sum(4, 5); // 상수 ( 값 ) 4, 5 역시실매개변수 12 } 매개변수도반환값도있는함수작성하기 01 #include<iostream> using namespace std; 03 int abs(int x) 05 int y; // 절대값을저장할변수 06 if(x < 0) // 절대값을구하는공식 07 y = -x; 08 else 09 y = x; 10 return y; // 구해진결과값을 return 문으로반환한다. 11 } 12 void main( ) 13 { 14 int a, result; 15 cout << "\n 정수값하나를입력하세요. => "; 16 cin >> a; 17 result = abs(a); // 함수의결과값을변수 result에대입한다. 18 cout <<" 구한절대값은 " << result << " 이다. \n" ; 19 } _ 함수의입출력방법 함수에대한입력 아무입력없이동작하는함수보다는입력값에따라동작방식이바뀌거나, 입력값들을이용하여계산을하는함수들이실제로많이이용된다. 함수에입력을주는방법은다음과같다. 함수명다음의괄호안에입력변수형과변수명을사용할만큼나열해서선언하면되며, 함수를호출할때에는선언한순서대로입력변수를정확하게사용해야한다.
_ 함수의입출력방법 함수의선언 자료형함수 _ 이름 ( 매개변수리스트 ); [ 기본예제 5-4] 함수입력예제 #1 03 printdebugmsg(int t i) printdebugmsg 함수에입력인자를 사용하여선언한다. 05 cout << "print debug message : i = " << i << "\n"; 06 } 07 08 int main(int argc, char* argv[]) 10 int i; 11 for(i=0;i<2;i++) For 루프를돌며 i값을입력인자로 12 { 하여 printdebugmsg 함수를호출한다. 13 printdebugmsg(i); 14 } 15 16 printdebugmsg(i); 17 18 return 0; 19 } For 루프가끝난뒤, 증가된 i 값을그대로사용하여다시한번 printdebugmsg를호출한다. [ 응용예제 5-5] 함수입력예제 #2 03 printarea(int x, int y) 05 int area = [ 1 ]; 06 cout << " 넓이 : " << area << "\n"; 07 } 08 09 int main(int argc, char* argv[]) 10 { 11 12 int width,height; 13 14 cout << " 넓이를입력하세요 : "; 15 cin >> width; 16 cout << " 높이를입력하세요 : "; 17 cin >> height; 18 19 printarea([ 2 ]); 20 21 return 0; 22 } printarea 함수를선언한다. 변수 width, height 를선언한다. width, height 에대하여사용자입력을받는다. printatra 함수를호출하여넓이를계산한다. _ 함수의입출력방법 함수에대한출력 ( 반환 ) 함수에게서결과를받아오려면다음과같은방법을사용한다. 출력값을반환하고자할때는함수가끝나기직전에 return 문을이용하여반환할변수를지정해야한다. 반환할변수와선언할때함수명앞에명시한 반환 _ 변수형 은일치해야한다. 반환값이없는경우에는 반환 _ 변수형 으로 void 를명시한다.
[ 기본예제 5-6] 함수출력예제 03 int getarea(int x, int y) 05 int area = x*y; 넓이를반환하는 06 return area; getarea 함수를선언한다. 07 } 08 09 int main(int argc, char* argv[]) 10 { 11 12 int width,height; 13 변수 width, height를선언한다. 14 cout << " 넓이를입력하세요 : "; 15 cin >> width; width, height 에대하여 16 cout << " 높이를입력하세요 : "; 17 cin >> height; 사용자입력을받는다. 18 19 int area = getarea( width, height ); getarea 함수를호출하여넓이를 20 cout << " 넓이 : " << area << "\n"; 계산하고 area에값을반환한다. 21 22 return 0; 23 } _ 함수의입출력방법 Main 함수 Main 함수도입출력인자를가지고있다. 이입력인자들은프로그램을실행시킬때, example.exe a 의 -a 와같이뒤에주어진인자를의미한다. MS Visual C++ 에서는다음과같이 Program arguments 창에 help 와같이입력인자를줄수있다. [ 기본예제 5-7] main 함수예제 03 int main(int argc, char* argv[]) 05 int i; 06 cout << "main 인력인자의갯수 : " << argc << "\n"; 입력인자의개수를출력한다. 07 08 for(i = 0; i < argc; i++) 입력인자들을출력한다. 10 cout << argv[i] << "\n"; 11 } 12 13 return 0; 14 } 03_ 재귀함수 재귀함수란, 자기자신을호출하는함수. 재귀함수사용시주의점 재귀함수는자기자신을호출하게되므로, 자칫잘못하면무한히 반복될수가있다. 그러므로, 정상적인동작을위해서는재귀함수내부에동작이 멈추는시점을정해주여야한다.
[ 기본예제 5-8] 재귀함수예제 #1 : Sum 03 int Sum( int n ) 05 if (n==1) 06 return 1; 재귀함수가멈출조건을정한다. 07 else 08 return n + Sum( n-1 ); 자기자신을호출한다. 09 } 10 11 int main(int argc, char* argv[]) 12 { 13 int result = Sum( 4 ); 14 cout << " 합 : " << result << " n"; 15 16 return 0; 17 } [ 응용예제 5-9] 재귀함수예제 #2 : Factorial 03 int [ 1 ] ( int n ) 05 if (n<=1) Factorial 함수의동작이언제 06 return 1; 멈추는지정의한다. 07 else 08 return n * [ 2 ](n-1 ); 자기자신을재귀적으로어떻게 09 } 10 호출할지를정의한다. 11 int main(int argc, char* argv[]) 12 { 13 int result = Factorial( 4 ); 14 cout << "Factorial 결과값 : " << result << " n"; 15 16 return 0; 17 } 04_inline 함수 inline 함수란 함수가호출되는위치에해당함수코드가삽입되는효과를준다. 함수의사용이좋기만한것은아니다. 함수를사용하면함수를호출하고복귀하는과정에대한 시간이더걸리므로, 너무짧은코드를함수로바꾸어서 자주사용하게되면성능의저하가일어날수있다. C 의경우에는 define 을이용하여자주사용되는짧은 함수들을매크로함수로바꾸는작업이필요하지만, C++ 에서는 inline을이용하면간단하게해결된다. 함수가호출될때내부적으로벌어지는일 1 인수를전달하기위해인수값을순서대로스택에밀어넣는다. 2 호출원은바로다음번지를스택에기록함으로써함수가복귀할번지를저장한다. 3 함수가정의되어있는번지로점프하여제어권을함수에게넘긴다. 4 함수는스택에자신의지역변수를위한공간을만든다. 5 함수의코드를수행한다. 6 리턴값을넘긴다. 7 복귀번지로리턴한다. 8 인수전달에사용한스택을정리한다.
04_inline 함수 [ 응용예제 5-11] inline 을사용하여 1 을더하는프로그램 inline 자료형함수이름 ( 매개변수리스트 ) { 변수선언 ; 문장 ; return ( 결과값 ); } 함수가인라인이될것인가아닌가는프로그래머가지정하지만최종결정은컴파일러가한다. 재귀호출함수는인라인이될수없다. 프로그램의다른곳에서이함수의주소를참조하는경우가있다면이경우도인라인함수가되지못한다. 함수의길이가너무길경우. inline 키워드를명시적으로쓰지않아도자동으로인라인함수가되는경우 클래스선언에코드가작성되어있는멤버함수는자동인라인속성을가진다. 03 inline int inc(int x) 05 return x+1; 06 } 07 08 int main(int argc, char* argv[]) 10 int i; 11 cout << " 숫자를입력하세요 : "; 12 cin >> i; 13 cout << inc(i) << endl; 14 return 0; 15 } inline 함수를정의한다. inline 함수를호출한다. 선행처리자 선행처리자 매크로상수 #define 매크로 _ 상수치환할 _ 문자열 _ 또는 _ 상수
매크로상수를이용한처리 #define PI 3.141592 03 void main( ) 05 int r = 5; 06 double area ; 07 area = r*r*pi; 08 //PI = 2.71; 09 cout << "area = " <<area<< "\n"; 10 } 선행처리자 const 상수 const 자료형변수명 = 초기값 ; 선행처리자 매크로함수 #define 매크로 _ 함수 _ 이름 ( 매개변수리스트 ) 치환될 _ 문자열 _ 상수 제곱승을구하는매크로함수의잘못된예살펴보기 01 #include <iostream> using namespace std; 03 #define SQUARE1(x) x*x 04 void main(void) 05 { 06 int a=5, res; 07 res = SQUARE1(a+2); 08 cout << " SQUARE1(a+2) => " << res << "\n"; //17 09 10 res = 100/SQUARE1(a); 11 cout << " 100/SQUARE1(a) => " << res << "\n"; //100 12 }
제곱승을구하는매크로함수의잘못된예살펴보기 제곱승을구하는매크로함수정의하기 01 #include <iostream> using namespace std; 03 #define SQUARE2(x) ((x)*(x)) 04 void main(void) 05 { 06 int a=5, res; 07 res = SQUARE2(a+2); 08 cout << " SQUARE2(a+2) => " << res << "\n"; 09 10 res = 100/SQUARE2(a); 11 cout << " 100/SQUARE2(a) => " << res << "\n"; 12 } 매크로함수, 인라인함수, 일반함수의차이점살펴보기 01 #include<iostream> using namespace std; 03 #define add1(a, b) a+b 04 inline int add2(int a, int b) 05 { 06 return a+b; 07 } 08 int add3(int a, int b) 10 return a+b; 11 } 12 void main( ) 13 { 14 int result; 15 result = 2*add1(10, 20); 16 cout<<"macro 함수 => "<<result<<"\n"; 17 result = 2*add2(10, 20); 18 cout<<"inline 함수 => "<<result<<"\n"; 19 result = 2*add3(10, 20); 20 cout<<" 일반함수 => "<<result<<"\n"; 21 } 선행처리자 #include #include < 파일명 > #include " 파일명 "
예제모음 _07 의요구사항및실행결과 요구사항 1 자신의이름, 학번을출력하는함수 printmyinfo() 를만든다. 2 함수 printmyinfo() 에는입출력인자가없으며 cout 을이용하여출력한다. 실행결과 예제모음 _07 소스 03 void printmyinfo() 05 cout << " 이름 : 홍길동 n"; 06 cout << " 학번 : 07010130 n"; 07 } 08 09 int main(int argc, char* argv[]) 10 { 11 printmyinfo(); 12 13 return 0; 14 } printmyinfo 함수를구현한다. Main 함수로써, 프로그램의시작점이다. printmyinfo 함수를호출한다. 예제모음 _08 의요구사항및실행결과 예제모음 _08 소스 요구사항 1 삼각형의밑변 (width), 높이 (height) 는 cin 을이용하여입력받는다. 2 삼각형의밑변, 높이를입력인자로주면, 넓이를반환하는함수를만든다. 실행결과 03 int calctriangle(int width, int height) calctriangle l 함수를 구현한다. 05 int result = width*height/2; 06 return result; 결과값을반환한다. 07 } 08 09 int main(int argc, char* argv[]) 프로그램의시작점이다. 10 { 11 int width, height; 12 13 cout << " 밑변의길이를입력하세요 : "; 밑변과높이를 14 cin >> width; 입력받는다. 15 cout << " 높이를입력하세요 : "; 16 cin >> height; 17 18 int area = calctriangle( width, height ); 19 cout << " 삼각의넓이는 : " << area << " n"; 20 21 return 0; 22 } calctriangle 함수를호출한다.
예제모음 _09 의요구사항및실행결과 요구사항 1 사용자로부터 main 함수의입력인자를받는다. 2 main의입력인자가주어진경우에는삼각형의넓이를출력하며, main의입력인자가주어지지않은경우에는사각형의넓이를출력한다. 3 도형의밑변의길이와높이에대한입력은 cin 을이용하여받는다. 4 삼각형의넓이와사각형의넓이를구하는함수는 main 함수와분리하여구현하도록한다. 실행결과 main 에게입력인자를주지않은경우 예제모음 _09 소스 03 int calctriangle(int width, int height) calctriangle 함수를 05 return width*height/2; 구현한다. 06 } 07 08 int calcrectangle(int width, int height) 10 return width*height; height; calcrectangle 함수를구현한다. 11 } 12 13 int main(int argc, char* argv[]) 프로그램의시작점이다. 14 { 15 int width, height; 16 17 cout << " 밑변의길이를입력하세요 : "; 18 cin >> width; 19 cout << " 높이를입력하세요 : "; 20 cin >> height; 21 22 if ( argc==1 ) { 23 cout << " 삼각형의넓이는 : " << calctriangle(width, height) << " n"; 24 } 25 else { 26 cout << " 사각형의넓이는 : " << calcrectangle(width, height) << " n"; 27 } 28 29 return 0; 30 } 밑변과높이를입력받는다. 입력인자가없는경우 calctriangle 함수를호출한다. 입력인자가있는경우 calcrectangle 함수를호출한다. main 에게입력인자를 rect 로준경우 요약 함수의목적 반복되는코드에대한효율적인관리, 쉬운이해, 코드크기를줄이기위한목적으로사용된다. 기본형태 입출력형태 www.themegallery.com IT CookBook for Beginner, C++ 기초 5 장끝 재귀함수 자기자신을호출하는함수를의미. 무한반복에빠지지않도록조심해야한다.