05. 함수
C언어와 함수
물 마시기 작업
컵을 가져온다 -> 컵에 정수기 물을 따른다 -> 컵에 담긴 물을 마신다
=>이 연속적인 행위들을 물 마시기 작업으로 묶어 정의해 놓은걸 함수라고 한다. =>정해진 단위 작업을 수행하도록 여러 개의 명령문들을 하나의 그룹으로 묶은 것을 함수라고 한다.
main 함수
- C언어는 main이라는 이름의 함수를 프로그램 시작 함수 라고 정했다. 즉 main함수는 ‘컴파일러에게 프로그램이 시작한다’고 알려주는 특별한 함수이다.
- 한 개의 프로그램에서 main함수는 반드시 한 개만 있어야 한다.
- 프로그램의 상태를 알려주기 위해 main함수의 반환값으로 int형을 사용한다. 다음 예시처럼 return 1;이라고 적어주면 프로그램이 정상적으로 작업을 끝내고 종료되었다는 것을 뜻한다.(함수의 반환값은 0, 1이 아니라 어떤 값을 사용해도 상관 없음. 다만 예시에서 사용한 1은 1이 참을 의미하므로 프로그램이 성공적으로 실행되었다는 것을 보여주기 위함이다.)
반환이 필요한 경우 : int형 사용
int main(){
return 1; //값 1을 반환함
}
C언어의 소스파일에는 꼭 하나 이상의 함수가 있다.
함수 정의하고 호출하기
함수 호출 과정
int Sum(int value1, int value2){
int result = value1 + alue2;
return result;
}
void main(){
int a = 2, b = 3;
int value = Sum(a, b);
}
- Sum(a, b) -> Sum(int value1, value2) : main함수가 Sum 함수를 호출하면서 a와 b의 값을 Sum함수에 전달합니다.
- Sum(a, b) -> Sum(int value1, value2) : Sum함수의 매개변수에 main 함수에서 전달 받은 값이 복사됩니다.
- Sum(int value1, value2) -> value1 + value2 : 입력된 값으로 더하기 작업을 수행합니다.
- return result -> Sum(a, b) : main함수로 결과 값을 반환합니다.
특별히 호출자로부터 넘겨받을 정보가 없다면 ()안을 비워두거나 ()안에 void라고 적어 인자가 없음을 명시하면 됩니다.
| 매개변수가 있는 함수 |
|---|
| Sum(int value1, int value2) |
| 매개변수가 없는 함수 | |
|---|---|
| Sum() | Sum(void) |
반환값이란?
-
함수에서 return이라는 예약어를 사용하면 함수는 그 위치에서 종결되며, return뒤에 명시단 result 변수 값이 Sum함수의 반환값이 됩니다.
-
모든 함수가 반환 값을 가지는 것은 아니며, 반환 할 값이 없으면 아래의 예시처럼 void를 명시하면 됩니다.(void 형식으로 정의한 함수의 return 뒤에 반환값을 적으면 오류)
/* o */
void ZeroData(int *p){
*p = 0;
}
/* x */
void Test(int value1, int value2){
int result = value1 + value2;
return result; //오류발생!!!
}
- return은 함수를 종결하는 역할도 한다.
void Test(int value1, int value2){ int a = 5; return; //Test 함수가 정상적으로 종료됨 a = a + 1; //오류는 아니지만 함수가 이미 종료되었기 때문에 실행되지 않음. }
함수 이름 짓는 방법
C언어의 예약어는 함수 이름으로 사용할 수 없다. 사용하면 오류로 처리된다. ex) void, return, char, int…
함수 원형 선언하기
컴파일러는 C언어 소스 코드를 기계어로 번역 할 때, 코드의 위쪽에서 아래쪽으로 내용을 읽으며 번역한다. 따라서 호출자가 피호출자보다 위에 놓이는 경우에 오류가 발생한다. 이런 경우 함수원형(Function Prototype)을 사용하여 해결한다.
int Sum(int value1, int value2); //함수 원형 선언
void main(){
int s = Sum(2, 3);
}
int Sum(int value1, int value2){
int result = value1 + value 2;
return result;
}
함수 원형을 선언 할 때 매개변수 이름을 생략할 수 있다. 하지만 어떤 의미의 변수가 전달되는지 짐작할 수 없기 때문에 생략하지 않는게 좋다.
int Sum(int, int);
- 함수를 정의한다 : 함수를 구현하는 행위
- 함수를 선언한다 : 함수의 원형을 선언
전처리기
- 같은 작업 경로(같은 폴더)에 헤더 파일이 있다면 -> #include “MyMath.h”
- 경로가 다르다면(같은 폴더 내에 없다면) 전체경로를 써줘야 한다. -> #include “C:\download\MyMath.h”
| #include <헤더 파일="" 이름="">헤더> | #include “헤더파일이름” |
|---|---|
| 비주얼 스튜디오에서 제공하는 헤더파일 포함 | 프로그래머가 정의해 사용하는 헤더 파일 포함 |
define 전처리기
상수나 명령문을 치환하는 문법이다.
ex) #define MAX_COUNT 3
ex) #define POW_VALUE(a) (a*a)
int data = POW_VALUE(3); //이렇게 명령을 치환해서 사용하는 것이 함수를 호출하는 것과 유사하기 때문에 POW_VALUE를 매크로함수라고 한다.
C 표준 라이브러리와 표준 출력 함수
단일 문자 출력 함수 putchar, putc (한글자 출력)
- putchar 함수에 ‘‘(작은따옴표)를 사용해 문자 상수로 지정하면, 컴파일러가 번역할 때 알아서 해당 문자의 아스키 값으로 변환해준다.
그리고 1바이트 기준 출력이기때문에 한글자에 2바이트인 한글은 출력할 수 없다. - putc는 여러가지 형식을 출력할 수 있는 함수인데, 두번째 매개변수에 표준출력을 의미하는 stdout값을 같이 써야 한다. 매번 stdout을 사용하려면 번거롭기 떄문에 좀 더 편하게 사용할 수 있도록 매크로함수인 putchar를 만들어 놓은것.
ex) putc(‘A’, stdout); - puts는 ““(큰따옴표)를 사용하여 문구 출력 가능.
ex) puts(“Hi~”);
printf 함수를 사용하는 방법
| 키워드 | %d | %f | %c | %s | %u | %o | %x | %% |
|---|---|---|---|---|---|---|---|---|
| 출력 형식 | 정수<10진수> | 실수 | 문자 | 문자열 | unsined 정수 <10진수> | 8진수 | 16진수 | % |
void main(){
char data = 65;
printf("%c 의 ASCII 값은 %d 입니다.", data, data);
//출력 -> A의 ASCII 값은 65 입니다.
}
실수와 정수는 숫자를 표현하는 방식이 다르다
void main(){
float value = 2.1f;
printf("%f", value);
//출력 -> 2.100000
}
- C언어는 기본적으로 double 자료형으로 처리한다. 따라서 float자료형으로 변수를 선언하면 경고가 발생하기 때문에 f를 같이 써줘야 한다.
- float < double
출력 문자열 정렬하기
voind main(){
int data = 7;
printf("[%d], [%5d], [%05d], [%-5d]", dat, data, data, data);
//출력 -> [7], [ 7], [00007], [7 ]
}
단, 출력할 때 .(마침표)도 출력 칸 수에 포함되기때문에 전체 자리수를 명시할 때 칸 수를 잘 계산해야 한다.
void main(){
double data = 3.141592;
printf("[%f], [%.4f], [%8.4f], [%08.4f]", data, data, data, data, data);
// 출력 -> [3.141592], [3.1416], [ 3.1416], [003.1416]
}
제어 코드 사용하기
| 제어코드 | 기능 |
|---|---|
| \n | 캐럿을 다음 줄로 이동(Line Feed). 개행 |
| \r | 캐럿을 해당 줄의 처음으로 이동(Carriage Return) |
| \t | 캐럿을 한 탭만큼 이동 |
| \b | 캐럿을 바로 앞 칸으로 이동 |
| \a | 시스템 스피커로 경고음 발생(모든 컴퓨터에서 이루어지는것이 아님) |
| " | 큰 따옴표 출력 |
| ' | 작은 따옴표 출력 |
07. 연산자
기본 연산자
대입 연산자
- x = 3 -> x에 3을 대입한다는 뜻. 같다는 뜻이 아님
산술 연산자
void main(){
int data1 = 5, data2 = 3;
int result1 = data1 + data2; //덧셈
int result2 = data1 * data2; //곱셈
int result3 = data1 / data2; //나눗셈(몫)
int result4 = data1 % data2; //나눗셈(나머지)
}
증감연산자
| 덧셈 연산자(이항 연산자) | 증가 연산자(단항 연산자) | 증감연산자 전위형 | 증감연산자 후위형 |
|---|---|---|---|
| int i = 5; i = i + 1; //i값에 1을 더하고 다시 i에 대입 |
int i = 5; i++; //i값을 1 증가시킴. i에 6이 대입됨 |
int i = 5 int sum = ++i; //자신의 값을 먼저 증가시켜 6을 만든 뒤 sum에 6을 대입함. i, sum 모두 6이 됨. |
int i = 5, sum; sum = i++; //i의 값 5를 sum에 먼저 대입하고 i를 증가시킴. i는 6이고 sum은 5가 됨. |
변수(i, a 등)에 증감되고 숫자는 안된다! ex) ++3 or 3++ 안됌.
관계 연산자
- 산술연산의 결과 값은 숫자로 나오지만, 관계 연산이나 논리연산의 결과 값은 진릿값(참, 거짓)으로 나온다.
- = 은 대입 연산자이고 ==은 관계 연산자이다.
- ex) A > B, A == B, A != B(A와 B가 같지 않으면 참) 등…
void main(){ int data1 = 5, data2 = 3; int result1 = data1 > 7; //거짓 int result2 = data2 != data1; //3은 5와 같지 않으니 참 /* 관계 연산의 결과 값은 0 또는 1이다 */ printf("%d, %d", result1, result2); // 결과 -> 0, 1 }
논리 연산자
| A | B | A && B (AND 논리곱) |
A ㅣㅣ B (OR 논리합) |
!A |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 |
void main(){
int data1 = 5, data2 = 3;
int result1 = 0 || 1;
int result2 = 3 && -1;
int result3 = data1 == 3 || data2 == 3;
int result4 = data1 == 3 && data2 == 3;
int result5 = !data1;
printf("%d, %d, %d, %d, %d, ", result1, result2, result3, result4, result5);
//결과 -> 1, 1, 1, 0, 0
//0이 아니면 다 참(1)으로 인지!!!!!!!!!
}
Comments