본문 바로가기

C

혼공C 4주차

안녕하세요...

보법을 달리해서 열심히 해보겠습니다...


CH 7 함수

함수 선언, 함수 정의, 함수 호출 / return, void ...

7-1 함수의 작성과 사용

함수 : 기능을 수행하는 코드 단위
지금까지 사용해 왔던 main 함수가 대표적인 함수

표준 라이브러리 함수 : printf나 scanf 함수처럼 특정 기능을 미리 약속하고 프로그램에서 바로 사용할 수 있게 구현되어 있는 함수

함수 만들기

- 함수 정의 : 함수를 실제 코드로 만드는 것으로 함수의 기능 구현.

- 함수 호출 :  함수를 사용하기 위해 호출.

- 함수 선언 : 프로그램의 상단에서 어떤 함수를 사용할 것이라고 컴파일러에 정보를 주는 역할.

함수 정의

main 함수와 또 다른 함수가 프로그램의 전체 기능을 나누어 수행하도록 프로그램을 만들어보자.

함수 원형

1. 함수의 기능에 맞는 이름은 무엇인가? - 함수명
2. 함수가 기능을 수행할 때 필요한 데이터는 무엇인가? - 매개변수
3. 함수가 수행된 후의 결과는 무엇인가? - 반환명

반환명 함수명(매개변수1, 매개변수2) // <-함수 원형
{
	//함수가 수행하는 명령. 결괏값을 돌려보냄.
}

이렇게 함수를 만드는 것을 함수 정의라고 한다.

7-1 직접 해보는 손코딩

함수명 : 함수의 기능을 충분히 예상할 수 있도록 적절한 단어로 식별자 사용 규칙에 따라 만듦.

매개변수 : 함수가 처리할 데이터를 저장하는 변수, 함수명 옆의 괄호 안에 선언. 매개변수의 자료형이 같아도 콤마로 따로 구분해서 선언.

반환형 : 함수가 기능을 수행한 후 호출한 곳으로 돌려줄 값의 자료형을 적음.

함수 원형이 완성되면 실제 함수의 내용을 중괄호 안에다 작성.

함수 안에서 사용하는 변수명은 다른 함수의 변수명과 같아도 된다.

함수 호출과 반환

함수호출

함수는 호출을 통해 실행된다.

함수를 호출할 때는 이름을 사용하며 함수에 필요한 데이터, 인수를 괄호 안에 넣어줌.

인수는 상수나 변수, 수식을 쓸 수 있음.

입력된 인수 a, b의 값은 호출된 함수의 매개변수에 복사되어 사용.

함수 반환

호출된 함수의 실행이 끝나고 값을 반환할 때 return문을 사용.

컴파일러는 함수를 호출할 때 반환값을 저장할 공간을 미리 준비. 이 공간은 컴파일러가 별도로 확보하는 공간이며 식별할 수 있는 이름이 없으므로 계속 사용할 수 없음.

대신에 저장된 반환값을 대입 연산으로 다른 변수에 복사하거나 수식에 바로 사용하는 것은 가능.

함수의 반환값을 수식의 일부로 사용할 수 았다.

예를 들어 sum함수의 반환값에 2를 곱한다면 다음과 같이 호출 문장을 수식의 일부로 사용.

이때 실행 순서는 함수 호출이 가장 우선. 그다음 반환값과 곱셈을 수행하고 그 결과를 대입.

함수 선언

함수 선언은 컴파일러가 새로 만든 함수를 인식할 수 있도록 알리는 역할.

선언 방법 :  함수 원형에 세미콜론 붙임.

매개변수 이름을 생략할 수 있음.

함수 정의가 있지만 함수 선언을 하는 이유
1. 함수 선언에서 반환값의 형태를 확인함.

2. 함수의 호출 형식에 문제가 없는지 검사함.

함수 선언문에는 매개변수의 개수와 형태에 대한 정보가 있으므로 호출할 때 정확한 값을 주는지 검사할 수 있음.


확인 문제

1. 다음은 두 실수의 평균을 구하는 함수를 호출하는 코드입니다. 함수 정의에서 빈칸에 알맞은 내용을 채우세요.

double res;
res = average(1.5, 3.4);

double average(double a, double b);
{
    double temp;
    temp = a + b;
    
    return (temp / 2.0);
}

2. 각 용어에 맞는 설명을 연결하세요.

함수 선언  - 함수 원형을 컴파일러에 알린다.
함수 정의 - 함수 원형을 설계하고 내용을 구현한다.
함수 호출 - 함수에 필요한 값을 주고 함수를 사용한다.

3. 187cm를 미터 단위로 환산해 출력하는 프로그램이 완성되도록 빈칸을 채우세요. 단, cm를 m로 환산해 반환하는 함수를 만들고 함수 호출을 통해 구현하세요.

#include <stdio.h>

double centi_to_meter(int cm);

