02. C언어
1) C언어 기본
C언어 기본 구조 : 본문 전에 처리하는 전처리 부분과 본문으로 구성되어 있음, 헤더는 xxx.h파일로 되어있고 헤더 안에는 프로그래밍에 필요한 함수들이 포함되어 있음
전처리기(Preprocessor) : 실행 파일을 생성하는 과정에서 소스 파일내에 존재하는 전처리 지시문을 처리하는 작업
전처리기 종류
#include | C언어 프로그램에 헤더 파일을 포함할 때 사용하는 전처리기 |
#define | 매크로를 정의할 떄 사용하는 전처리기, 상수값을 지정하기 위한 예약어로 구문의 상수로 치환할 때 사용하는 전처리기 |
#include<stdio.h> //STanDard Input Output
#defineA 5 //A를 5로 바꿈
int main(){ //int : 반환타입, 정수형
printf("수제비%d",A); //""내부를 출력, A->5로 치환, %d에 대입 :: 수제비 5
return 0;
}
void main(){ //반환타입 없음 -> return 불필요
printf("수제비%d");
//return
}
2) 자료형
자료형(Data Type) : 프로그래밍 언어에서 실수값, 정수값과 같은 여러 종류의 데이터를 식별하는 형태, 메모리 공간을 효율적으로 사용하고 2진수 데이터를 다양한 형태로 사용하기 위해 존재
자료형 종류
문자(Character) | 문자 하나를 저장하고자 할 때 메모리에 저장은 숫자로 저장됨 |
char |
정수(Integer) | 정수값을 저장하고자 할 때 | int |
부동 소수점(Floting Point) | 소수점을 포함하는 실수값을 저장하고자 할 때 | float(4bite), double(8bite) |
3) 식별자
식별자 : 변수, 상수, 함수 등 서로 구분하기 위해 사용되는 이름
식별자 명명 규칙
구분 | 규칙 | 사용 가능 예시 | 사용 불가능 예시 |
사용 가능 문자 | 영문 대문자/소문자, 숫자, 밑줄(`_`) 사용 가능 | a, A, a1, _, _hello | ?a, <a |
변수 사용 규칙 | 첫 자리에는 숫자 사용 불가 | _1, a1, a100 | 1, 1a, 1A, 1234 |
변수 이름의 중간에는 공백 사용 불가 | my_student | my student | |
변수 의미 부여 | 이미 사용되고 있는 예약어의 경우 변수로 사용 불가 | For, If, While | int, short, long, for, while, do, continue, break, if, else |
식별자 표기법
카멜 표기법(Camel Case) | 첫단어 시작만 소문자, 각 단어의 첫글자는 대문자로 지정 | numCal |
파스칼 표기법(Pascal Case) | 각 단어의 첫글자는 대문자로 지정 | NumrCal |
스네이크 표기법(Snake Case) | 단어 사이에 언더바 사용 | num_cal |
헝가리안 표기법(Hungarian Case) | 두어에 자료형 추가, int=n, char=c, 문자열=sz | nNumCal |
4) 변수
변수(Variable) : 저장하고자 하는 값이 있을 때 그 값을 주기억장치에 기억하기 위한 공간
int a = 10; //변수: a
변수 선언
초기화하지 않는 경우 | 자료형 변수명; | int a; |
초기화하는 경우 | 자료형 변수명 = 초기값; | int a = 10; |
변수 유효범위
전역변수 (Global Variable) |
어떤 블록에도 속하지 않는 변수 프로그램이 시작시 변수 생성, 프로그램 종료시 변수 소멸 초기화하지 않으면 정수형은 0, 실수형은 0.0, 문자형은 NULL(아스키코드 0)로 초기화 변수는 어디서든 사용가능 |
지역변수 (Local Variable) |
블록 내에서 선언하는 변수 블록이 시작되는 부분에서 선언, 중괄호가 닫히는 시점에 소멸 해당 블록내에서만 사용 가능 |
static 변수 (Static Variable) |
블록 내외부 상관없이 선언가능한 변수 변수 선언시 static이라는 키워드를 붙임 블록 내외부 상관없이 프로그램 시작시 변수 생성, 종료시 변수 소멸 전역 변수로 선언시 프로그램 전체 사용가능, 블록내 선언시 블록내 선언 가능 |
#include<stdio.h>
int a=5; //전역변수
void fn(){ //3. 실행
a=a+3; //a=10+3=13
}
void main(){ //1. main함수 먼저 실행
a=a+5; //a=5+5=10;
fn(); //2. fn함수 호출
print("%d", a); //결과 a=13 출력
}
-----------------------
#include<stdio.h>
void main(){
int a=3, b=4; //블록변수
{
int a=5; //블록변수
printf("%d %d\n", a, b); //a=5, b=4
}
printf("%d %d\n", a, b); //a=3, b=4
}
------------------------
#include<stdio.h>
void fn(){
static int a=3; //static 변수
a=a+1; //a=3+1=4
printf("%d\n", a); //a=4 ←
}
void main(){
fn(); //a=4+1=5
fn(); //a=5+1=6
}
5) 표준 입출력 함수
이스케이프 문자
\n | new line | 커서를 다음줄 앞으로 이동(개행) |
\t | tab | 커서를 일정 간격만큼 수평 이동 |
printf("Hello");
printf("C World");
//출력 : HelloC World : 개행 문자가 없을 경우 일자 출력됨
포맷 스트링
printf(포맷_스트링이_포함된_문자열, 인자, ...);
%c | Character | 문자 1글자에 대한 형식 : 'A' |
%s | String | 문자가 여러개인 문자열에 대한 형식: "A" |
%u | Unsigned Decimal | 부호없는 10진수 정수 |
%d | Decimal | 10진수 정수 |
%o | Octal | 8진수 정수 |
%x, %X | Hexa(6) Decimal(10) | 16진수 정수 |
%e, %E | Exponent | 지수표기 1.24e+02 = 124(1.24X10²), 1.24E+02 구별 |
#include<stdio.h>
void main(){
int a=4, c=5;
char b='A';
printf("a는 %d, b는 %c입니다.", a, b); //a는 4, b는 A입니다.
printf("%d", a+c); //9
}
//a는 4, b는 A입니다.9
포맷 스트링을 이용한 변수 상세 출력
%[-][0][전체자리수].[소수점자리수]스트링 //[]생략가능
[-] | [-]를 붙이면 왼쪽 정렬 [-]를 붙이지 않고 [전체자리수]가 정해진 경우 오른쪽 정렬 |
[0] | [0]을 붙이면 전체 자리수에서 앞 빈공간만큼 0으로 채움 |
[전체자리수] | [전체자리수]만큼 공간 확보 소수점(.)도 한자리수로 포함됨 |
.[소수점자리수] | [소수점자리수]만큼 소수점이 출력됨 실수형일때만 적용됨 |
#include<stdio.h>
void main(){
float a=1.234;
int b=10;
printf("%.2f\n",a); //소수점 2자리 표현 : 1,23 ←
printf("%5.1f\n",a); //5자리에서 소수점 1자리 표현 : (우측정렬) 1.2 ←
printf("%05.1f\n",a); //5자리에서 소수점 1자리 표현, 나머지 0으로 채움 : 001.2 ←
printf("%-05.1f\n",a); //5자리에서 소수점 1자리 표현, 좌측정렬 : 1.2 ←
printf("%5d\n",b); //5자리 출력 : 10
printf("%05d\n",b); //5자리 출력, 나머지 0으로 채움 : 00010
printf("%-5d\n",b); //5자리 출력, 좌측정렬 : 10
printf("%-05d\n",b); //5자리 출력, 나머지 0으로 채움(좌정렬로 빈공간없음), 좌측정렬 : 10
}
표준 입력 함수
scanf(포맷_스트링이_포함된_문자열, 변수의_주소값, ...);
#include<stdio.h>
void main(){
int a;
char b;
scanf("%d %c", &a, &b); //%d: 10진수, %c:문자열, &:주소값
printf("a는 %d, b는 %c입니다.", a, b); //a는 5, b는 A입니다.
}
6) 연산자
연산자 : 프로그램 실행을 위해 연산을 표현하는 기호
증감연산자 > 산술연산자 > 시프트연산자 > 관계연산자 > 비트연산자 > 논리연산자 > 삼항연산자 > 대입연산자
증감 | 산술 | 시프트 | 관계 | 비트 | 논리 | 삼항 | 대입 |
++, -- | +, -, *, /, % | <<(우항수만큼 x2), >> (우항수만큼 /2) | >, <, >=, <=, ==, != 1: true 0 : flase |
&, |, ^(같으면 0, 다르면 1), ~ (not, 단항) |
&&, ||, ! (단항) |
조건 ? true : false | =, +=, -=, *=, /=, %= |
2진수 계산 | 2진수 계산 |
7) 조건문
if문 : 조건이 참인지 거짓인지에 따라 경로를 선택하는 명령문
if(조건문){
명령문;
}
else if(조건문){
명령문;
}
else{
명령문;
}
switch 문 : 조건에 따라 여러개의 선택 경로 중 하나를 취하고자 할 때 사용하는 명령어
switch(식){
case 값:
명령문;
break; //break문을 만날때까지 switch문 실행
default:
명령문;
}
8) 반복문
while문 : 조건이 참인 동안에 해당 분기를 반복해서 실행하는 명령문, 무한루프 주의
while(조건문){
명령문;
}
do while문 : 참, 거짓과 관련없이 무조건 한번은 실행, 그 후는 조건이 참인 동안 해당 분기를 반복해서 실행하는 명령문
do{
명령문;
}while(조건문);
for문 : 초기식, 조건식, 증감식을 지정하여 반복하는 명령어
for(초기식; 조건식; 증감식){
명령문;
}
//1. 초기식
//2. 조건식
//3. 명령문
//4. 증감식
//5. 조건식
//6. 명명문
//7. 증감식
//..
루프제어 명령어
break | 반복문을 중지하도록 하는 명령어 |
continue | 다음 반복으로 넘어갈 수 있도록 하는 명령어 |
9) 배열
배열 : 같은 타입의 변수들로 이루어진 집합
int a[3]={1,2}; //a : 데이터가 들어갈 공간, {1,2} : 배열값
//a[0] : 1
//a[1] : 2
//a[2] : 0
초기값이 없는 경우 | 타입 배열명[배열 수]; |
초기값이 있는 경우 | 타입 배열명[배열 수] = {초기값}; |
2차원 배열
int a[2][2]={1}; //a : 데이터가 들어갈 공간, {1,2} : 배열값
//a[0][0] : 1
//a[0][1] : 0
//a[1][0] : 0
//a[1][1] : 0
초기값이 없는 경우 | 타입 배열명[행의 개수], [열의 개수]; |
초기값이 있는 경우 | 타입 배열명[행의 개수], [열의 개수] = {초기값}; |
10) 문자열
1차원 배열과 문자열
- 문자열 초기화시 마지막에 NULL문자가 삽입되므로 초기화하는 글자수보다 1이상 큰값으로 배열을 선언
- 초기화시 배열의 크기를 명시하지 않으면 문자열의 문자수+1만큼 자동 생성
- printf 함수를 %s를 이용하여 문자열을 읽고 출력, printf 파라미터로 문자를 읽기 시작할 시작 주소를 알려주면 시작 주소부터 NULL직전 값까지 읽어서 출력
#include<stdio.h>
void main(){
char a[7] = "Hello"; //a[0]="H", a[1]="e", a[2]="l", a[3]="l", a[4]="o",
//a[5]=NULL, a[6]=NULL
printf("%s\n", a); //[]를 제외하면 포인터 -> 주소를 찾아감a[0] -> a : Hello ←
printf("%s\n", a+1); //a+1은 a[1]의 주소를 가리키는 포인터 -> a+1 : ello ←
a[4] = NULL; //a[0]="H", a[1]="e", a[2]="l", a[3]="l", a[4]=NULL,
//a[5]=NULL, a[6]=NULL
printf("%s\n", a+1); //a+1의 주소를 찾아감, NULL값을 가진 a[4]직전까지 출력 : ell
}
//& : 주소값을 가리킴
//&a[0] : a[0]의 주소값, ==a (6행의 a로 사용함(&, [0]생략))
//&a[1] : a[1]의 주소값, ==a (7행의 a+1로 사용함(&, [1]생략))
2차원 배열 : 문자열을 여러개 정의할 때 2차원 배열 사용
#include<stdio.h>
void main(){
char a[2][8] = {"Hello", "Soojebi"};
//&a[0][0] ="H" a[1][0]="S"
//&a[0][1] ="e" a[1][1]="o"
//&a[0][2] ="l" a[1][2]="o"
//&a[0][3] ="l" a[1][3]="j"
//&a[0][4] ="o" a[1][4]="e"
//&a[0][5] = NULL a[1][5]="b"
//&a[0][6] = NULL a[1][6]="i"
//&a[0][7] = NULL a[1][7]= NULL
//&a[0][8] = NULL a[1][8]= NULL
printf("%s\n", a[0]); //2차원배열은 []가 2개 있어야하는데 1개만 있으므로 주소값을 나타냄 == &a[0][0]
//a[0][0]부터 NULL직접값까지 : "Hello" ←
printf("%s\n", a[1]); //== &a[1][0]
//Soojebi ←
a[0][4] = NULL; //&a[0][4] ="o" -> NULL(= \0)
//&a[0][0] ="H" a[1][0]="S"
//&a[0][1] ="e" a[1][1]="o"
//&a[0][2] ="l" a[1][2]="o"
//&a[0][3] ="l" a[1][3]="j"
//&a[0][4] = NULL a[1][4]="e"
//&a[0][5] = NULL a[1][5]="b"
//&a[0][6] = NULL a[1][6]="i"
//&a[0][7] = NULL a[1][7]= NULL
//&a[0][8] = NULL a[1][8]= NULL
printf("%s\n", a[0]+2); //a[0][2]의 주소값 : &a[0][2]부터 NULL전까지 : "ll" ←
printf("%s\n", a[1]+3); //a[1][3]의 주소값 : &a[1][3]부터 NULL전까지 : "jebi" ←
}
11) 구조체
구조체 : 사용자가 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 자료형
struct 구조체명{ //정의
자료형 변수명1;
자료형 변수명2;
..
};
struct 구조체명 구조체변수; //선언
#include<stdio.h>
struct Student{
char gender;
int age;
}
void main(){
struct Student s = {'F', 21}; //구조체 student = s
//s.gender = 'F', s.age = 21
s.gender = "M"; //s.gender = 'M', s.age = 21
printf("%c", s.gender); //s.gender = 'M'
printf("%d", s.age); //s.age = 21
}
12) 함수
main 함수 : 프로그램이 실행하는 모든 프로그램의 시작점, main함수에 있는 명령어 실행
자료형 main(파라미터){
명령어;
}
void main | int main |
void main(){ ... return; } |
int main(){ ... return 0; } |
사용자 정의 함수 : 사용자가 직접 새로운 함수를 정의하여 사용하는 방법, 사용자 정의 함수에서 매개변수나 생성된 변수는 사용자 정의 함수가 종료되면 없어짐
자료형 함수명(자료형 변수명, ...){
명령어;
return 반환값;
}
매개변수 전달방법 : 함수가 필요로 하는 값을 매개변수로 만들면 함수를 호출하는 쪽에서 매개변수를 사용하여 해당 함수에게 변수의 값, 변수의 주소값을 전달하는 방식
구성요소 | 전달 인자 (Argument) |
실 매개변수(Actual Parameters)로도 불림 함수를 호출하는 쪽에서 전달하는 변수의 값 또는 변수의 주소값 |
매개 변수 (Parameter) |
형식 매개변수(Formal Parameters)로도 불림 함수를 호출하는 쪽에서 전달받는 변수의 값 또는 변수의 주소값 |
#include<stdio.h>
int fn(int x, int y){ //매개변수, parameter
...
}
void main(){
int i, j;
fn(i, j); //전달인자, argument
}
종류 | Call-by-Value | 변수의 값을 넘겨주고 이 값은 새로운 공간에 할당되어 사용하는 방식 형식 매개변수의 어떠한 변화도 실 매개변수에 아무런 영향을 미치지 않음 |
Call-by-Reference | 변수의 값이 아닌 변수가 사용중인 메모리 공간의 주소를 넘겨주는 방식 실 매개변수의 주소를 형식 매개변수로 보냄 |
//call by value
#include<stdio.h>
int fn(int x, int y){
...
}
void main(){
int i, j;
...
fn(i, j);
}
//call by reference
#include<stdio.h>
int fn(int*x, int*y){ //포인터
...
}
void main(){
int i, j;
...
fn(&i, &j); //&:변수의 주소
}
재귀함수(Recursive Function) : 함수 자신이 자신을 부르는 함수
자료형 함수명(자료형 변수명, ...){
...
함수명(변수명, ...)
...
return 반환값;
}
문자열 함수 #include<string.h>
strcat(string concatenate) 함수 : 문자열끼리 연결하는 함수
strcat(dest, src); | src의 문자열을 dest문자열 뒤에 붙임 |
strncat(dest, src, maxlen); | src의 문자열에서 maxlen의 개수만큼 dest 문자열 뒤에 붙임 |
strcpy(string copy) 함수 : 문자열을 복사하는 함수
strcpy(dest, src); | src의 문자열을 dest문자열에 복사 |
strncpy(dest, src, maxlen); | src의 문자열에서 maxlen의 개수만큼 dest문자열에 복사 |
strcmp(string compare) 함수 : 문자열을 비교하는 함수
strcmp(s1, s2); | s1, s2의 (아스키코드)대소 비교 |
strncmp(s1, s2, maxlen); | maxlen 길이만큼만 s1, s2의 대소 비교 |
strlen(string length) 함수 : 문자열의 길이를 알려주는 함수
strlen(s); | s의 길이를 알려줌 |
strrev(string reverse) 함수 : 문자열을 거꾸로 뒤집는 함수
strrev(str); | str내에 문자열을 거꾸로 뒤집음 |
strchr 함수 : 문자열 내에 일치하는 문자가 있는지 검사하는 함수
strchr(str, c); | str내에 c가 존재하는지 알려줌 |
sqrt 함수 : 양의 제곱근을 계산하는 함수
sqrt(n); | √n의 값을 계산 |
ceil 함수 : 소수점 올림 함수floor 함수 : 소수점 내림 함수
ceil(n); | n을 소수점 올림 |
floor(n); | n을 소수점 내림 |
rand 함수 : 임의의 값을 생성하는 함수
rand(); | 임의의 정수값 1개를 생성 |
srand 함수 : 난수 생성 알고리즘에 사용하는 seed를 정해주는 함수, srand를 사용하면 rand함수를 사용할 떄 해당 seed값에 해당하는 난수 패턴으로 생성
srand(seed); | seed의 값에 따라 난수 발생기를 초기화 |
time 함수 : 현재시간을 가져오는 함수, 1970년 1월 1일 이후로 몇초가 경과했는지 나타냄
time(NULL); | time함수에 파라미터를 NULL로 하면 현재 시간을 반환 |
atoi (ASCII to Integer) 함수 : 문자열을 정수형으로 변환하는 함수
atoi(str); | str을 정수형으로 반환 |
atof (ASCII to Floating Point) : 문자열을 실수형으로 변환하는 함수
atof(str); | str을 실수형으로 반환 |
itoa 함수 : 정수형을 문자열로 변환하는 함수
itoa(value, str, radix); | value를 변환하여 str에 radix 진수로 저장 |
13) 포인터
포인터 : 변수의 조소값을 저장하는 공간
자료형*포인터_변수명 = &변수명;
배열과 포인터
배열의 i번지 주소 | 배열명+i == &배열명[i] |
배열의 i번지 값 | *(배열명+i) == 배열명[i] |
1차원 배열과 1차원 포인터
- 1차원 배열에서 배열명만 단독으로 사용할 경우 1차원 포인터와 동일
- 1차원 배열일때 배열명[요소]형태 *(배열명+요소), 1차원 포인터일때 포인터[요소] 형태, *(포인터+요소)일 경우 값을 가리킴
2차원 배열과 1차원 포인터
- 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일
- 2차원 배열일때 배열명[요소]형태, *(배열명+요소)는 1차원 포인터와 동일하고 1차원 포인터에 대해 *과[]을 이용해야 값을 가리킬 수 있음
2차원 배열과 2차원 포인터
- 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일
- 2차원 배열일때 배열명[요소][요소], *배열명[요소], **(배열명+요소)일 경우 값을 가리킴
구조체와 포인터 : 구조체는 일반 구조체 변수로 접근할 때는 .로 접근하고 구조체 포인터로 접근할 때는 ->로 접근
1차원 구조체 배열과 1차원 구조체 포인터
- 1차원 구조체 배열에서 배열명만 단독으로 사용할 경우 1차원 구조체 포인터와 동일
- 1차원 구조체 배열일 때 배열명[요소], 변수명 형태, (*(배열명+요소)).변수명, 배열명->변수명 형태, (배열명+요소)->변수명 형태로 값을 가리킴
- 1차원 포인터일 때 포인터[요소], 변수명 형태, (*(초인터+요소)).변수명, 포인터->변수명 형태, (포인터+요소)->변수명 형태로 값을 가리킴
함수 포인터 : 함수의 주소를 저장하고 해당 주소의 함수를 호출하는데 사용하는 포인터
리턴타입(*함수_포인터)(함수 파라미터);
'정보처리기사 > [수제비] 정보처리기사 실기' 카테고리의 다른 글
VII. SQL 응용_03. 절차형 SQL 활용하기 (0) | 2023.03.20 |
---|---|
VII. SQL 응용_02. 응용 SQL 작성하기 (0) | 2023.03.20 |
VII. SQL 응용_01. 데이터베이스 기초 (0) | 2023.03.17 |
VI. 프로그래밍 언어활용_03. 자바 (0) | 2023.03.08 |
VI. 프로그래밍 언어활용_01. 기본 (0) | 2023.03.03 |