함수와 활용
함수의 개념 및 활용(사용자 정의 함수)
1. 함수
특수한 작업을 수행하기 위해 만들어진 코드 그룹
-
지금까지 배운 함수는?
- scanf(), printf(): 표준 입출력을 위한 내장 함수
- rand(): 랜덤수를 생성하기 위한 내장함수 등
2. 함수의 특징과 종류
-
특징
- 코드의 중복이 줄어든다
- 여러 번 재사용 가능하다
- 업무를 체계적으로 나누고 관리할 수 있다
-
종류
- 라이브러리 함수
- 사용자 정의 함수
3. 함수 표현
int add_int(int a){ // 반환 타입, 함수명, 매개변수
int sum = 0, i;
for (i = 1; i < = a; i++){
sum += i;
}
return sum; // 함수의 반환 값
}
- int
- 반환되는 값의 타입
- 반환값이 없으면
void
- add_int
- 함수 이름
- int a
- 매개변수
- 호출하는 곳에서의 자료형과 개수가 일치 해야함
- return sum
- 반환을 명하는 코드
- 상단의 int 와 자료형이 일치해야 함
- 반환값이 없으면 적지 않아도 됨(void)
4. 함수 호출
result = add_int(num);
^ 위 함수 표현을 실행하고 result 에 반환 값을 할당하게 됨
5. 함수의 원형
- 함수의 원형은 main 함수 시작 전 선언함
- 세미콜론으로 마침 (;)
- 함수에 값을 전달함
#include <stdio.h>
void draw_line(int num);
int main(){
int i = 0;
draw_line(i);
return 0;
}
void draw_line(int num){
... // 함수 실행 문
}
q: i와 num은 변수 이름이 왜 다르지?
- main 함수의 i값의 복사되어 num 변수에 대입
- i와 num은 서로 다른 변수이므로 이름이 달라도 됨
- 함수에 값을 전달할 때, 자료형과 복사되는 값의 개수는 일치해야 함
예제 풀이
#include <stdio.h>
#include <stdlib.h>
int get_val();
void comp(int i, int j);
int main(){
int i,j;
i = get_val();
printf("민수의 값: %d\n", i);
j = get_val();
printf("도원의 값: %d\n", j);
comp(i,j);
return 0;
}
int get_val(){
int i;
i = rand() % 2;
return i;
}
void comp(int i, int j){
if (i > j){
printf("민수가 이겼다\n");
} else if (j > i){
printf("성범이가 이겼다\n");
} else {
printf("똑같다..\n");
}
}
6. 함수 내 변수
-
함수 내에 여러 형태의 변수를 사용할 수 있음
-
auto
- 변수를 선언한 위치에서 자동 생성ㅎ마
- 블록을 벗어나면 자동 소멸
- 보통 생략됨
-
register
- CPU안의 register에 변수가 저장됨
- 매우 빠르게 처리됨
register int i;
-
static
- 정적 지역변수로서 블록을 벗어나도 소멸되지 않음
- 프로그램 종료 시 소멸됨
static int i;
#include <stdio.h>
void call_a();
int main(){
...
call_a();
call_a();
}
void call_a(){
int a = 0;
printf("a=%d\n", a);
a++;
}
위 값의 a 는 변하지 않는다. call_a 에서 선언한 a는 지역변수 call_a 함수가 종료되면, 자동 소멸
#include <stdio.h>
void call_a();
int main(){
...
call_a();
call_a();
}
void call_a(){
static int a = 0;
printf("a=%d\n", a);
a++;
}
a 값이 변한다
static을 사용해 a 변수 값을 함수 호출 종료 후에도 유지하도록 했음
#include <stdio.h>
#define PW 0000
int check(int pw);
int main(){
int pw, result = 0;
while(result != 1){
printf("password(length 4):");
scanf("%d", &pw);
result = check(pw);
}
return 0;
}
void check(int pw){
static int count = 0;
count++;
if(pw == PW){
printf("%d 번 시도 : success\n", count);
return 1;
} else{
printf("%d 번 시도 : fail, again\n", count);
return 0;
}
}
라이브러리 함수
컴파일러에서 제공하는 함수
사용자가 정의하지 않아도 사용이 가능함 헤더 파일 추가 필요함
-
대표적인 라이브러리 함수
- 표준 입출력 : scanf(), printf()
- 수학 연산 :
<math.h>
- 문자열 처리 :
<string.h>
- 시간처리 :
<time.h>
- 오류처리
- 데이터 검색 등
-
<ctype.h>
- isLower(a) : 저장된 문자가 소문자면 참, 아니면 거짓
- isupper(a) : 저장된 문자가 대문자면 참, 아니면 거짓
- isalpha(a) : 저장된 문자가 알파벳이면 참, 아니면 거짓
- isdigit(a) : 저장된 문자가 숫자이면 참, 아니면 거짓
-
<string.h>
- strlen(b) : 저장된 문자열의 길이를 반환
- strcmp(b1, b2) : 2개 인수에 저장된 문자열이 같으면 0, b1이 작으면 -1, b1이 크면 1을 반환
- strcmp(b1, b2) : 2개 인수에 저장된 문자열이 같으면 0, b1이 작으면 -1, b1이 크면 1을 반환