int main(void)
{
    double res;
   
    res = centi_to_meter(187);
    printf("%.2lfm\n", res);
   
    return 0;
}

double centi_to_meter(int cm);
{
    double meter;
    
    meter = cm / 100.0;
    
    return meter;
}

7-2 여러 가지 함수 유형

매개변수가 없는 함수

7-2 직접 해보는 손코딩

괄호 안에 void를 넣어 매개변수가 없음을 표시.
void는 함수 정의나 선언에서 사용되며 호출할 때는 쓰지 않음.

반환값이 없는 함수

함수는 기능에 따라 형태가 결정됨.

데이터를 받아서 단지 화면에 출력하는 함수라면 반환값이 필요 없음.

매개변수의 빈자리 void를 사용했던 것처럼 반환형의 자리에 void를 사용.

7-3 직접 해보는 손코딩

반환값이 없으므로 return문은 값 없이 단독으로 사용하거나 생략도 가능.

만약 함수 실행 중간에 돌아가야 한다면 return문을 함수 어디서든 사용할 수 있음.
예를 들어 count의 값이 10보다 큰 경우 바로 함수를 끝내고 싶다면 ..

void print_char(char ch, int count)
{
    int i;
    if (count > 10) return;
    for (i = 0; i < count; i++)
    {
        printf("%c", ch);
    }
    return;
}

반환값이 없는 함수는 반환값을 저장할 공간을 준비하지 않기 때문에, 호출문장을 수식의 일부로 쓸 수 있음.

매개변수와 반환값이 모두 없는 함수

이때는 함수의 매개변수와 반환형에 모두 void를 씀.

7-4 직접 해보는 손코딩

재귀호출 함수

함수는 보통 다른 함수를 호출하는데, 재귀호출 함수 recursive call function는 자기 자신을 호출.

7-5 직접 해보는 손코딩

fruit 함수는 14행을 수행한 후에 15행에서 자신을 다시 호출. 함수가 모든 명령을 수행하면 자동으로 반환하는데 반환 전에 자신을 호출하므로 처음부터 다시 시작. 즉, 이렇게 계속 호출하면 함수는 끝나지 않고 apple을 계속 출력.

7-6 직접 해보는 손코딩

7행에서 fruit 함수를 첫 번째 호출하면서 인수로 1을 준다.

함수가 몇 번째 호출되는지를 기억해야 하므로 12행에서 호출 횟수를 매개변수로 받음. 그리고 15행에서 재귀호출 전에 호출 횟수를 검사해 세 번째면 곧바로 반환하도록 if문을 넣는다. 결국 15행의 조건식이 참이면 함수가 바로 반환되므로 재귀호출이 중단되고 거짓이면 16행으로 넘어가 호출 횟수를 1 증가시킨 다음 재호출함.

이렇게 매개변수와 if문을 사용하면 호출 횟수를 원하는 만큼 조절할 수 있다.

재귀호출과 반복문의 차이점

7-7 직접 해보는 손코딩

재귀호출 함수의 경우 최초 호출한 곳이 아니라 이전에 호출했던 곳으로 돌아감.

결국 재귀호출은 하나의 함수에서 코드를 반복 실행하는 듯하지만, 실제로는 새로운 함수를 실행하는 것과 같음.

재귀호출 함수는 경우에 따라 복잡한 반복문을 간단히 표현할 수 있으나 코드 읽기가 쉽지 않고 반복 호출되면서 메모리를 사용하므로 제한적으로 쓰는 것이 좋다.

그니까 함수를 호출 -> 리턴, 나중것부터 계속 돌아감...


확인 문제

1. 다음 중 함수 형태(원형)에 따라 옳게 사용(호출)된 것을 고르세요.

더보기

① : 매개변수 자료형을 double, int로 수정해야 함.

② : 함수호출할 때 void가 아니고 빈 칸으로 두어야 함.
③ : 반환값이 없는 함순는 호출문장을 수식의 일부로 쓸 수 없음

2. main 함수와 실행결과를 참고해 1부터 일정 수까지의 합을 구하는 sum 함수를 만들고 프로그램을 완성하세요.

#include <stdio.h>

int sum(int);

int main(void)
{
    sum(10);
    sum(100);
    
    return 0;
}

int sum(int a)
{
    int i = 0;
    int acc = 0;
    
    for (i = 0; i <= a; i++)
    {
        acc += i;
    }
    printf("1부터 %d까지의 합은 %d입니다.\n", a, acc);
}

3. 다음 프로그램의 실행결과를 적으세요.

더보기

답 : 9


어후 한번 더 봐야겠다

커버 이미지

'C' 카테고리의 다른 글

혼공C 6주차  (0) 2025.02.21
혼공C 5주차  (0) 2025.02.19
혼공C 3주차  (0) 2025.02.11
혼공C 2주차  (0) 2025.01.20
혼공C 1주차  (0) 2025.01.12