[ 혼공C ] 4주차 : 함수
본문 바로가기

혼공 스터디/혼자 공부하는 C언어

[ 혼공C ] 4주차 : 함수

728x90
반응형

Chap 7 함수

1. 함수의 작성과 사용

  • 함수란?
    • 기능을 수행하는 코드 단위
  • 표준 라이브러리 함수
    • printf나 scanf 함수처럼 특정 기능을 미리 약속하고
      프로그램에서 바로 사용할 수 있게 구현되어 있는 함수
  • 함수를 만들 때 중요한 3가지
    • 함수 정의: 함수를 실제 코드로 만드는 것으로 함수의 기능을 구현
    • 함수 호출: 함수 호출을 해야지 함수를 사용할 수 있음
    • 함수 선언: 프로그램 상단에서 어떤 함수를 사용할 것이라고 컴파일러에 정보를 주는 역할을 함

 

1) 함수 정의

  • 함수를 만들기 전에 생각해야 할 3가지
    • 함수의 기능에 맞는 이름
    • 함수가 기능을 수행할 때 필요한 데이터
    • 함수가 수행된 후의 결과
  • 위의 3가지가 함수 원형(function prototype)을 이룬다.

7-1 // 2개의 함수로 만든 프로그램
  1. 함수명: 함수의 기능을 충분히 예상할 수 있도록 적절한 단어로 식별자 사용 규칙에 따라 만든다.
  2. 매개변수: 함수가 처리할 데이터를 저장하는 변수로 함수명 옆의 괄호 안에 선언한다.
    이 때 매개변수의 자료형이 같아도 콤마로 구분해서 따로 선언한다.
  3. 반환형: 함수가 기능을 수행한 후 호출한 곳으로 돌려줄 값의 자료형을 적는다.
    즉, sum 함수는 두 정수의 합을 반환해야 하므로 자료형으로 int를 사용한다.

 

2) 함수 호출과 반환

(1) 함수 호출

  • 함수를 호출할 때는 이름을 사용하고 함수에 필요한 데이터를 괄호 안에 넣어 주는데, 이를 인수(argument)라 함.
  • 인수는 상수나 변수를 쓸 수 있고 수식을 사용하면 수식의 결괏값이 인수로 쓰인다.

    • 함수를 호출할 때 이렇게 입력된 인수 a, b의 값은 호출된 함수의 매개변수(parameter)에 복사되어 사용됨.
    • 이 때 인수는 함수의 매개변수에 순서대로 복사되어 sum 함수 안에서 사용됨

(2) 함수 반환

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

  • sum 함수는 x와 y를 더하고 그 값을 temp에 저장한 뒤 함수의 실행을 끝내고
    호출한 곳으로 돌아가기 위해 return문을 사용하며, 이때 temp의 값을 호출한 곳으로 반환한다.
  • 이후 main 함수는 반환된 값을 대입 연산으로 result에 저장하고
    잠시 중단했던 함수의 나머지 부분을 실행한다.

 

3) 함수 선언

  • 컴파일러가 새로 만든 함수를 인식할 수 있도록 알리는 역할을 

 

  • 선언 방법 :: 함수 원형에 세미콜론을 붙인다.
  • 함수 선언은 main 함수 앞에 하며 다음처럼 매개변수 이름은 생략할 수 있음

 

  • 함수 선언이 필요한 이유
    1. 함수 선언에서 반환값의 형태를 확인한다.
      • 컴파일러는 컴파일할 때 호출한 자리에 반환값과 같은 형태의 저장 공간을 준비함
      • 정수를 반환하면 호출한 자리에 int형 공간을 확보하고
      • 실수를 반환하면 double형 공간을 확보함
      • 함수를 호출하기 전에 선언을 통해 반환형을 미리 컴파일러에 알릴 필요가 있음
      • 그리고 프로그램은 항상 main 함수부터 시작함

 

[ 꿀팁 ] 함수 선언이 없으면 함수 정의는 항상 함수 호출 이전에 있어야 한다.

  • 필요한 함수를 main 함수 밑에 차례로 만들고 main 함수 앞에는 모든 함수를 선언해
    함수의 종류와 원형을 한눈에 파악하고 자유롭게 호출할 수 있도록 작성하는 것이 좋다.

 

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

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

 

2. 여러가지 함수 유형

  • 함수 원형은 반환형 함수명(매개변수)로 이루어진다.
  • 하지만 언제나 함수에 반환형과 매개변수가 있는 건 아니다.

1) 매개변수가 없는 함수

  • 함수의 매개변수 자리에 void를 사용한다.

7- 2 // 매개변수가 없는 함수

 

  • 괄호 안에 void를 넣어 매개변수가 없음을 표시
  • 괄호만 사용해도 매개변수가 없다는 사실을 표시할 수 있지만,
    void를 넣어 매개변수가 없음을 명시적으로 표현하는 것이 좋다.
  • get_num 함수는 매개변수가 필요 없지만, 키보드로 입력받은 값을 호출한 함수로 반환하므로
    반환형(int)은 있어야한다.

 

2) 반환값이 없는 함수

  • 함수는 기능에 따라 형태가 결정된다.
  • 데이터를 받아서 화면에 출력하는 함수라면 반환값이 필요가 없다.
// 7-3 반환값이 없는 함수
  • 문자와 숫자를 받아야 하므로 매개변수는 있지만 반환형은 void를 사용
  • 반환값이 없으므로 21행의 return문은 값 없이 단독으로 사용
  • 함수 실행 중간에 돌아가야 한다면 return문을 함수 어디서든 사용할 수 있음
  • 반환형이 void인 함수는 컴파일러가 반환값이 없다고 가정해 호출한 위치에 반환값을 저장할 공간을 준비하지 않는다.

 

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

  • 일정한 문자열을 여러 번 출력하는 함수라면 매개변수와 반환값이 모두 필요없음
  • 이때 함수의 매개변수와 반환형에 모두 void를 쓴다.
7-4 반환값과 매개변수가 모두 없는 함수

4) 재귀호출 함수

  • 자기 자신을 호출하는 함수
  • 메모리 부족으로 인해 무한정 반복되지는 않음
7-5 재귀호출 함수
7-6 세 번 실행되는 재귀호출 함수

5) 재귀호출과 반복문의 차이

7-7 세 번 실행되는 재귀호출 함수 1
  • 재귀호출은 하나의 함수에서 코드를 반복 실행하는 듯하지만, 실제로는 새로운 함수를 실행하는 것과 같다.
  • 재귀호출 함수는 경우에 따라 복잡한 반복문을 간단히 표현할 수 있으나
    코드가 쉽지 않고 반복 호출되면서 메모리를 사용하므로 제한적으로 쓰는 것이 좋다,
728x90
반응형