본문 바로가기
개발개발/c++

c++의 함수

by 유잉유잉유잉 2024. 12. 6.
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

댓글