2023. 11. 4. 12:07ㆍ프로그래밍 공부/OOP
3.1 미리 정의된 함수
void 함수: 아무 값도 반환하지 않는 함수
값을 반환하는 미리 정의된 함수
인수(argument): 함수로 전달해주는 값
반환된 값(returned value): 함수가 계산하는 값
어떤 함수는 인수가 두 개 이상일 수 있지만 반환된 값이 두 개 이상인 함수는 없습니다.
함수 호출(function call 또는 function invocation): 다른 식처럼 사용할 수 있는 표현
예시) theRoot = sqrt(9.0)에서 인수는 9.0, 반환된 값은 3.0, sqrt(9.0)은 함수 호출
값을 반환하는 함수
값을 반환하는 함수의 경우 함수 호출은 함수 이름 뒤에 괄호로 둘러싸인 인수로 구성된 식을 의미합니다.
인수가 둘 이상 있으면 인수는 쉼표로 구분됩니다.
함수 호출이 값을 반환하면 함수 호출은 함수가 반환하는 값에 대해 지정된 유형의 다른 식처럼 사용할 수 있는 식을 의미합니다.
SYNTAX
Function_Name(Argument_List)
여기서 Argument_List는 쉼표로 구분된 인수 목록입니다:
Argument_1, Argument_2, ..., Argument_Last
EXAMPLES
side = sqrt(area);
cout << "2.5 to the power 3.0 is "
<< pow(2.5, 3.0);
디스플레이 3.1 값을 반환하는 미리 정의된 함수
//Computes the size of a doghouse that can be purchased
//given the user's budget.
#include <iostream>
#include <cmath>
using namespace std;
int main( )
{
const double COST_PER_SQ_FT = 10.50;
double budget, area, lengthSide;
cout << "Enter the amount budgeted for your doghouse $";
cin >> budget;
area = budget / COST_PER_SQ_FT;
lengthSide = sqrt(area);
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
cout << "For a price of $" << budget << endl
<< "I can build you a luxurious square doghouse\n"
<< "that is " << lengthSide
<< " feet on each side.\n";
return 0;
}
샘플 대화
Enter the amount budgeted for your doghouse $25.00
For a price of $25.00
I can build you a luxurious square doghouse
that is 1.54 feet on each side.
cmath 헤더: 함수 sqrt의 정의 및 기타 여러 수학 함수가 포함되어 있는 라이브러리
iostream, cmath 라이브러리, std 네임스페이스를 포함해야 한다.
abs, labs 함수를 이용하기 위해서는 cstdlib (c standard library)라이브러리를 이용해야 한다.
#include <cstdlib>
그 외 자세한 사항은 디스플레이 3.2에 서술했다.
디스플레이 3.2 몇몇 미리 정의된 함수들
이러한 미리 정의된 모든 함수는 using namespace std와 include 지시문을 필요로 합니다.
| NAME | DESCRIPTION | TYPE OF ARGUMENTS |
TYPE OF VALUE RETURNED |
EXAMPLE | VALUE | LIBRARY HEADER |
| sqrt | Square root | double | double | sqrt(4.0) | 2.0 | cmath |
| pow | Powers | double | double | pow(2.0, 3.0) | 8.0 | cmath |
| abs | Absolute value for int |
int | int | abs(—7) abs(7) |
7 7 |
cstdlib |
| labs | Absolute value for long |
long | long | labs(—70000) labs(70000) |
70000 70000 |
cstdlib |
| fabs | Absolute value for double |
double | double | fabs(—7.5) fabs(7.5) |
7.5 7.5 |
cmath |
| ceil | Ceiling (round up) |
double | double | ceil(3.2) ceil(3.9) |
4.0 4.0 |
cmath |
| floor | Floor (round down) |
double | double | floor(3.2) floor(3.9) |
3.0 3.0 |
cmath |
| exit | End program | int | void | exit(1); | None | cstdlib |
| rand | Random number |
None | int | rand( ) | Varies | cstdlib |
| srand | Set seed for rand |
unsigned int |
void | srand(42); | None | cstdlib |
미리 정의된 void 함수
void 함수
void 함수는 일부 동작을 수행하지만 값을 반환하지는 않습니다.
void 함수의 경우 함수 호출은 함수 이름 뒤에 괄호 안에 인수를 붙인 다음 세미콜론으로 끝나는 문입니다.
인수가 둘 이상인 경우 인수는 쉼표로 구분됩니다.
void 함수의 경우 함수 호출(function call)은 다른 C++ 문처럼 사용할 수 있는 문입니다.
SYNTAX
Function_Name(Argument_List);
여기서 Argument_List는 쉼표로 구분된 인수 목록입니다:
Argument_1, Argument_2, . . . , Argument_Last
EXAMPLE
exit(1);
exit 함수
exit 함수는 int형의 한 인수를 사용하는 미리 정의된 void 함수입니다.
따라서 exit 함수의 호출은 다음과 같이 쓰여진 문장입니다:
exit(Integer_Value);
종료 함수가 호출되면(즉, 이전 문이 실행되면) 프로그램은 즉시 종료됩니다. 임의의 Integer_Value를 사용할 수 있지만, 일반적으로 오류로 인한 종료 호출에는 1을 사용하고, 그 외의 경우에는 0을 사용합니다.
exit function 정의는 라이브러리 cstdlib에 있으며 exit function을 std 네임스페이스에 배치합니다. 따라서 exit function을 사용하는 모든 프로그램은 다음 두 가지 방향을 포함해야 합니다:
#include <cstdlib>
using namespace std;
디스플레이 3.3
#include <iostream>
#include <cstdlib>
using namespace std;
int main( )
{
cout << "Hello Out There!\n";
exit(1);
cout << "This statement is pointless,\n"
<< "because it will never be executed.\n"
<< "This is just a toy program to illustrate exit.\n";
return 0;
}
샘플 대화
Hello Out There!
난수 생생기
난수 생성기(random number generator): "무작위로 선택된" 수를 반환하는 함수
헤더 파일이 <cstdlib>인 C++ 라이브러리 헤더에서 난수 생성 관련 함수를 호출할 수 있다.
#include <cstdlib>
using namespace std;
rand(): 인수를 사용하지 않고 0에서 rand_MAX까지의 정수 중 의사 난수 정수를 반환한다.
스캐일링(scaling): 작은 범위의 난수를 원할 때 크기 조절을 한다.
범위 B에서 (A-1 + B)까지 = rand() % A + B
의사 난수(pseudorandom numbers): rand로 호출되는 일련의 숫자들처럼 무작위로 보이지만 실제로는 그렇지 않은 숫자들은 의사난수라고 불립니다.
시드(seed): 의사 난수의 수열을 결정하는 수이다. 음이 아닌 정수여야 한다.
함수 srand: 함수 rand에 대한 시드를 결정할 수 있다.
예제)
int i;
srand(99);
for (i = 0; i < 10; i++)
cout << (rand( ) % 11) << endl ;
srand(99);
for (i = 0; i < 10; i++)
cout << (rand( ) % 11) << endl ;
위 두 시퀀스는 동일한 난수를 생성한다.
주어진 시드에 대해 생성된 의사 난수의 순서는 시스템에 의존적일 수 있다.
동일한 시드를 가진 다른 시스템에서 다시 실행하는 경우 해당 시스템에서 의사 난수의 순서는 다를 수 있다.
그러나 C++의 동일한 구현을 사용하여 동일한 시스템에 있는 한 동일한 시드는 동일한 의사 난수의 순서를 생성한다.
의사 난수 생성기가 실재 난수 생성기에 비해 가지는 장점은 그것에 대해 생성되는 수열이 반복가능하다는 것이다.
확률은 일반적으로 0.0~1.0 범위의 부동 소수점 숫자로 표시됩니다.
임의의 정수 대신 임의의 확률을 원한다고 가정하자.
이것은 다른 형태의 스케일링에 의해 생성될 수 있다.
다음은 0.0과 1.0 사이의 의사 난수 부동 소수점 값을 생성한다.
(RAND_MAX - rand( ))/ static_cast< double>(RAND_MAX)
디스플레이 3.4 난수 생성기를 사용한 함수
#include <iostream>
#include <cstdlib>
using namespace std;
int main( )
{
int month, day;
cout << "Welcome to your friendly weather program.\n"
<< "Enter today's date as two integers for the month " <<
"and the day:\n";
cin >> month;
cin >> day;
srand(month * day);
int prediction;
char ans;
cout << "Weather for today:\n";
do
{
prediction = rand( ) % 3;
switch (prediction)
{
case 0:
cout << "The day will be sunny!!\n";
break;
case 1:
cout << "The day will be cloudy.\n";
break;
case 2:
cout << "The day will be stormy!\n";
break;
default:
cout << "Weather program is not " <<
"functioning properly.\n";
}
cout << "Want the weather for the next day?(y/n): ";
cin >> ans;
} while (ans == 'y' || ans == 'Y');
cout << "That's it from your 24-hour weather program.\n";
return 0;
}
샘플 대화
Welcome to your friendly weather program.
Enter today's date as two integers for the month and the day:
2 14
Weather for today:
The day will be cloudy.
Want the weather for the next day?(y/n): y
The day will be cloudy.
Want the weather for the next day?(y/n): y
The day will be stormy!
Want the weather for the next day?(y/n): y
The day will be stormy!
Want the weather for the next day?(y/n): y
The day will be sunny!!
Want the weather for the next day?(y/n): n
That's it from your 24-hour weather program.
3.2 프로그래머 정의 함수
값을 반환하는 함수 정의하기
함수 선언(function declaration): 함수 호출을 작성하기 위해 알아야 할 모든 것을 알려준다. 함수 프로토타입(function prototype)이라고도 함
ex) double totalCost( int numberParameter, double priceParameter);
첫번째 단어: 반환되는 값의 유형 ex) double
두번째 단어: 함수의 이름 ex) totalCost
마지막 단어들: 함수에 필요한 인수의 수와 인수의 유형 ex) 위의 예제에서 인수의 수는 2개이고 인수의 유형은 각각 int, double이다.
함수 정의(function definition): 함수가 반환되는 값을 계산하는 방법 설명. 함수 헤더 + 함수 본문으로 구성된다.
함수 헤더(function header): 헤더 끝에 세미콜론이 없다는 점을 제외하면 함수 선언과 유사하게 작성된다.
함수 본문(function body): 함수 헤더를 따라 함수 정의를 완성한다. 함수 본문은 두 개의 괄호 안에 포함된 선언문과 실행 가능한 문으로 구성된다. 따라서 함수 본문은 프로그램의 주요 부분의 본문과 같다. 함수를 호출하면 형식 매개 변수에 대한 인수 값이 연결되고 본문의 문이 실행된다. 함수가 반환하는 값은 반환문을 실행할 때 결정된다.
return문: 키워드 return에 뒤따른 식을 포함한다.
예시) return (subtotal + subtotal * TAXRATE);
(subtotal + subtotal * TAXRATE)의 값이 반환된다.
함수를 호출하기 전에 전체 함수 정의 또는 함수 선언(함수 프로토타입)이 코드에 나타나야 한다.
만약 전체 함수 정의가 프로그램의 주요 부분 앞에 놓이면 함수 선언은 생략될 수 있다.
디스플레이 3.5 난수 생성기를 사용하는 함수
#include <iostream>
using namespace std;
double totalCost( int numberParameter, double priceParameter);
//Computes the total cost, including 5% sales tax ,
//on numberParameter items at a cost of priceParameter each .
int main( )
{
double price, bill;
int number;
cout << "Enter the number of items purchased: ";
cin >> number;
cout << "Enter the price per item $";
cin >> price;
bill = totalCost(number, price);
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
cout << number << " items at "
<< "$" << price << " each.\n"
<< "Final bill, including tax, is $" << bill
<< endl;
return 0;
}
double totalCost( int numberParameter, double priceParameter)
{
const double TAXRATE = 0.05; //5% sales tax
double subtotal;
subtotal = priceParameter * numberParameter;
return (subtotal + subtotal*TAXRATE);
}
샘플 대화
Enter the number of items purchased: 2
Enter the price per item: $ 10.10
2 items at $10.10 each.
Final bill, including tax, is $21.21
함수 선언을 위한 대안적인 형태
함수 선언(function prototype)에서 공식적인 매개변수 이름을 나열할 필요는 없다.
아래의 두 함수 선언은 동등하다.
double totalCost( int numberParameter, double priceParameter);
double totalCost( int, double);
보통 첫 번째 형식을 사용하여 함수 선언과 함께 제공되는 주석의 형식적인 매개 변수를 참조할 수 있다.
그러나 두 번째 형식은 종종 설명서에서 볼 수 있다.
하지만 함수 정의를 위해서는 항상 형식 매개 변수 이름을 나열해야 한다.
함정: 잘못된 순서에 대한 논쟁
함수가 호출되면 컴퓨터는 첫 번째 인수를 첫 번째 형식 매개변수로, 두 번째 인수를 두 번째 형식 매개변수로 대체합니다.
컴퓨터는 각 인수의 유형을 확인하지만 합리성을 확인하지 않습니다.
인수의 순서를 혼동하면 프로그램은 원하는 작업을 수행하지 않습니다.
잘못된 유형의 인수로 인해 유형 위반이 발생하면 오류 메시지가 나타납니다.
유형 위반이 없으면 프로그램이 정상적으로 실행되지만 함수에 의해 반환되는 값에 대해 잘못된 값을 생성합니다.
함정: 매개변수와 인수의 사용
이 책에서 따르는 공식 매개변수(parameter)와 인수(argument)라는 용어의 사용은 일반적인 용법과 일치하지만,
사람들은 또한 종종 매개변수와 인수라는 용어를 혼용한다.
이 두 용어의 구분은 일반적으로는 문맥상으로 파악해야 하고 둘다 매개변수라고 칭할 때도 많다.
함수를 호출하는 함수
함수 본문은 다른 함수에 대한 호출을 포함할 수 있습니다.
유일한 제한 사항은 함수를 사용하기 전에 함수 선언(또는 함수 정의)이 나타나야 한다는 것입니다.
다른 함수의 정의 안에 함수 호출을 포함시킬 수 있지만, 한 함수의 정의를 다른 함수 정의의 본문 안에 둘 수는 없습니다.
예제: 반올림 함수
반올림 함수는 미리 정의 되어 있지 않는다. 기존의 ceil 함수, floor 함수는 각각 올림 함수, 내림 함수이다.
하지만 반올림을 수행하는 함수를 정의하는 것은 쉽다. 디스플레이 3.6에 정의되어 있다.
예를 들어, round(2.3)는 2를 반환하고, 라운드(2.6)는 3을 반환한다.
디스플레이 3.6 round 함수
#include <iostream>
#include <cmath>
using namespace std;
int round( double number);
//Assumes number >= 0 .
//Returns number rounded to the nearest integer .
int main( )
{
double doubleValue;
char ans;
do
{
cout << "Enter a double value: ";
cin >> doubleValue;
cout << "Rounded that number is " << round(doubleValue) <<
endl;
cout << "Again? (y/n): ";
cin >> ans;
} while (ans == 'y' || ans == 'Y');
cout << "End of testing.\n";
return 0;
}
//Uses cmath:
int round( double number)
{
return static_cast< int>(floor(number + 0.5));
}
샘플 대화
Enter a double value: 9.6
Rounded, that number is 10
Again? (y/n): y
Enter a double value: 2.49
Rounded, that number is 2
Again? (y/n): n
End of testing.
부울 값을 반환하는 함수
함수에 대해 반환되는 형식은 부울 형식일 수 있다.
이러한 함수에 대한 호출은 true 또는 false 값 중 하나를 반환하며, 부울 식을 허용하는 모든 곳에서 사용할 수 있다.
예를 들어, 부울 식을 사용하여 if-else 문을 제어하거나 루프 문을 제어할 수 있다.
예)
if (((rate > = 10) && (rate < 20)) || (rate == 0))
{
...
}
위 문장을 아래와 같이 만들 수 있다.
if (appropriate(rate))
{
...
}
bool appropriate( int rate)
{
return (((rate >= 10) && (rate < 20)) || (rate == 0));
}
void 함수 정의하기
C++에서 void 함수는 값을 반환하는 함수의 그것과 유사한 방식으로 정의됩니다.
일반 함수와의 차이점
1. 일반적으로 반환할 값의 유형을 지정하는 데에 비해 void라는 키워드를 사용함으로써 컴파일러에게 이 함수가 어떤 값도 반환하지 않을 것임을 알려줍니다.
2. void 함수 정의가 일반 함수와 달리 return 문을 필요로 하지 않는다는 것입니다. 함수 실행은 함수 본문의 마지막 문이 실행될 때 종료됩니다.
void 함수 정의 예시
void showResults( double fDegrees, double cDegrees)
{
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(1);
cout << fDegrees
<< " degrees Fahrenheit is equivalent to\n"
<< cDegrees << " degrees Celsius.\n";
}
void 함수 호출 예시
showResults(32.5, 0.3);
보이드 함수를 호출하면 형식 매개 변수 대신 인수가 대체되고 함수 본문의 문장이 실행됩니다.
위의 예시를 실행 시 스크린에 아래와 같이 출력됨
32.5 degrees Fahrenheit is equivalent to
0.3 degrees Celsius.
인수가 없는 함수를 갖는 것은 완벽하게 합법적이고 때로는 유용합니다.
이 경우 함수 선언에 나열된 형식적인 매개 변수가 없고 함수가 호출될 때 인수가 사용되지 않습니다.
예)
void initializeScreen( )
{
cout << endl;
}
프로그램에 이 기능에 대한 다음 호출이 첫 번째 실행 명령문으로 포함되어 있으면 이전에 실행된 프로그램의 출력이 프로그램의 출력과 분리됩니다:
initializeScreen( );
함수에 대한 매개 변수가 없는 경우에도 함수 선언 및 함수 호출에 괄호를 포함해야 합니다.
함수 선언(function prototype) 및 함수 정의의 배치는 void 함수의 경우 값을 반환하는 함수의 경우 설명한 것과 동일합니다.
void 함수에서 return문
void 함수와 값을 반환하는 함수 모두 return문을 가질 수 있습니다.
값을 반환하는 함수의 경우 return문은 반환되는 값을 지정합니다.
void 함수의 경우 return문은 반환된 값에 대한 식을 포함하지 않고 함수 호출을 종료합니다.
값을 반환하는 모든 함수는 return문을 실행함으로써 끝나야 합니다.
그러나 void 함수는 반환문을 포함할 필요는 없습니다.
반환문을 포함하지 않는 경우 함수 본문에서 코드를 실행한 후에 종료됩니다.
마치 함수 본문의 끝에 마지막 종결괄호 } 직전에 묵시적 return문이 존재하는 것과 같습니다.
디스플레이 3.7 void 함수에서 return문 사용하기
#include <iostream>
using namespace std;
void iceCreamDivision( int number, double totalWeight);
//Outputs instructions for dividing totalWeight ounces of ice cream
//among number customers. If number is 0, only an error
//message is output .
int main( )
{
int number;
double totalWeight;
cout << "Enter the number of customers: ";
cin >> number;
cout << "Enter weight of ice cream to divide (in ounces): ";
cin >> totalWeight;
iceCreamDivision(number, totalWeight);
return 0;
}
void iceCreamDivision( int number, double totalWeight)
{
double portion;
if (number = = 0)
{
cout << "Cannot divide among zero customers.\n";
return; //If number is 0, then the function execution ends here.
}
portion = totalWeight/number;
cout << "Each one receives "
<< portion << " ounces of ice cream." << endl;
}
샘플 대화
Enter the number of customers: 0
Enter weight of ice cream to divide (in ounces): 12
Cannot divide among zero customers.
전제조건과 사후조건
전제조건(precondition): 함수가 호출되었을 때 참이라고 가정되는 것.
사후조건(postcondition): 함수 호출의 효과. 즉, 전제조건이 유지되는 상황에서 함수가 실행된 후에 무엇이 참이 될 것인지 알려준다.
예시1)
void showInterest( double balance, double rate);
//전제조건 : 잔액은 마이너스가 아닌 예금계좌 잔액입니다.
//rate는 5와 같이 백분율로 표시되는 이자율입니다
//5%의 경우.
//사후조건 : 주어진 잔액의 이자금액
//지정된 속도로 화면에 표시됩니다.
이 기능을 사용하기 위해서는 showInterest 라는 기능의 정의를 알 필요가 없지만 전제조건과 사후조건을 알아야 합니다.
예시2)
double celsius( double fahrenheit);
//전제조건: 화씨는 도 단위의 온도입니다
//화씨.
//도 단위로 표시된 해당 온도를 반환합니다
//섭씨.
반환된 값에 대한 설명이 유일한 사후처리 조건인 경우 프로그래머는 보통 다음 예와 같이 사후처리 조건이라는 단어를 생략합니다.
main은 함수이다
우리가 이미 언급했듯이, 프로그램의 main 부분은 사실 main이라고 불리는 함수의 정의입니다.
프로그램이 실행되면 자동적으로 함수 main이 호출되고, 다른 함수를 호출할 수 있습니다.
프로그램의 main 부분에 있는 return 0문을 생략할 수 있다고 말하지만 휴대성을 위해, main 부분은 int 타입을 반환하는 함수이므로 return 0을 포함시켜야 하고 이것은 많은 컴파일러들이 실행해온 전통입니다.
코드에 main을 호출을 포함해서는 안 됩니다. 시스템만 메인 호출을 해야 하는데, 이는 프로그램을 실행할 때 수행됩니다.
재귀 함수
C++를 사용하면 재귀 함수를 정의할 수 있습니다.
main 함수는 재귀적으로 호출되지 않아야 합니다.
3.3 범위 규정
지역 변수
함수 정의 본문 내에서 선언된 변수는 그 함수에 국소적(local)이거나 그 함수를 범위(scope)로 갖는다고 합니다.
변수가 어떤 함수에 국소적(local)이면 우리는 함수를 지정하지 않고 단순히 지역 변수(local variable)라고 부릅니다.
변수가 함수에 국소적인 경우, 다른 함수 정의에 선언된 이름이 같은 다른 변수(또는 다른 종류의 항목)를 가질 수 있습니다.
이들은 이름이 동일하더라도 두 개의 다른 변수가 됩니다. (특히 함수 중 하나가 main 함수인 경우에도 해당됩니다.)
디스플레이 3.8 지역 변수
//Computes the average yield on an experimental pea growing patch .
#include <iostream>
using namespace std;
double estimateOfTotal( int minPeas, int maxPeas, int podCount)
//Returns an estimate of the total number of peas harvested .
//The formal parameter podCount is the number of pods .
//The formal parameters minPeas and maxPeas are the minimum
//and maximum number of peas in a pod .
int main( )
{
int maxCount, minCount, podCount;
double averagePea , yield;
//This variable named averagePea is local to the main function.
cout << "Enter minimum and maximum number of peas in a pod: ";
cin >> minCount >> maxCount;
cout << "Enter the number of pods: ";
cin >> podCount;
cout << "Enter the weight of an average pea (in ounces): ";
cin >> averagePea ;
yield =
estimateOfTotal(minCount, maxCount, podCount) * averagePea;
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(3);
cout << "Min number of peas per pod = " << minCount << endl
<< "Max number of peas per pod = " << maxCount << endl
<< "Pod count = " << podCount << endl
<< "Average pea weight = "
<< averagePea << " ounces" << endl
<< "Estimated average yield = " << yield << " ounces"
<< endl;
return 0;
}
double estimateOfTotal( int minPeas, int maxPeas, int podCount)
{
double averagePea;
//This variable named averagePea is local to the function estimateOfTotal.
averagePea = (maxPeas + minPeas)/2.0;
return (podCount * averagePea);
}
샘플 대화
Enter minimum and maximum number of peas in a pod: 4 6
Enter the number of pods: 10
Enter the weight of an average pea (in ounces): 0.5
Min number of peas per pod = 4
Max number of peas per pod = 6
Pod count = 10
Average pea weight = 0.500 ounces
Estimated average yield = 25.000 ounces
절차적 추상화
블랙 박스(black box): 사용법은 알고 있지만 작동 방법이 수수께끼인 물리적 장치의 이미지를 전달하기 위한 말의 형상
정보 숨기기(information hiding): 함수를 블랙박스로 사용할 수 있도록 함수를 디자인하는 것. 프로그래머가 마치 그 함수의 본문이 시야에서 숨겨져 있는 것처럼 행동한다는 사실을 강조한다.
절차적 추상화(procedural abstraction): 함수를 블랙박스인 것처럼 쓰고 사용하는 것
블랙박스 함수 정의 작성 방법
■ 함수 선언 주석은 프로그래머에게 함수에 대한 인수에 필요한 모든 조건을 알려주고 함수 호출의 결과를 설명해야 합니다.
■ 함수 본문에서 사용하는 모든 변수는 함수 본문에서 선언해야 합니다.
(공식 매개변수는 함수 제목에 나열되므로 선언할 필요가 없습니다.)
전역 상수 및 전역 변수
전역 이름 상수(global named constant): 프로그램의 시작 부분, 모든 함수의 본문 외부(그리고 프로그램의 주요 부분의 본문 외부)에 나타날 때 const 수식어를 이용하여 명명된 상수.
디스플레이 3.9 예시)
area = π × (radius) 2
volume = (4/3) × π × (radius) 3
const double PI = 3.14159;
전역 변수(global variable): const 수식어 없이도 파일의 모든 함수 정의에 접근할 수 있는 변수
디스플레이 3.9 전역 상수
//Computes the area of a circle and the volume of a sphere.
//Uses the same radius for both calculations .
#include <iostream>
#include <cmath>
using namespace std;
const double PI = 3.14159;
double area( double radius);
//Returns the area of a circle with the specified radius.
double volume( double radius);
//Returns the volume of a sphere with the specified radius .
int main( )
{
double radiusOfBoth, areaOfCircle, volumeOfSphere;
cout << "Enter a radius to use for both a circle\n"
<< "and a sphere (in inches): ";
cin >> radiusOfBoth;
areaOfCircle = area(radiusOfBoth);
volumeOfSphere = volume(radiusOfBoth);
cout << "Radius = " << radiusOfBoth << " inches\n"
<< "Area of circle = " << areaOfCircle
<< " square inches\n"
<< "Volume of sphere = " << volumeOfSphere
<< " cubic inches\n";
return 0;
}
double area( double radius)
{
return (PI * pow(radius, 2));
}
double volume( double radius)
{
return ((4.0/3.0) * PI * pow(radius, 3));
}
샘플 대화 상자
Enter a radius to use for both a circle
and a sphere (in inches): 2
Radius = 2 inches
Area of circle = 12.5664 square inches
Volume of sphere = 33.5103 cubic inches
블록
블록(block): 괄호 안에 포함된 C++ 코드
블록에 선언된 변수는 블록에 로컬 변수입니다.
따라서 변수 이름은 블록 외부에서 다른 것(예: 다른 변수의 이름으로 재사용됨)에 사용할 수 있습니다.
중첩 범위
만약 식별자가 하나의 블록 내에 있는 두 개의 각 블록에서 변수로 선언된다면, 이들은 이름이 같은 두 개의 다른 변수입니다.
하나의 변수는 내부 블록 내에만 존재하고 내부 블록 외부에서는 접근할 수 없습니다.
다른 하나의 변수는 외부 블록에만 존재하고 내부 블록에서는 접근할 수 없습니다.
두 변수는 서로 다르기 때문에 이 두 변수 중 하나에 대한 변경은 이 두 변수 중 다른 하나에 영향을 미치지 않습니다.
팁: 분기와 반복문에서 함수 호출 사용
switch문이나 if-else문에 각 분기마나 여러 문장들이 놓여 있으면 읽기 어렵습니다.
따라서 일반적으로 복합문을 함수 정의로 변환하여 분기에 함수 호출을 배치하는 것이 좋습니다.
마찬가지로 반복문 본체가 크면 복합문을 함수 정의로 변환하여 반복문 본체를 함수 호출로 만드는 것이 좋습니다.
for문에서 선언된 변수
변수가 for문의 시작에서 선언되고 초기화되도록 하기 위해 for문의 제목에 변수가 선언될 수 있습니다. 예를 들어,
for ( int n = 1; n <= 10; n++)
sum = sum + n;
ANSI/ISO C++ 표준은 표준 준수를 주장하는 C++ 컴파일러가 for 루프 초기화기의 모든 선언을 루프 본문의 로컬(local)인 것처럼 처리하도록 요구합니다. 이전의 C++ 컴파일러들은 이 작업을 수행하지 않았습니다. 컴파일러가 for 루프 초기화기에 선언된 변수를 어떻게 처리하는지 결정해야 합니다. 응용 프로그램에 이식성이 중요한 경우 이 동작에 의존하는 코드를 작성해서는 안 됩니다.
결국 널리 사용되는 모든 C++ 컴파일러는 이 규칙을 준수할 가능성이 높지만 현재 사용 가능한 컴파일러는 준수하지 않을 수도 있습니다.