자주 쓰는 기능이 있다면 함수로 만들어 모듈화를 해야 한다. 이 것이 간결하고 유지보수가 쉬운 프로그램을 만들기 위한 가장 첫 번째 단계이다. 함수를 만든다는 것은 여러 명령들의 집합을 만들어 묶는 것과 같다. 수학에서의 함수를 생각하면 쉽다. 아래와 같이 함수에 인풋을 전달하면 정해놓은 지시대로 인풋의 데이터를 처리해 아웃풋을 낸다.
Input -----(함수 안에 프로그래머가 정의한 지시들) ----> Ouput
나중에 나아가서 프로그램을 짜는 것에 능숙해진다는 것은, 함수와 클래스를 어떻게 짤 것인지, 즉 아키텍쳐를 빨리 생각해내는 능력이라고 한다. 그 단계까지 최대한 빨리 갈 수 있도록 얼른 공부해야겠다!
주의할 것들
함수는 단 하나의 기능을 수행하도록 하는 것이 좋다.
함수를 호출하면 CPU 사용권이 호출당한 함수로 (피호출 함수)
피 호출 함수가 끝나면 CPU사용권이 다시 호출 함수로
Visual C 는 One-Pass Compiler 이기 때문에 소스코드를 한 번만 보고 컴파일을 끝낸다. 따라서 A가 B보다 먼저 나와야 B가 A를 호출할 수 있다. 단, 함수 원형을 먼저 선언하면 문제되지 않는다.
C언어는 대소문자에 민감(Case_Sensitive)
함수명이 너무 길면 코드를 짤 때 불편
함수의 원형 (생성)
함수의 원형을 선언하는 것은 '컴파일러에 이런 함수가 있으니 알아둬!' 라고 통보하는 것과 같다.
int square(int m);
int square_add(int, int);
위와 같이 함수의 원형을 선언한다. 정의하고 호출하는 법은 다음과 같다.
이제 용어들을 정의하자면, 형식인자는 함수를 정의할 때 인풋으로 어떤 형의 값이 들어가는 지 정한다. 매개변수는 인풋과 같으며, 함수를 호출 할 때 괄호 안에 들어가는 값을 실질인자라 한다.
함수의 생성과 리턴값
원형을 통보하지 않고도 바로 생성해버리는 방법이 있다. 그러나, main 함수 위에 존재해야 main함수가 돌아갈 때 오류가 나지 않게 된다. 예제를 보면 바로 이해가 갈 것이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//Adds two numbers after receiving them through the function
int add(int f, int s) {
int total;
total = f + s;
return total;
}
int main() {
int first, second, sum;
printf("Enter two input integers");
scanf("%d%d", &first, &second);
sum = add(first, second);
printf("The result is %d\n", sum);
system("pause");
return 0;
}
add 함수 마지막에 보면 return 이라는 단어(예약어이다)가 보일 것이다. 함수에서 어떤 아웃풋을 낼 지 결정하는 함수이다.
sum = add(first, second) 은 sum 이라는 변수에다가 함수에 first, second를 넣어서 나온 값을 대입하라는 뜻이다. 따라서 sum 의 형과 add 함수의 리턴값이 같아야 한다. 함수를 처음 선언할 때 다음과 같이 함수 앞에 int 를 붙인 이유는
int add( 생략 )
add 함수의 리턴값을 정하기 위해서이다.
주석을 사용한 정석적인 프로그래밍
다음과 같이 프로그램 단위, 함수 단위, 블록단위로 주석을 달아놔야 나중에 편하다.
함수와 헤더
헤더파일을 이용해 함수묶음 파일을 호출할 수 있다. 이는 이후에 다룰 것이다.
다음은 표준편차를 구하는 함수를 이용한 예제이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
/*표준편차를 구하는 프로그램
표준편차를 구하는 공식은 a, b, c 의 입력이 있을 때 avg 가 a, b, c의 평균이라 하면,
(avg - a)^2 + (avg - b)^2 + (avg - c)^2 이다
*/
//평균값 구하는 함수
double average(double a, double b, double c) {
int dAverageOutput;
dAverageOutput = (a + b + c) / 3;
return (dAverageOutput);
}
//표준편차 구하는 함수
double std_deviation(double a, double b, double c) {
double dAverageInput, dStdDeviationOutput;
//평균값 함수를 호출해 저장
dAverageInput = average(a, b, c);
//평균편차 공식
dStdDeviationOutput = (pow((dAverageInput - a), 2) + pow((dAverageInput - b), 2) + pow((dAverageInput - c), 2)) / 3.0;
return dStdDeviationOutput;
}
int main() {
double dInputA, dInputB, dInputC;
printf("Enter three real numbers\n");
//값 입력 double 형의 형식지정자는 %lf
scanf("%lf %lf %lf", &dInputA, &dInputB, &dInputC);
printf("The standard deviation is %lf\n", std_deviation(dInputA, dInputB, dInputC));
system("pause");
return 0;
}
원래 iOS프로그래밍과 같은 응용개발을 더 많이 하다 보니 C로 코드를 짤 때에는 타입 변환할 때 자꾸 실수해 첫 컴파일에서 쓰레기값이 나온다. 실수가 쉽게 고쳐지지 않는 걸 보니 아직 갈길이 멀다,,
** 여담이지만 헤더 파일과 .c 파일은 *lib, dll파일인 더 큰 단위로 묶인다. 나중에 새로 개발목적으로 산 하드웨어를 사용하고 싶으면 하드웨어 회사에서는 개발자를 위한 인터페이스도 제공하기 때문에 *lib, *dll 파일과 코드 예제를 담당자에게 받으면 된다.
'Algorithms > C, C++' 카테고리의 다른 글
C++ 자주 쓰이는 기능 요약 (0) | 2021.01.06 |
---|---|
Overflow / Underflow (0) | 2019.10.09 |
Type Casting (형변환) (0) | 2019.10.05 |
#문법 - 전처리기 (0) | 2019.08.19 |
#오류 - 쓰기용으로 열 수 없습니다 (0) | 2019.08.19 |