본문 바로가기
문법관련/C

8. 함수

by print_soo 2024. 6. 14.

함수의 선언과 정의

 

//함수의 선언
반환값 자료형 함수명(매개변수1 자료형 매개변수명1, 매개변수2 자료형 매개변수명2);

int main(){

}

//함수의 정의
반환값 자료형 함수명(매개변수1 자료형 매개변수명1, 매개변수2 자료형 매개변수명2){
    //함수가 수행하는 명령
}

예시

int sum(int a, int b){
    int res;
    res = a + b;
    return res;
}

sum(10, 20); //30

 

여러가지 함수 유형

 

1. 매개 변수가 없는 함수

//양수를 출력하는 함수
int get_pos(){
    int num;
    scanf("%d", &num);
    if(num < 0){
        printf("양수를 입력해주세요.");
        scanf("%d", &num);
    }
    return num;
}

//호출
int pos;

pos = get_pos();

 

2. 반환 값이 없는 함수

: 화면에 출력을 하는 경우 등등

//반복되는 문자 출력
print_char(char ch, int cnt){
    int i;
    for(i=0; i<cnt; i++){
        printf("%c", ch);
    }
}

//만약 리턴을 쓰고싶다면 아무 값 없이 return만 사용

//호출
print_char('*', 5);

 

3. 매개 변수와 반환 값이 없는 함수

//반복되는 문자 출력
print_bar(){
    int i;
    for(i=0; i<5; i++){
        printf("-");
    }
}

//만약 리턴을 쓰고싶다면 아무 값 없이 return만 사용

//호출
print_char('*', 5);

 


 

재귀함수

: 자기가 자기 자신을 호출하는 함수

fruit(){
    printf("apple\\n")
    fruit(); //자기자신 호출
}

 

위의 함수를 실제로 실행하면 강제종료된다.

그 이유는 첫 fruit() 반환 되지 않고 두 번째 fruit() 생기고 또 반환이 않되는 일이 무한대로 벌어지기 때문이다.

 

따라서 재귀함수에는 그 호출을 중지할 조건이 필요하다.

 

void fruit(int cnt){
    printf("apple\\n");
    if (cnt == 3){
        return;
    } 
    fruit(cnt+1); //자기자신 호출
    printf("jam\\n");
}

//호출
fruit(1);

 

 

재귀함수의 작동원리

void fruit(1){
    printf("apple\\n");
    if (cnt == 3){
        return;
    } 
    fruit(cnt+1); //자기자신 호출1
    printf("jam\\n");
}

 

1. 우선 첫 번째로 fruit재귀함수를 호출하면 apple을 출력 후 두 번째 fruit재귀함수를 호출한다. (jam은 출력하지 않음 -> 호출 보다 아래이기 때문에)

 

void fruit(2){
    printf("apple\\n");
    if (cnt == 3){
        return;
    } 
    fruit(cnt+1); //자기자신 호출2
    printf("jam\\n");
}

 

2. 두 번째 fruit재귀함수를 호출되면 apple을 출력 후 세 번째 fruit재귀함수를 호출한다. (jam은 출력하지 않음 -> 호출 보다 아래이기 때문에)

 

void fruit(3){
    printf("apple\\n");
    if (cnt == 3){
        return;
    } 
    fruit(cnt+1); //자기자신 호출3
    printf("jam\\n");
}

 

3. 세 번째 fruit재귀함수가 호출되면 apple을 출력 후 반환된다. 이때 반환은 값으로 반환하는 것이 아니라 해당 함수를 호출했던 곳으로 반환 된다.

 

따라서 이때 반환 되는 곳은 주석으로 처리된 자기 자신 호출2로 반환된다. 그 후 jam을 출력하고 다시 해당 함수를 호출한 첫 자기 자신 호출1로 반환된다. 여기서 다시 한번 jam을 출력하고 함수가 종료된다.

 

//결과

apple
apple
apple
jam
jam

 

재귀함수가 이해 안될 떄 추천 영상 -> https://youtu.be/_-JPk12J2Zg?feature=shared

'문법관련 > C' 카테고리의 다른 글

10. 배열과 포인터  (0) 2024.06.24
9. 포인터  (0) 2024.06.18
7. 반복문 - do while  (0) 2024.06.13
6. 연산자  (0) 2024.06.12
5. scanf 함수  (1) 2024.06.10