Ch9. 함수(21/12/27)

이수복·2021년 12월 27일

함수

정의 : 입력(전달인자)와 그에 따른 적절한 출력(반환 값)이 존재하는 것
-> 전달인자가 없거나 반환 값이 없거나 둘 다 없는 경우도 존재
-> 전달인자는 함수 호출 시의 실제 값, 매개변수는 함수 정의 시의 변수

  • printf 함수의 예를 들어 설명
    전달인자를 모니터에 출력하기 때문에 값이 반환될 필요는 없어보이지만 printf 함수 또한 값을 반환한다.
int main(void)
{
	int num1;
    	num1 = printf("12345\n"); -> 12345
        printf("%d \n", num1); -> 6( \n 문자를 포함해 6을 반환하여 변수에 저장)
        retunr 0;
}

전달인자 o, 반환 값 o

  • 함수 정의 간에, 전달인자를 저장할 변수를 선언(매개변수)
  • return문을 통해 값을 반환
    int Add(int num1, int  num2)
    {
    	int result = num1 + num2;
            return result;
    }

전달인자 ox, 반환 값 xo

  • 전달인자 o, 반환값 x : 함수가 void로 선언되어 return문이 없음

    void ShowAddResult(int num)
    {
    	printf("덧셈결과 출력 : %d \n", num)
    }
  • 전달인자 x, 반환값 o : 매개변수 선언 위치에 void를 선언하여 함수 호출 시에 인자 전달 X

    int ReadNum(void)
    {
    	int num;
            scanf("%d", &num):
            return num:
    }

전달인자 x, 반환 값 x

  • 매개변수와 반환형이 void로 선언되어 인자의 전달과 값의 반환 불필요
    void HowToUseThisProg(void)
    {
    	printf("아무말 대잔치");
    }

return문의 의미

  • 함수를 빠져나감
  • 값을 반환
    -> 반환형이 void로 선언된 함수에서는 return문을 사용할 수 없다는 잘못된 말이며, return문을 사용하여 '함수를 빠져나감'을 활용가능

함수의 선언

  • 함수에 대한 정의는 main 함수 앞에 와야 호출 가능
  • 그러나 함수에 대한 선언을 main 함수의 앞, 정의를 main 함수 뒤에 작성하는 구조 가능
  • 함수의 선언에는 매개변수의 개수와 자료형 정보만 포함되면 되므로 다음과 같은 선언 가능
    int add(int num1, int num2);
    int add(int, int)

전역변수, 지역변수

  • 지역변수(local variable) : 중괄호 내에만 존재 및 접근 가능(사용자 정의 함수, 반복문, 조건문..)
    -중괄호 내에 선언되는 변수는 모두 지역변수
    -외부에 선언된 변수와 이름이 같아도 문제되지 않음
    -지역변수는 '스택'이라는 메모리 영역에 할당
    -매개변수도 지역변수의 일종(선언된 함수 내에서만 접근 가능하고, 선언된 함수가 반환을 하면 지역변수와 마찬가지로 소멸되기 때문)
for(a = 0; a < 3; a++)
{
	int b = 0;
    	b++; 
        ...
}
-> for문이 실행될 때 메모리 공간에 지역변수 b가 할당되었다가, for문이 종료되면 소멸
-> 따라서 b는 항상 0
  • 전역변수 : 중괄호 밖에서 선언하여 위치할 수 있음
    -프로그램의 시작과 동시에 메모리 공간에 할당되어 종료 시까지 존재
    -별도의 값으로 초기화되지 않으면 0으로 초기화
    -프로그램 영역 어디서는 접근 가능

static

전역변수, 지역변수에 static 선언 추가가능
여기서는 static 지역변수만 설명

지역변수의 특징
-선언된 함수 내에서만 접근 가능
-함수 내에서 선언된 지역변수는 해당함수가 반환되면 소멸

-> static 선언이 붙게되면 두번째 특성이 변화
-> 딱 1회 초기화되고 프로그램 종료 시까지 메모리 공간에 존재

void ss(void)
{
	static int num1 = 0;
    	int num2 = 0;
        num1++, num2++;
        pritnf("static %d, local %d", num1, num2);
}
int main(void)
{
	int i;
    	for(i=0; i<3; i++)
        	ss();
        return 0;
}
-> static 1,2,3 그리고 local 1,1,1 과 같은 결과 확인 가능

register

  • register 지역변수 처럼 선언 가능
    -> 이때의 지역변수는 cpu내의 '레지스터'라는 메모리 공간에 저장될 확률이 높아짐.
    -> 해당 변수를 빈번히 사용하기 때문에 cpu에 대한 접근이 가장 빠른 레지스터에 저장하고자 하였으나 컴파일러가 이러한 저장 행위가 적절하지 않다고 판단하면 register 선언을 해도 레지스터에 저장되지 않음

재귀함수

  • 자료구조와 알고리즘 학습을 위해 필수
  • 재귀가 발생해 스스로를 호출하는 상황에서 복사본이 호출된다고 이해할 것
    int Factorial(int n)
    {
    	if(n==0)
        		return 1;
            else
            	return n * Factorial(n-1)
    }
    int main(void)
    {
    	printf("3! = %d \n, Factorial(3));
    }
        
profile
개발 입문자

0개의 댓글