프로그래밍 언어/C

함수(Function)

gcreators 2024. 8. 13. 18:23

함수(Function)는
반환형 함수명(매개변수);

의 구조를 가진다

 

함수선언(Function Declration)

void PrintHelloWorld();

함수명은 잘 지어야한다. 보자마자 무엇을 하는 것인지 알 수 있도록 해야 하기 때문에 축약어를 잘 쓰지 않는다.
그렇기 때문에 해당 함수에는 함수명이 가지는 기능이 아닌 다른 기능을 넣지 않도록 주의하자.

 

함수정의(Function Definition)

void PrintHelloWorld() 
{
	printf("Hello, World!\n");
}


함수가 사용되는 기능을 구현하는 것 이라고 생각하면 된다.

 

int Sum(int _lhs, int _rhs); 
//함수선언시 매개변수 명 생략 가능
int Sub(int, int); 
int Mul(int _lhs, int _rhs);

함수는 이렇게 main이 아닌 다른 공간에 선언 하며 함수 선언시 매개변수 명은 생략이 가능하다.

컴퓨터의 입장에서는 함수의 반환형과 매개변수의 자료형만이 중요하므로 반환형과 자료형만 신경써서 처음에 선언을 하고

 

int Sum(int _lhs, int _rhs)// ' _ ' 언더 스코어를 붙여서 변수가 헛갈리지 않게 하자
{
	//_lhs = 100;
	//return _lhs * _rhs; //함수는 다른 기능이 포함 되지 않게 하자
	//if(_lhs > _rhs) return _lsh + _rhs; //반환형에 따라 무조건 반환을 해줘야한다, 
    //if형으로 조건을 걸어 반환하지 않는 경우를 만드는 식으로 반환을 안해주면 문제가 생긴다.
	return _lhs + _rhs; // 리턴을 만나면 함수가 종료된다.
}

int Sub(int _lhs, int _rhs) 
{
	return _lhs - _rhs;
}

int Mul(int _lhs, int _rhs) {
	return _lhs * _rhs;
}

이렇게 매개변수와 함수의 정의를 다음에 적어도 된다.

 

이렇게 따로 구현 하는 이유는 내가 빼기라는 것을 구현할때

어떤 변수가 왼쪽에 와서 구현될지는 정해놓는 것이 없기에

원하는 값을 도출하기 위해 나중에 구현하도록 한 것이라고 생각하면 된다.

 

int main(void)
{
	//함수호출(Function Call)
	//매개변수(Parameters)
	//인자(Arguments)
	int a = Sum(2, 7);
	printf("%d\n", a);

	printf("%d\n", Sub(4, 7));

	printf("%d\n", Mul(7, 7));
    
    return 0;
}
int Sum(int _lhs, int _rhs)
{
	return _lhs + _rhs;
}

선언한 함수는 함수명과 적어둔 매개변수를 넣는 것으로 호출이 가능하다.

이때 Sum(2, 7); 에서 Sum이 호출할 함수이고 2와 7이 인자 값이다.

그리고 매개변수는 함수를 선언 할 때 Sum과 함께 적어둔 자료형 변수(int _lhs, int_rhs)를 뜻 한다.

 

인라인 (Inline) 함수 (Function) 

inline float Div(float _lhs, float _rhs) {
	return _lhs / _rhs;
}

int main(void)
{
	float div = Div(5.0f, 2.0f); //Inline 화
	float div2 = 5.0f / 2.0f;
	return 0;
    
}

심플한 함수인 경우 함수 호출 비용을 줄이기 위해 함수의 모든 코드를 호출된 자리에 바로 삽입하는 방식의 함수다.
컴파일이 판단하기에 속도 상향이 될거 같은 경우 적용되는 것으로서 inline에도 검사 cost가 들어가기에 사용은 신중하게 해야한다.

 

포인터 활용

void Set100(int* _pVal);
int main(void)
{
    int val = 5;
    Set100(&val);//val함수의 주소를 매개변수로 Set100함수 호출
    printf("val: %d (%p)\n", val, &val);
    //함수 내부에서 함수 외부의 값을 바꿀 수 있는 방법은 포인터
    return 0;
}

void Set100(int* _pVal) 
{
	*_pVal = 100; //val함수의 주소값이 가지는 공간에 100을 저장
	printf("_val : %d (%p)\n", *_pVal, _pVal);
}

일반적인 방법으로는 함수의 내부에서 함수 외부의 값을 바꿀 수는 없지만 포인터를 활용한다면 이렇게 값을 변경 시키는 것이 가능하다.

 

 

'프로그래밍 언어 > C' 카테고리의 다른 글

문자열 함수 활용 feat)예외처리  (0) 2024.08.14
문자열(String)  (0) 2024.08.14
포인터(Pointer)  (0) 2024.08.13
배열(Array)  (0) 2024.08.12
반복문(Loop)  (0) 2024.08.09