728x90
반응형
Chap 7 함수
1. 함수의 작성과 사용
- 함수란?
- 기능을 수행하는 코드 단위
- 표준 라이브러리 함수
- printf나 scanf 함수처럼 특정 기능을 미리 약속하고
프로그램에서 바로 사용할 수 있게 구현되어 있는 함수
- printf나 scanf 함수처럼 특정 기능을 미리 약속하고
- 함수를 만들 때 중요한 3가지
- 함수 정의: 함수를 실제 코드로 만드는 것으로 함수의 기능을 구현
- 함수 호출: 함수 호출을 해야지 함수를 사용할 수 있음
- 함수 선언: 프로그램 상단에서 어떤 함수를 사용할 것이라고 컴파일러에 정보를 주는 역할을 함
1) 함수 정의
- 함수를 만들기 전에 생각해야 할 3가지
- 함수의 기능에 맞는 이름
- 함수가 기능을 수행할 때 필요한 데이터
- 함수가 수행된 후의 결과
- 위의 3가지가 함수 원형(function prototype)을 이룬다.
7-1 // 2개의 함수로 만든 프로그램 |
- 함수명: 함수의 기능을 충분히 예상할 수 있도록 적절한 단어로 식별자 사용 규칙에 따라 만든다.
- 매개변수: 함수가 처리할 데이터를 저장하는 변수로 함수명 옆의 괄호 안에 선언한다.
이 때 매개변수의 자료형이 같아도 콤마로 구분해서 따로 선언한다. - 반환형: 함수가 기능을 수행한 후 호출한 곳으로 돌려줄 값의 자료형을 적는다.
즉, sum 함수는 두 정수의 합을 반환해야 하므로 자료형으로 int를 사용한다.
2) 함수 호출과 반환
(1) 함수 호출
- 함수를 호출할 때는 이름을 사용하고 함수에 필요한 데이터를 괄호 안에 넣어 주는데, 이를 인수(argument)라 함.
- 인수는 상수나 변수를 쓸 수 있고 수식을 사용하면 수식의 결괏값이 인수로 쓰인다.
- 함수를 호출할 때 이렇게 입력된 인수 a, b의 값은 호출된 함수의 매개변수(parameter)에 복사되어 사용됨.
- 이 때 인수는 함수의 매개변수에 순서대로 복사되어 sum 함수 안에서 사용됨
(2) 함수 반환
- 호출된 함수의 실행이 끝나고 값을 반환할 때 return문을 사용한다.
- sum 함수는 x와 y를 더하고 그 값을 temp에 저장한 뒤 함수의 실행을 끝내고
호출한 곳으로 돌아가기 위해 return문을 사용하며, 이때 temp의 값을 호출한 곳으로 반환한다. - 이후 main 함수는 반환된 값을 대입 연산으로 result에 저장하고
잠시 중단했던 함수의 나머지 부분을 실행한다.
3) 함수 선언
- 컴파일러가 새로 만든 함수를 인식할 수 있도록 알리는 역할을
- 선언 방법 :: 함수 원형에 세미콜론을 붙인다.
- 함수 선언은 main 함수 앞에 하며 다음처럼 매개변수 이름은 생략할 수 있음
- 함수 선언이 필요한 이유
- 함수 선언에서 반환값의 형태를 확인한다.
- 컴파일러는 컴파일할 때 호출한 자리에 반환값과 같은 형태의 저장 공간을 준비함
- 정수를 반환하면 호출한 자리에 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
반응형
'혼공 스터디 > 혼자 공부하는 C언어' 카테고리의 다른 글
[혼공C] 6주차 : 포인터 (1) | 2024.02.05 |
---|---|
[ 혼공C ] 5주차 : 배열 (0) | 2024.02.01 |
[ 혼공C ] 3주차 : 선택문, 반복문 (0) | 2024.01.17 |
[ 혼공C ] 2주차 : 변수와 연산자 (1) | 2024.01.13 |
[ 혼공C ] 1주차 공부 : C언어란? (2) | 2024.01.07 |