함수의 선언
자료형 함수 이름 (매개변수 목록)
{
함수 몸체
}
함수의 인수 전달
- 값에 의한 전달(call by value)
- 변수가 가지고 있는 값을 함수 내의 매개변수에 복사하는 방식이다.
void Local(int); int main(void) { int cat = 10; cout << "변수 var의 초깃값은" << var << "입니다"<<endl; Local(var); cout << "Locla() 함수 호출 후 변수 var의 값은" << var << "입니다" return 0l } void Local(int num) { num += 10; }
- 참조에 의한 전달(call by reference)
- 인수로 전달된 변수의 값을 복사 하는 것이 아닌. 원본 데이터를 직접 전달하는 것 입니다. (C언어에서는 포인터를 사용해서 전달한다)
재귀 호출하지만 계속 실행 되면 무한 루프에 걸리니까 함수가 종료될 명령문을 넣어야 한다.#include <iostream> using namespace std; void Local(int&); int main(void) { int var = 10; cout << "변수 var의 초기값은 " << var << "입니다." << endl; Local(var); cout << "Local() 함수 호출 후 변수 var의 값은 " << var << "입니다."; return 0; } void Local(int& num) { num += 10; }
- 재귀 호출이란 내부에서 함수가 자기 자신을 다시 호출 하는 것을 말한다.
int RecursiveSum(int n)
{
if (n == 1) // n이 1이면, 그냥 1을 반환함.
{
return 1;
}
return n + RecursiveSum(n-1); // n이 1이 아니면, n을 1부터 (n-1)까지의 합과 더한 값을 반환함.
}
함수 포인터
함수의 시작 주소를 가리키는포인터 상수를 함수 포인터라고 부른다. 함수의 원형을 알면 해당 함수에 맞는 함수 포인터를 만들 수 있다.
#include <iostream>
using namespace std;
double Add(double, double);
double Sub(double, double);
double Mul(double, double);
double Div(double, double);
double Calculator(double , double, double (*func)(double, double));
int main(void)
{
double (*calc)(double, double) = NULL; // 함수 포인터 선언
double num1 = 3, num2 = 4, result = 0;
char oper = '*';
switch (oper)
{
case '+' :
calc = Add;
break;
case '-':
calc = Sub;
break;
case '*':
calc = Mul;
break;
case '/':
calc = Div;
break;
default:
cout << "사칙연산(+, -, *, /)만을 지원합니다.";
break;
}
result = Calculator(num1, num2, calc);
cout << "사칙 연산의 결과는 " << result << "입니다.";
return 0;
}
double Add(double num1, double num2)
{
return num1 + num2;
}
double Sub(double num1, double num2)
{
return num1 - num2;
}
double Mul(double num1, double num2)
{
return num1 * num2;
}
double Div(double num1, double num2)
{
return num1 / num2;
}
double Calculator(double num1, double num2, double (*func)(double, double))
{
return func(num1, num2);
}
typedef
typedef double (*CalcFunc)(double, double); // 함수 포인터에 calcFunc이라는 새로운 이름을 붙임.
auto ptr_func = calc;
C++ 함수
참조자(reference)
- 특정 변수의 실제 이름 대신사용할 수 있다.
int 변수이름; // 변수의 선언
int& 참조자이름 = 변수이름; // 참조자 선언
참조자의 값을 변경하면 변수의 값도 변경된다.
구조체도 참조 할수 있다.
<aside> 💡 함수 내부에서 구조체를 직접 변경할 필요가 없을 때는 contst 키워드를 이용해서 원본에 대한 변경을 허용하지 않는것이 좋다
</aside>
디폴트 인수
- 기본 값이 미리 정의 되어 있는 인수를 뜻한다
<aside> 💡 디폴트 인수의 조건
- 디폴트 인수는 함수의 원형에만 지정할 수 있다.
- 디폴트 인수는 가장 오른쪽 부터 시작해서 순서대로만 지정할 수 있다.
- 가운데 인수들만 별도로 디폴트 인수로 지정할 수 없다.
</aside>
1. void Display(int x, int y, char ch, int z = 4); // 가능함.
2. void Display(int x, int y, char ch = 'a', int z = 4); // 가능함.
3. void Display(int x, int y = 2, char ch, int z = 4); // 오류
4. void Display(int x = 1, int y = 2, char ch, int z); // 오류
함수 오버로딩
- 같은 이름의 함수를 중복하여 정의 하는 것을 의미한다. 같은 일을 처리하는 함수를 매개변수의 형식들을 조금씩 변경 하여 하나의 이름으로 작성할 수 있게 해주는 것이다.
- 핵심은 함수 시그니처다.
<aside> 💡 함수 시그니처린? → 함수의 원형에 명시되는 매개 변수 리스트를 가리킨다.
</aside>
1. void Display(const char* str, int n); // 문자열 str을 n번 출력함.
2. void Display(const char* str1, const char* str2); // 문자열 str1과 str2를 연달아 출력함.
3. void Display(int x, int y); // x * y를 출력함.
4. void Display(double x, double y); // x / y를 출력함.
1. Display("C++", 3); // 1번 Display() 함수 호출 -> "C++C++C++"
2. Display("C++", " Programming"); // 2번 Display() 함수 호출 -> "C++ Programming"
3. Display(3, 4); // 3번 Display() 함수 호출 -> 12
4. Display(4.2, 2.1); // 4번 Display() 함수 호출 -> 2
5. Display(4.2, 3); // 3번과 4번 모두 호출 가능 -> 컴파일 오류가 발생함.
인라인 함수
- 함수가 호출될 때 일반적인 함수의 호출 과정을 거치지 않고 함수의 모든 코드를 호출된 자리에 바로 삽입하는 방식의 함수다.
inline 함수의원형
inline 함수의정의
//예시
#include <iostream>
using namespace std;
inline int Sub(int x, int y)
{
return x - y;
}
inline void Print(int x)
{
cout << "계산 결과는 " << x << "입니다.";
}
int main(void)
{
int num1 = 5, num2 = 3;
int result;
result = Sub(num1, num2);
Print(result);
return 0;
}
C++ 범위
유효 범위와 연결
- 자동 변수
- 자동변수 : 블록 내에서 선언 된 변수를 의미한다 ( stack에 저장된다 , 초기화 한하면 dummy값으로 초기화 된다.
- 레지스터 변수
- C언어와 마찬가지로 register 키워드를 붙여 선언한 변수를 의미한다.
- 정적 변수
- 프로그램이 실행 되는 내내 유지되는 변수(data 영역에 저장된다, 초기화 안하면 0이다)
- 정적 변수 종류
- 연결을 가지지 않는 정적 변수
- static 키워드를 사용하여 정의 한다.
- 지역변수와 전역 변수에 특징을 전부 가진다.
- 프로그램이 종료되야 메모리에서 사라진다.
void Local(void); void StaticVar(void); int main(void) { for (int i = 0; i < 3; i++) { Local(); StaticVar(); } return 0; } void Local(void) { int count = 1; cout << "Local() 함수가 " << count << " 번째 호출되었습니다." << endl; count++; } void StaticVar(void) { static int static_count = 1; // 연결을 가지지 않는 정적 변수 cout << "StaticVar() 함수가 " << static_count << " 번째 호출되었습니다." << endl; static_count++; }
- 내부 연결을 가지는 정적 변수
- 유효 범위를 변환 단위로 가지는 변수에 static 키워드를 사용해서 정의 한다. 이러한 함수는 현재 파일에만 사용 할 수 있다.
static int var; // 내부 연결을 가지는 정적 변수 void Local(void); int main(void) { cout << "변수 var의 초깃값은 " << var <<"입니다." << endl; int i = 5; int var = 10; // 자동 변수 선언 cout << "main() 함수 내의 자동 변수 var의 값은 " << var <<"입니다." << endl; if (i < 10) { Local(); cout << "현재 변수 var의 값은 " << var << "입니다." << endl; // 자동 변수에 접근 } cout << "더 이상 main() 함수에서는 정적 변수 var에 접근할 수가 없습니다." << endl; return 0; } void Local(void) { var = 20; // 정적 변수의 값 변경 cout << "Local() 함수 내에서 접근한 정적 변수 var의 값은 " << var << "입니다." << endl; }
자동 변수 블록 없음 블록 내부 없음 레지스터 변수 블록 없음 블록 내부 register 연결을 가지지 않는 정적 변수 블록 없음 블록 내부 static 내부 연결을 가지는 정적 변수 변환 단위 내부 함수 외부 static 외부 연결을 가지는 정적 변수 변환 단위 외부 함수 외부 없음 - 연결을 가지지 않는 정적 변수
네임스페이스
- 내부 식별자에 사용될 수 있는 유효 범위를 제공하는 선언적 영역을 의미한다.
- 일반적으로 네임 스페이스는 헤더 파일에서 정의 된다.
namespace kang
{
void Display(); // 함수의 원형
int count; // 변수의 선언
}
namespace kim
{
double display; // 변수의 선언
int count; // 변수의 선언
}
//호출 할 때
#include "namespace.h"
kang::count = 4;
kim::display = 3.14;
kim::count = 100;
using 지시자
using namespace 네임스페이스이름;
using 선언(declaration)
using 네임스페이스이름::이름;
'Programming > C++ Language' 카테고리의 다른 글
6days (0) | 2023.07.17 |
---|---|
4days (0) | 2023.07.04 |
3days (0) | 2023.07.03 |
2days (0) | 2023.07.03 |
1days (0) | 2023.06.28 |