728x90
🎯함수
- 특정 동작을 하는 코드를 작성하여 필요할 때마다 해당 코드를 동작시켜줄 수 있는 기능입니다.
// 함수의 형태
반환타입 함수이름 ( 인자 )
{
함수의 내용
}
- 반환타입은 변수타입 (ex: bool char int ... )을 넣어주면 됩니다.
- 반환타입엔 void도 있습니다.. 반환할게 없을때 사용합니다.
- 이 함수가 기능을 동작시키고 결과로 이 함수를 사용한 곳에
반환해야할 값이 있을 경우 해당 값의 타입을 반환 타입으로 지정합니다.
- 함수이름
- 목적에 맞는 이름으로 작성하기 - Parameter
- 인자, 파라미터, 매개변수
- 해당 함수에서 기능을 동작시키기 위해 특정 값을 외부에서 값을 받아와야 할 때 사용
- 있을수도 없을수도 있음
- 예제1) 두개의 정수를 받아서 덧셈한 값을 반환하는 함수
int Add ( int num, int num2 )
{
// 반환타입이 void가 아닐 경우라면 반드시 return 키워드를 이용하여
// 반환타입에 맞는 결과 값을 반환해 주어야 한다.
return num + num2;
}
- 예제2) 단순히 출력을 하는 함수. 반환값이 없음
void Output ()
{
std::cout << "bye" << std::endl;
}
▶️ 함수의 호출
- 함수를 호출할 때는 '함수이름 (매개변수에 전달해줄 값)'의 형태로 호출합니다.
// 함수를 호출할 때는 '함수이름( 매개변수에 전달해줄 값)'의 형태로 호출한다.
int num = Add ( 30, 20 );
std::cout << num << std::endl;
std::cout << Add ( 1, 1 ) << std::endl;
std::cout << Add ( 1, 2 ) << std::endl;
Output ();
▶️ 함수의 변수처리
void ChangeNumber ( int num )
{
num = 500;
}
int main()
{
int num = 100;
// 여기서 함수를 호출하는 순간 이 함수의 매개변수나 함수 내부에서
// 선언한 변수들의 메모리 공간이 만들어지고 이 함수의 호출이 종료되면
// 해당 메모리 공간들은 제거된다
ChangeNumber ( num );
std::cout << num << std::endl; // 100이 출력된다.
return 0;
}
- 위 코드에서 ChangeNumber를 호출하는 순간
ChangeNumber의 매개변수인 int num의 크기인 4byte만큼 메모리에 공간이 만들어집니다.
main의 num의 값을 changeNumber의 매개변수인 num에 복사해주기 때문에
ChangeNumber에서 num의 값을 바꾸어도 main()의 num변수의 값은 변하지 않습니다.
- ChangeNumber()의 매개변수인 int num은 함수가 종료됨과 동시에 메모리상에서 삭제됩니다.
▶️ 배열을 함수의 인자로 넘겨주기
void SetNum ( int nums[5] )
{
nums[0] = 99;
}
int main ()
{
int Arr[5] = {};
// 배열을 인자로 넘겨줘야 할 경우 배열 이름으로 넘겨준다
SetNum (Arr);
for( int i = 0 ; i < 5 ; i++)
{
std::cout << Arr[i] << std::endl;
}
return 0;
}
- 배열은 함수의 매개변수로 주소를 넘겨주기 때문에(배열 변수 이름이 곧 주소) 배열 내부의 값이 변경됨을 확인할 수 있습니다.
▶️ 함수 선언만 하기
void OutputItem ( Fitem item );
- header없이 사용할 때, 함수의 선언 다음줄 이후부터는 자유롭게 함수를 호출하여 사용할 수 있습니다.
- 위처럼 함수의 구현부 없이, 반환값, 함수이름, 함수의 매개변수만 우선 선언할 수 있습니다.
- 위 함수 선언의 경우 어딘가에 이 함수의 구현부분이 존재합니다.
- 함수 구현은 아래쪽에 할 수 있습니다. 다른 파일에 구현할수도 있습니다.
▶️ 함수 매개변수 전달
- 클래스나, 구조체를 함수의 인자로 넘겨줄땐 무조건 레퍼런스 또는 포인터로 넘겨주기를 추천합니다.
- 그대로 전달하게 되면 값복사가 이뤄지게 되어 클래스나 구조체의 크기가 클수록 부담이 될 수 있습니다.
- 값 형식의 타입(ex: int, float, char 값형식)일 경우엔 안붙이는게 더 빠르나 양이 많을 경우 (ex : 배열, 리스트 등) 레퍼런스로 사용하는게 효율적일 수 있습니다.
- 일반적인 변수 타입의 경우 const 레퍼런스를 붙여서 사용하는 것이 더 느릴 수 있습니다.
- 정해지지 않은 길이의 문자열을 함수의 매개변수로 받을 경우 const char * 형태로 받으면됩니다.
- 포인터는 배열의 시작위치 주소를 가지고 있기 때문입니다.
728x90
'개발개발 > c++' 카테고리의 다른 글
c++의 include define, extern, memcpy_s (0) | 2024.12.09 |
---|---|
c++의 지역변수, 전역변수, 메모리 영역, static 변수, 동적할당, 함수 오버로딩, 함수의 디폴트 인자 (0) | 2024.12.08 |
c++의 구조체, 구조체 크기와 구조체 멤버맞춤 (0) | 2024.12.07 |
c++의 조건문, 난수, 사용자 정의 변수타입, enum class, 반복문, 배열 (1) | 2024.12.05 |
c++의 구조, 문자열 출력, 변수, 상수, 형변환 (0) | 2024.12.04 |
댓글