8.1 함수란?
함수
특정 작업을 수행하는 독립적인 프로그램의 기본 구성 요소
함수의 필요성
하나의 작업에 해당하는 코드를 함수로 작성하고 필요할 때 호출
함수의 특징
구별되는 이름
특정한 작업을 수행
입력을 받아 결과를 반환
함수의 장점
코드 중복 방지
함수 재사용 가능 체
계적 개발 및 용이한 유지보수
함수의 종류
라이브러리 함수
사용자 정의 함수
표준 라이브러리 함수
컴파일러에서 제공하는 함수
함수 원형이 들어 있는 헤더 파일 포함
8.2 함수 정의
반환형 함수명(매개변수) // 함수 헤더
{
// 함수 몸체
}
반환형
호출한 곳으로 반환하는 데이터 유형
함수 호출
함수 호출 시 프로그램 흐름
8.3 매개 변수와 반환값
인수와 매개변수
함수 호출될 시 인수는 함수의 매개변수로 전달
반환값
return 문을 이용하여 함수가 호출한 곳으로 결과값 반환
함수유형
인자(O), 반환(O)
int Add(int num1, int num2)
{
int result;
result = num1 + num2;
return result;
}
인자(O), 반환(X)
void ShowAddResult(int num)
{
printf("덧셈 결과는 ");
printf("다음과 같다.");
printf(" %d\n", num);
}
인자(X), 반환(O)
int ReadNum(void)
{
int num;
scanf("%d", &num);
return num;
}
인자(X), 반환(X)
void ShowThisProgram(void)
{
printf("아래 프로그램은 ");
printf("정수를 입력받아 ");
printf("덧셈을 수행한다.\n");
}
8.4 함수 원형
컴파일러에게 미리 함수에 대한 정보를 알리는 것
#include <stdio.h>
double c_to_f(double c_temp);
int main(void)
{
printf("섭씨 %lf도는 화씨 %lf입니다. \n", 36.0, c_to_f(36.0));
return 0;
}
double c_to_f(double c_temp)
{
return 9.0 / 5.0 * c_temp + 32;
}
함수 원형을 사용하지 않는 경우
함수 정의가 함수 호출보다 먼저 오는 경우
함수 원형이 불가피한 경우
두 함수가 서로 호출하는 경우
8.5 라이브러리 함수(난수)
난수 함수
난수는 규칙성 없이 임의로 생성되는 수로 암호학, 모의실험, 게임 등에 사용
rand()
의사 난수(pseudo random number)를 생성하는 함수
0과 RAND_MAX(32,767) 사이의 난수를 생성하는 함수로 <stdlib.h> 포함
a과 b 사이의 난수 생성: a + (rand() % b)
실행할 때마다 항상 똑같은 난수가 발생
srand()
시드값을 다르게 하여 매번 다르게 난수 생성
time()는 1970년 1월 1일부터 현재까지 경과된 시간을 초단위로 반환하는 함수로 <time.h> 포함
8.6 라이브러리 함수(수학 함수)
수학 함수
<math.h>
floor()와 ceil() 함수
floor(): 바닥함수
ceil(): 천장함수
fabs() 함수
실수를 받아서 절대값으로 반환
pow()와 sqrt() 함수
pow(): 제곱값을 계산
sqrt(): 값의 제곱근을 반환
cos(double x), sin(double x), tan(double x)
삼각 함수의 값을 계산
기타 함수
exit(int status):exit()을 호출하면 호출 프로세스를 종료시킴
int system(const char *command): system()은 문자열 인수를 운영체제의 명령어 셀에 전달하여 실행시키는 함수
8.7 함수를 사용하는 이유
- 소스 코드의 중복성을 없애준다.
- 한번 제작된 함수는 다른 프로그램을 제작할 때도 사용이 가능하다.
- 복잡한 문제를 단순한 부분으로 분해할 수 있다. (모듈(module)의 개념)
Advanced Topic
모듈이란?
복잡하고 큰 자동차가 작은 부품들로 분리되는 것처럼, 소프트웨어에서는 이 작은 조각을 모듈(module)이라고 함.
언어에 따라서 함수, 프로시저, 메소드 등으로 다르게 불림
모듈화
프로그램을 모듈로 구성하는 방법
좋은 모듈화와 나쁜 모듈화
- 좋은 모듈화
모듈 내에서는 최대의 상호 작용, 모듈 사이에는 최소의 상호 작용이 존재해야 함
모듈 내부에서는 최대의 연관성, 모듈과 모듈 사이에서는 최소의 연관성을 가짐 (모듈 내부의 응집도와 모듈 사이의 결합도)
더 이해하기 쉬움, 유지 보수나 확장, 업그레이드하기가 쉬워짐 - 나쁜 모듈화
모듈 사이의 복잡한 연결
모듈을 작성하는 방법
- 전혀 관련이 없는 문장들을 모아서 모듈을 작성 (X)
- 시간적이나 절차적으로 연관된 문장들을 모아서 모듈을 작성 (O)
ex) 초기화를 담당하는 init()와 같은 함수
이러한 모듈은 꼭 필요한 경우가 있지만, 재사용이 어려움 - 하나의 작업을 담당하는 문장들을 모아서 모듈을 작성 (O, Best)
ex) printf(), write_to_printer(), sqrt()와 같은 모듈
왜 기능적인 응집력을 가지는 모듈이 좋은가?
- 하나의 모듈 안에서 복잡한 작업을 하는 것보다는 한 가지 작업만을 수행하는 것이 오류를 줄일 수 있다.
- 하나의 기능을 수행하도록 설계되고 잘 테스트된 모듈들만 잇으면 소프트웨어를 쉽게 작성할 수 있다.
모듈들은 재사용될 수 있어서 차기 프로그램의 개발을 빠르게 한다.
ex) printf() 함수 - 하나의 분리된 작업을 하나의 모듈이 담당함으로써 유지 보수성을 높일 수 있다.
예를 들면 만약 프린터로 출력하는 부분에서 오류가 발생하였다면 write_to_printer()만 검사하면 된다.
모듈을 변경할 때도 모듈과 모듈이 기능적으로 분리되어 있다면 다른 모듈에 미치는 영향이 상대적으로 적다.
소프트웨어 공학에서 이야기하는 가장 좋은 모듈은 정보적 응집력을 가지는 것이라고 이야기한다.
정보적 응집력
하나의 데이터를 공유하는 많은 작업들을 모듈 안에 하나로 묶은 것
이것은 객체 지향에서 이야기하는 객체의 개념이 됨
'잠든 카테고리 > 쉽게 풀어쓴 C언어 Express' 카테고리의 다른 글
10-10.1(배열이란?)~10.6(2차원 배열) (0) | 2022.06.10 |
---|---|
09-9.1(변수의 속성)~9.8(순환 호출)+Advanced Topic (0) | 2022.06.10 |
07-7.1(반복의 개념)~7.7(break와 continue) (0) | 2022.04.28 |
06-6.1(제어문)~6.6(goto 문) (0) | 2022.04.28 |
05-5.1(수식과 연산자)~5.9(연산자의 우선 순위와 결합 규칙) (0) | 2022.04.28 |