● 함수
주어진 기능을 수행하는 것 / 주어진 기능을 수행하는 블랙박스
★ 예제 6-1
함수의 예를 보여주기 위한 예제
● 표준함수
기능이 이미 정의된 함수. 이미 정의된 표준 함수를 사용할 때에는 함수를 어떻게 사용하면 되는가를 알고 있어야 하고 해당 함수의 정보를 참조할 수 있는 파일(헤더파일)을 include 시켜줘야함
● 사용자 정의 함수
기능이 정의되어 있지 않아 프로그래머가 필요에 의해 정의한 함수.
"함수선언" , "함수정의" , "함수호출" 의 프로세스
- 함수선언
함수의 프로토타입을 결정하는 것이다. 함수를 실제 프로그램 코드에서 사용할 때 컴파일러가 해
당 내용이 어떤 형식으로 이루어졌는가를 판단하는 부분으로, 해당 함수가 정해진 약속대로 쓰
이고 있는가를 확인하는 데 필요하다. 함수 선언은 함수 프로토타입과 같은 형식이고선언문에 해당하므로 마지막에 문장의 끝을 얄리는 세미콜론(;) 기호를 입력해야한다.
- 함수정의
함수 정의는 실제 해당 함수에서 실행될 내용을 프로그래밍하는 것이다.
● main()함수
프로그램 실행에서 프로그램의 시작과 끝을 담당하는 함수. 프로그램이 실행되려면 하나 이상의 main
함수가 반드시 있어야 하고 프로그램이 실행된다는 것은 운영체제에 의해 main()함수가 호출된다는 의미이다.
● 함수를 사용한다는 것은?
함수를 호출한다라고 표현
● 함수 프로토타입 구성
함수 반환값 함수이름(매개변수,...)
항목 의미 함수의 프로토타입에서
입력 여러가지 입력 가능하다 매개변수
함수 함수를 구분하는 함수 이름을 갖고있다 함수 이름
결과 함수는 주어진 기능을 수행하고 하나의 반환값
결핏값을 가져올 수 있다.이를 "반환한다"
또는 "반환값"이라 한다. 그 이유는 힐수의
마지막에 반환값을 알리는 명렁이 ’return'
이어서 그대로 부르거나 해석해서 ’되돌린
다’고 부르기도 한다
- 주의
1. 함수 반환값은 함수 실행 후 반환하는 값의 자료형을 의미하며 만약 반환값이 없을 때는 void
라 표시한다.
2. 함수 이름은함수를식별하는 역할로써 다른함수의 이름과중복되면 안된다.
3.매개변수는 하나 이상이라면 콤마로 구분하며 자료형을 명시해야 한다. 만약 매개변수가 없을
때는 void로 표기한다. 매개변수에는 함수를 호출할 때 해당 값을 명시한다. 즉, 함수 실행에
필요한 입력 값을 기억하는 변수나 상수를 해당 매개변수 위치에 적어주는 것이다. 이를 ”매개
변수를 전달한다라고 말한다.
★ 예제 6-2 ~ 6
head.h 6-2
6-3 / 6-4 / 6-5
6-6
소스를 기능별로 사용자 정의 함수로 나누었다. 선언과 정의부분이 각각 다른 파일에 있다.
● 헤더파일 작성에서 전처리기 사용
프로그램이 복잡해지면 하나의 헤더 파일을 여러 번 참조하게 되는 경우 재정의로 인한 오류가 발생하게 된다. 이를 방지하기 위해 컴파일에서 해당 코드를 한 번만 참조하게 하는 전처리기를 사용한다. 관련된 예약어로는 두 가지 형태가 있다.
#ifdef AAA
#else
#endif
위의 내용은 AAA가 정의되어 있다면 #ifdef와 #else 사이의 내용을 컴파일하고, AAA가 정의
되어 있지 않다면 #else와 #endif 사이의 내용을 컴파일하는 것이다.
#ifndef AAA
#else
#endif
위의 내용은 AAA가정의되어 있지 않다면#ifndef와 #else 사이의 내용을컴파일하고, AAA가
정의되어 있다면 #else와 #endif 사이의 내용을 컴파일하는 것이다
※ 위의 AAA의 정의를 하는 방법중 한가지 방법으로 #define을 쓸 수 있다 (#define AAA 123)
- 헤더파일을 작성하는 경우
#ifndef _헤더 파일 이름을 대문자로 표시_
#define _헤더 파일 이름을 대문자로 표시_
선언내용
#else
#endif
★ 예제 6-7
전처리기를 사용하여 미리정의된 문구를 만들고 그것에 따라 다른결과를 보여줄수 있는 예제이다.
현제는 전처리기를 통하여 TEST가 미리 정의되므로 소스코드 내에 #ifdef TEST 에서의 조건이 참이다 그렇기 때문에 TESTESTESTES.... 라는 결과가 나왔고 #else 내의 소스코드가 회색으로 변하게 된것이다.
★ 예제 6-8
#ifndef CONFIG H
#define CONFIG H
#include <iostream>
using namespace std;
int TotalCalculation (int jumsu[] , int num);
float Round(float average , int digits);
#else
#endif
이렇게하면 헤더 파일에서 선언된 내용을 한 변만 참조하게 할수 있다.
★ 예제 6-9 ~ 11
head.h 6-9
function.cpp / mian.cpp 6-10 / 6-11
보면 알겠지만 각 각 다른 파일에서 head.h를 따로 부르는것이 보일 것이다. 하지만 head의 #ifndef 문으로 중복방지를 해주어서 head.h를 통틀어 한번반 참조하게 되는 것이다.
● 함수 매개변수 전달
- Call by Value : 매개변수의 값을 복사하여 전달하는 방법
★ 예제 6-12
사용자 정의 함수를 정의하고 Call by value로 호출하는 예제이다.
- Call by Reference : 주소를 전달하는 방법
★ 예제 6-13 Call by Reference로 정의하는 법
int TestFunc2(int &a)
{
cout << "a= " << a << endl;
a=777 ;
cout << "a= " << a << endl;
return 0;
}
★ 예제 6-14
- 디폴트 매개변수 : 함수 선언에서 함수의 매개변수에 초깃값을 정해놓고 함수 호출에서 함수의
매개변수를 지정하지 않은 경우 해당 초깃값을 호출한 함수에서 사용하는 것을 말
한다.
★ 예제 6-15
디폴트 매개변수를 인수로 사용하는 사용자 정의함수의 선언과 호출에관한 예제.
● 함수와 const 활용
★ 예제 6-16
int TestFunc3(const int a)
{
cout << "a=" << a << endl;
a=999;
cout << "a=" << a << endl;
return 0;
}
컴파일하면 에러가 발생한다. 에러메시지는 다음과 같다.
'a' : const 인 변수에 할당할 수 없습니다.
매개변수 a를 const로 지정했기 때문에 값을 수정할 수 없어 발생한 에러이다.
★ 예제 6-17
★ 예제 6-18
★ 예제 6-19
const 를 활용한 함수 예제.
● 함수 오버로딩
함수 이름은 같은데 함수의 반환형이나 매개변수가 다르게 함수를 정의하는 것을 말한다. 같은 함수 이름으로 여러 개의 함수를 작성하는 것은 함수 정의에서효율적일뿐만아니라함수를사용할때도편리하다.
- 함수를 식별하는 항목 3가지
1. 함수 반환형
2. 함수 이름
3. 함수 매개변수
★ 예제 6-20
★ 예제 6-21
★ 예제 6-22
함수 오버로딩으로 같은 이름의 함수라도 인수에 따라 다른기능을 하게 된다.
● 구조체형 일반 변수를 함수의 인수로(Call by Value )
함수 호출에서 매개변수로 구조체형 일반 변수의 사용은 값을 전달하는 역할이다. 따라서 함수
호출에서 전달한변수와함수내에서의 변수는별도의 기억 장소이다. 따라서 함수내에서 값을
수정해도 함수 호출에서 사용한 변수에 영향을 미치지 않는다.
typedef struct {
char name[30];
int age;
} PERSON;
int TEST1(PERSON a);
r = TEST1(p)
↑ ↑
정수형변수 PERSON형 변수
★ 예제 6-23
구조체함수를 Call by Value 형식으로 구현한 예제이다.
● 구조체형 포인터 변수를 함수의 인수로(Call by Reference)
typedef struct {
char name[30];
int age;
} PERSON;
int TEST1(PERSON * a);
r = TEST1(&p)
↑ ↑
정수형변수 PERSON형 변수
★ 예제 6-24
구조체함수를 Call by Reference형식으로 구현한 예제이다.