SeoulTech 2011-2 nd 프로그래밍입문 (2) Chapter 3. 함수의기본 박종혁교수 (http://www.parkjonghyuk.net) Tel: 970-6702 Email: jhpark1@snut.ac.kr
Learning Objectives 사전정의함수 값을리턴하는함수, 리턴하지않는함수 사용자 ( 프로그래머 ) 정의함수 정의, 선언, 호출 재귀함수 영역규칙 지역변수 전역상수와전역변수 블록, 내포된영역 3-2
함수의소개 프로그램의빌딩블록 (Building Blocks) 다른언어에서의함수의용어 : 프로시저 (Procedures), 서브프로그램 (subprograms), 메소드 (methods) C++ 에서는 : 함수 (functions) I-P-O Input Process Output 프로그램의기본구성요소 이들 조각 (pieces) 을위한함수의사용 3-3
사젂정의함수 (Predefined functions) 우리가사용하는라이브러리내의함수! 두가지형태 : 값을리턴하는함수 값을리턴하지않는함수 (void) #include 를이용하여적절한라이브러리를포함시켜야함 예, <cmath>, <cstdlib> ( C 언어 라이브러리 ) <iostream> (cout, cin 을위한 ) 3-4
사젂정의함수의사용 풍부핚수학함수 <cmath.h> 라이브러리내에있다 대부분값을리턴핚다 ( 결과 ) 예 : theroot = sqrt(9.0); 구성요소 : sqrt = 라이브러리함수명 theroot = 결과값이핛당되는변수 9.0 = 함수에서사용되는인자또는초기입력값 In I-P-O: I = 9.0 P = 루트계산 " O = 3, 리턴되고 theroot에핛당 3-5
함수호출 (Function Call) 결과의할당 : theroot = sqrt(9.0); 식 "sqrt(9.0) 은함수를호출 (function call 또는 function invocation) 하는부분 함수호출내의인자 (9.0) 부분은리터럴, 변수, 식모두가능 호출부분이식의일부가될수있음 : bonus = sqrt(sales)/10; 함수의리턴형이정확하게사용된다면함수호출이허용된다 3-6
디스플레이 3.1 값을리턴하는사젂정의함수 (1 of 2) 3-7
디스플레이 3.1 값을리턴하는사젂정의함수 (2 of 2) 3-8
사젂정의함수들 #include <cstdlib> 다음과같은함수를포함 : abs() // int 형의절대값을리턴 labs() // long int 형의절대값을리턴 *fabs() // float 형의절대값을리턴 *fabs() 은실제로 <cmath> 라이브러리에있음! 혼란이올수있다 C++ 이탄생되고라이브러리가추가되는과정중에발생 부록또는매뉴얼을참조할것 3-9
수학함수들 pow(x, y) X 를 y 승한값을리턴 double result, x = 3.0, y = 2.0; result = pow(x, y); cout << result; 3.0 2.0 = 9.0 이므로 9.0 을출력 이함수는두개의인자를가짐 함수는복수개의인자와다양한데이터형을가질수있다 3-10
디스플레이 3.2 사젂정의함수몇가지 (1 of 2) 3-11
디스플레이 3.2 사젂정의함수몇가지 (2 of 2) 3-12
사젂정의 void 함수 값의리턴이없음 행위 (action) 만수행하고 답 (answer) 을보내지는않음 호출될때, 식자체가문장이됨 exit(1); // 값의리턴이없으므로할당되지않음 프로그램을종료 void 함수도인자를가질수있다 값을리턴하는함수와동일한형태 단지값을리턴하지않는다는점만다름! 3-13
난수생성기 (Random Number Generator) 임의로선택한 숫자를리턴 시뮬레이션 (simulation) 또는게임에사용 rand() 인자가없다 0 ~ RAND_MAX 사이의값을리턴 범위설정 (Scaling) 나머지연산을사용하여리턴값의범위를축소 rand() % 6 0~5 사이의값을리턴 범위이동 (Shifting) rand() % 6 + 1 범위를 1 ~ 6 으로이동 ( 예 : 주사위 ) 3-14
난수의씨드 (Seed) 의사난수 (Pseudorandom numbers) rand() 를호출하면동일한순서로난수가발생됨 씨드 (seed) 를사용하여순서를변경 srand(seed_value); void 함수 하나의인자를씨드값으로받음 시스템시간을포함하여어떠한값이라도씨드로사용가능 : srand(time(0)); time() 은시스템의시간을숫자값으로리턴 time() 함수는라이브러리 <time> 에포함 3-15
난수예 0.0 ~ 1.0 사이의 double 형난수 : (RAND_MAX rand())/static_cast<double>(rand_max) double 형정밀도를위하여강제형변환사용 1 ~ 6 사이의 int 형난수 : rand() % 6 + 1 % 는나머지연산자 (remainder) 10 ~ 20 사이의 int 형난수 : rand() % 10 + 10 3-16
프로그래머 ( 사용자 ) 정의함수 자신의함수를작성해보자! 프로그램의빌딩블록 나눔 (Divide) & 획득 (Conquer) 가독성 (Readability) 재사용 (Re-use) 다음의두위치에정의가능 : main() 과같은파일 분리된다른파일에도정의가능 3-17
함수사용의요소 함수사용의세부분 : 함수의선언 (Declaration)/ 원형 (Prototype) 컴파일러를위한정보전달 호출을적절하게해석 함수정의 함수의기능에대한실제구현 / 코드 함수호출 함수에게제어권이양 3-18
함수의선언 함수원형 이라고도함 컴파일러를위핚함수정보의선언 컴파일러에게호출을해석하는방법에대해알려줌 구문 : <return_type> FnName(<formal-parameter-list>); 예 : double totalcost( int numberparameter, double priceparameter); 호출전에위치 main() 함수공간안에선언 또는 main() 함수위의전역공간에선언 3-19
함수정의 함수의구현 main() 함수구현과동일함 예 : double totalcost( { int numberparameter, double priceparameter) const double TAXRATE = 0.05; double subtotal; subtotal = priceparameter * numberparameter; return (subtotal + subtotal * TAXRATE); } 들여쓰기주의 3-20
함수정의위치 main() 함수뒤에위치 main() 함수안에는정의불가! 함수는 평등하다 : 함수가다른함수의부분이될수없다 정의내의형식매개변수 (formal parameter) 데이터를내부로보내기위한공간확보자 (Placeholders) 변수의이름 은함수정의내에서데이터의제공에사용 리턴문 호출자에게데이터를전달 3-21
함수호출 사전정의함수의호출과같음 bill = totalcost(number, price); 회수 : totalcost 는 double 형값을리턴 이름이 bill 인변수에값이할당됨 인자 : number, price 인자는리터럴, 변수, 식또는이들의조합모두가능 함수의호출에서, 인자를 실매개변수 (actual arguments) 라고도함 전달되는실제데이터를담고있기때문 3-22
디스플레이 3.5 난수생성기를사용하는함수 (1 of 2) 3-23
디스플레이 3.5 난수생성기를사용하는함수 (2 of 2) 3-24
선택적함수의선언 함수의선언은컴파일러를위한 정보 컴파일러는다음의사항만이필요 : 리턴형 함수이름 매개변수리스트 형식매개변수의이름은필요하지않음 : double totalcost(int, double); 형식매개변수의이름을삽입하는이유 가독성향상 3-25
매개변수 (Parameter) vs. 인자 (Argument) 두개의용어는자주혼용된다 형식 (formal) 매개변수 (parameter)/ 인자 (argument) 함수의선언에사용 함수정의의헤더에사용 실 (Actual) 매개변수 (parameters)/ 인자 (arguments) 함수의호출에사용 기술적으로매개변수 (parameter) 는형식 (formal) 부분이고인자 (argument) 는실 (actual) 부분 * * 항상같은방식으로사용되지는않는다 3-26
함수를호출하는함수 이미하고있다! main() 함수도함수다! 요구사항 : 함수의선언이먼저나타나있어야한다 함수의정의는일반적으로다음부분에존재 main() 함수의뒤에정의 또는별도의파일에 함수에서다른함수들을호출하는것은일반적 함수가자기자신을호출하는경우도가능 재귀 (Recursion) 3-27
부울리턴형의함수 리턴형은유효한어떠한형도가능 함수의선언 / 원형에주어진다 : bool appropriate(int rate); 함수의정의 : bool appropriate (int rate) { return (((rate>=10)&&(rate<20)) (rate==0); } true 또는 false 를리턴 다른함수에서함수를호출 : if (appropriate(entered_rate)) cout << "Rate is valid\n"; 3-28
void 함수의선언 값을리턴하는함수와비슷함 리턴형을 void 로표시 예 : Function declaration/prototype: void showresults( double fdegrees, double cdegrees); 리턴형은 void 아무것도리턴하지않음 3-29
void 함수의선언 함수의정의 : void showresults(double fdegrees, double cdegrees) { cout.setf(ios::fixed); cout.setf(ios::showpoint); cout.precision(1); cout } 리턴문이없음에주의 함수를위해사용가능 << fdegrees << " degrees fahrenheit equals \n" << cdegrees << " degrees celsius.\n"; 3-30
void 함수의호출 사전정의된 void 함수의호출과동일 main() 와같이다른함수로부터호출 : showresults(degreesf, degreesc); showresults(32.5, 0.3); 리턴값이없으므로할당되는부분이없음에주의 실매개변수 (degreesf, degreesc) 함수로전달 함수는값을전달받아자신이할일을수행 3-31
void 함수의리턴문 호출한함수에게제어권을이양 리턴형이있는함수의경우반드시리턴문이있어야한다 일반적으로함수정의의맨마지막에위치 void 함수의리턴문은선택적 } 가함축적으로 void 함수로부터제어권을넘김 ( 리턴문의역할 ) 3-32
선행조건 (Preconditions) 과 사후조건 (Postconditions) I-P-O 와유사함 함수선언부의주석 : void showinterest(double balance, double rate); // 선행조건 (Precondition): balance 는음수가아닌계좌잔액 // rate 는 % 로표시되는이자율 // 사후조건 (Postcondition): 주어진이자율로주어진잔액에대한 // 이자를화면에출력, 종종입력과출력으로불리기도함 3-33
main() 함수 : 특별하다 main() 또한함수 특별한점 : main() 함수는프로그램에서단하나만존재 누가 main() 함수를호출하는가? 운영체제 (Operating system) 관례적으로반드시리턴문이존재 호출자에게값을리턴 운영체제 (operating system) int or void 형으로리턴 3-34
영역규칙 (Scope Rules) 지역변수 주어진함수의바디 (body) 안에선언 함수내에서만사용가능 다른함수안에같은이름을가지는변수가존재가능 영역은지역 : 함수가변수의영역이된다 지역변수우선 각각의데이터제어를유지 근거지를알아야한다 함수자신의역할수행에필요한지역데이터가필요하면함수내에서변수가선언되어야한다 3-35
프로시저추상화 (Procedural Abstraction) 함수가 무엇 이필요한지는알아야하지만 어떻게 동작하는지는몰라도된다! 블랙박스 (black box) 와같이생각함 사용방법은알지만어떻게동작하는지는모른다 블랙박스와같이구현 함수의사용이필요하면 : 선언 함수의정의부분은필요없다 정보의은닉 으로부른다 함수가어떻게동작하는지자세한과정은숨겨짐 3-36
젂역상수 (Global Constants) 와젂역변수 (Global Variables) 함수바디의외부에선언 해당파일안의모든함수에게전역 함수바디의내부에선언 함수의지역변수 상수의전역선언 : 전역상수 (External Constants) const double TAXRATE = 0.05; 전역으로선언되었으므로모든함수가영역을가진다 전역변수? 가능하지만잘사용하지는않음 위험 : 사용시제어가불가능! 3-37
블록 복합문내부에선언된변수 블록 이라부름 : 복합문영역에서만사용되는지역변수 블록영역 을가진다 모든함수의정의는블록! 지역함수영역을제공한다 루프블록 : for (int ctr=0;ctr<10;ctr++) { sum+=ctr; } 변수 ctr 은루프바디블록의영역만을가짐 3-38
중첩된영역 (Nested Scope) 다중블록 ( 중첩된블록 ) 안에서각블록마다선언된같은이름의변수들 : 각변수는서로다른변수! 매우정당한방법 : 영역은 블록영역 모호하지않음 각각의변수의이름은영역내에서구분됨 각변수들은선언된블록안에서만영향을받음 3-39
요약 1 두종류의함수 : 값을리턴하는함수와값의리턴이없는 (void) 함수 함수는 블랙박스 어떻게 동작하는지는숨겨짐 자신의지역변수선언 함수의선언에는자신의문서가있어야한다 주석내에사전및사후조건이제공되어야함 모든호출자가필요시제공되어야함 3-40
요약 2 지역데이터 함수정의안에서선언 전역데이터 함수정의이전에선언 상수는좋지만변수는바람직하지않다 매개변수 (Parameters)/ 인자 (Arguments) 형식 (formal): 함수의선언과정의에서사용 입력데이터의공간확보자 (placeholder) 실 (Actual): 함수의호출 실데이터가함수에전달됨 3-41
Q&A 1-42