[목차]
A. C언어 개요
B. 프로그래밍 언어와 프로그래밍
C. C 프로그램 개요
A. C언어 개요
1. C언어 기초
a. C언어란?
🌟 절차 지향 프로그래밍 언어(procedure-oriented programming language)
저급언어 + 고급언어의 특징을 가짐
현재 사용되고 있는 거의 모든 컴퓨터 시스템에서 사용할 수 있는 프로그래밍 언어이다
🧡 C와 C++의 차이점
C++은 C의 확장
가장 큰 차이점 : C++ : 클래스 지원 / C : 미지원
b. 사용하는 곳
현재 널리 사용되는 주요 운영체제의 커널은 대부분 C언어를 이용해 구현
시스템 프로그래밍에 가장 잘 어울리지만, 응용 프로그래밍에도 많이 사용되는 프로그래밍 언어
c. C언어의 역사
1972년 벨 연구소의 켄 톰프슨(Kenneth Thompson)과 데니스 리치(Dennis Ritchie)가
유닉스(UNIX) 운영체제에서 사용하기 위해서 개발한 범용적인 고급 언어
1) A언어라고 불리는 ALGOL 60부터, CPL, BCPL을 거쳐, 켄 톰프슨이 B언어를 개발
2) 이후 데니스 리치가 B언어를 좀 더 개선하여 C언어를 개발
(C언어라는 이름의 유래 또한 B언어 바로 다음에 개발되어서 명명된 이름)
💙 C언어의 탄생 배경
유닉스 운영체제 → 어셈블리어 사용
어셈블리어는 특정 하드웨어에 종속 → 프로그램 (by 어셈블리어) 다른 하드웨어로 이식 X
= 하나의 프로그램을 CPU의 종류만큼 여러 번 작성해야함
따라서 이식성 👍 어셈블리어보다 쉬운 언어 👍 로 개발된 언어가 바로 C언어
d. C언어 표준
1989년부터 ANSI(American National Standards Institute)에서 표준화 작업을 진행했지만
현재는 ISO/IEC(International Organization for Standardization / International Electrotechnical Commission)에서 표준화를 담당
C언어의 최신 표준은 ISO/IEC 9899:2011, 줄여서 C11
e. C언어의 특징
👍 장점
1) 다양한 하드웨어로의 이식성 👍
2) 절차 지향 프로그래밍 언어, 코드가 복잡하지 않아 상대적으로 유지보수가 👍
3) 저급 언어의 특징 가져, 어셈블리어 수준으로 하드웨어를 제어 🛑
4) 코드가 간결해 완성된 프로그램의 크기가 ⬇ 실행 속도가 ⬆
👎 단점
1) 고급 언어보다 배우기가 👎
2) 시스템 자원을 직접 제어, 프로그래밍하는데 세심한 주의
B. 프로그래밍 언어와 프로그래밍
1. 프로그래밍 언어
a. 프로그래밍 언어란?
🌟 컴퓨터의 시스템을 구동시키는 소프트웨어를 작성하기 위한 언어
b. 프로그래밍 언어의 종류
1) 저급 언어(low-level language) : 기계가 이해하기 쉬운언어
기계어(machine language)와 어셈블리어(assembly language) 등
- 실행 속도가 매우 빠름
- 배우기에 매우 어려워 프로그램의 유지보수가 힘들다
2) 고급 언어(high-level language) : 사람이 이해하기 쉬운 언어
자바, 파이썬 등
- 컴파일러나 인터프리터에 의해 기계가 이해 할 수 있는 언어로 번역되어 실행
- 저급 언어보다는 상대적으로 실행 속도가 느림
- 가독성이 높고 유지보수가 쉽다
2. 프로그래밍
a. 프로그래밍이란?
🌟 프로그래밍 언어를 사용하여 목적에 맞는 알고리즘으로부터 구체적인 프로그램을 작성하는 과정
b. 프로그래밍 실행 과정
프로그램은 먼저 실행 파일(executable file)로 변환되어야 실행할 수 있음
1) 소스 파일(source file)의 작성
프로그래밍에서 가장 먼저 해야 할 작업은 바로 프로그램을 작성하는 것
원시 파일 / 소스 파일 : C언어를 사용하여 문법에 맞게 논리적으로 작성된 프로그램
소스 파일의 확장자는 .c
2) 선행처리기(preprocessor)에 의한 선행처리
선행처리(preprocess) : 소스 파일 중에서 선행처리 문자(#)로 시작하는 선행처리 지시문의 처리 작업
선행처리 작업은 선행처리기(preprocessor)가 수행
선행처리기는 코드를 생성 ✖ 컴파일하기 전 컴파일러가 작업하기 좋도록 소스를 재구성해주는 역할만 함
3) 컴파일러(compiler)에 의한 컴파일
컴파일(compile): 컴파일러에 의해 소스 파일(C언어)을 컴퓨터가 알아볼 수 있는 기계어(0, 1)로 변환하는 것
오브젝트 파일(object file) : 컴파일이 끝나 기계어로 변환된 파일
오브젝트 파일의 확장자 .o / .obj
4) 링커(linker)에 의한 링크
링크(link) : 오브젝트 파일에 없는 시동코드 (운영체제와의 인터페이스를 담당) 와 C 표준 라이브러리 파일 (대부분의 C 프로그램에서 사용) 을 추가하는 것. 즉,
오브젝트 파일(들) ➕ 라이브러리 파일 ➕ 시동 코드 = 하나의 새로운 실행 파일이나 라이브러리 파일
링크는 링커(linker)에 의해 수행
5) 실행 파일(executable file)의 생성
위 과정들로 소스 파일 ➡ 실행 파일로 변환
최근 사용되는 개발 툴 (선행처리기, 컴파일러, 링커를 모두 내장) 👉 소스 파일에서 한 번에 실행 파일을 생성
실행 파일의 확장자 .exe
분할 컴파일 : 여러 개의 소스 파일을 작성하여 최종적으로 링크를 통해 하나의 실행 파일로 만드는 것
C. C 프로그램 개요
1. C 프로그램의 구조
a. 기본 구조
📘 문법
#include 문
#define 문
int main(void)
{
명령문;
...
return 문;
}
🤓 예제
#include <stdio.h>
#define TEXT "Welcome to C Programming!!"
int main()
{
printf(TEXT); //결과 : Welcome to C Programming!!
return 0;
}
2. C 프로그램의 특징
a. 기본 단위 : 함수
C 프로그램은 하나 또는 그 이상의 함수(function)로 이루어짐
C언어로 구현되는 모든 프로그램은 반드시 main() 함수를 가지고 있어야 함
(제일 먼저 main() 함수를 찾아서 호출하기 때문)
🤓 예제
#include <stdio.h>
#define TEXT "Welcome to C Programming!!"
int main()
{
return 0; // main() 함수의 모든 명령문을 수행한 후에는 0을 반환함.
}
b. 함수 내의 각 명령문은 세미콜론(;)으로 끝나야 함
명령문(statement) : 함수의 기능을 정의하기 위해 사용되는 문장
위에서부터 아래로 순차적으로 실행
언제나 세미콜론(;)으로 끝난다
🤓 예제
printf("C언어"); // 정상적으로 출력됨.
printf("C언어") // 오류가 발생함.
c. 대소문자 구분
변수나 함수의 이름을 작성할 때, 키워드나 예약어 등을 사용할 때 ➡ 대소문자 구분
🤓 예제
printf("C언어"); // 정상적으로 출력됨.
Printf("C언어") // 오류가 발생함.
d. 자유 형식(free-format)을 허용
문법만 맞으면 여러 개의 명령문을 한 줄에 쓸 수도 있고, 하나의 명령문을 여러 줄에 나누어 쓸 수도 있음
아래 두개는 같은 행동을 하지만 코드의 가독성을 위해 두 번째 예제처럼 코드를 작성 해야함
🤓 예제
int func() { printf("C언어는 재밌어요!"); }
=
int func()
{
printf("C언어는 재밌어요!");
}
3. C 프로그램의 기초
a. 주석(comments)
🌟 코드에 대한 이해를 돕는 설명을 적거나 디버깅을 위해 작성
C언어 주석의 장점은 프로그램 내의 어디에나 올 수 있다
- 한 줄 주석 : //
- 여러 줄 주석 : /* ~ */
여러 줄 주석은 한 줄 주석을 포함하지만, 여러 줄 주석을 포함하진 못함
📘 문법
// 한 줄 주석
/* 여러
줄
주석 */
b. printf()
🌟 C언어 표준 입출력 함수
입출력 함수 or I/O 함수 : 사용자가 프로그램과 대화하기 위해 사용하는 함수
printf() 함수와 scanf() 함수는 장 많이 사용되는 대표적인 입출력 함수
f는 formatted의 약자이며, 서식화된 출력을 지원한다는 의미
여러 종류의 데이터(data)를 다양한 서식에 맞춰 출력할 수 있게 함
출력이 끝난 후 새로운 줄로 시작하지 않음 (하려면 \n 삽입)
📘 문법
#include <stdio.h>
int printf(const char * restrict format, ...);
출력할 데이터를 어떤 서식에 맞춰 출력할지 서식 지정자(format specifier)를 통해 직접 지정
🤓 예제
printf("printf() 함수는 서식 지정자를 통해 출력할 데이터의 서식을 지정할 수 있어요!\n");
printf("변수에 저장된 숫자는 %d입니다.", 10);
✨ 실행결과
printf() 함수는 서식 지정자를 통해 출력할 데이터의 서식을 지정할 수 있어요!
변수에 저장된 숫자는 10입니다.
📝 예제 설명
- 줄 바꿈은 '\n'라는 이스케이프 시퀀스를 사용하여 표현
- int형 데이터를 나타내기 위해서 '%d'라는 서식 지정자를 사용
c. 이스케이프 시퀀스(escape sequence)
🌟 프로그램의 결과가 화면에 출력될 때 사용하게 될 특수한 문자를 위해 만들어짐
\' | 작은따옴표 |
\" | 큰따옴표 |
\? | 물음표 |
\\ | 백슬래시(\) |
\a | 경고음 발생 |
\b | 백스페이스(backspace) |
\n | 줄 바꿈(new line) |
\r | 캐리지 리턴(carriage return) |
\t | 수평 탭(tab) |
\v | 수직 탭(tab) (프린터로 출력할 때에만) |
\f | 폼 피드(form feed) (프린터로 출력할 때에만) |
🤓 예제
printf("C언어에서 사용하는 \"특수 문자\"에는 여러가지가 있습니다.\n");
printf("\t특수 문자의 바로 앞에는 언제나 \\가 와야 합니다.");
✨ 실행결과
C언어에서 사용하는 "특수 문자"에는 여러가지가 있습니다.
특수 문자의 바로 앞에는 언제나 \가 와야 합니다.
d. 서식 지정자 (format specifier)
printf() 함수 : 서식 지정자를 통해 출력할 데이터의 서식을 사용자가 직접 지정
%c | 하나의 문자 |
%s | 문자열 |
%d | 부호 있는 10진 정수 |
%i | 부호 있는 10진 정수 (%d와 동일) |
%f | 고정 소수점으로 표현한 실수 (소수점 이하 6자리까지 표현) |
%o | 부호 없는 8진 정수 |
%u | 부호 없는 10진 정수 |
%x | 부호 없는 16진 정수 (소문자 사용) |
%X | 부호 없는 16진 정수 (대문자 사용) |
%e | 부동 소수점으로 표현한 실수 (e-표기법) |
%E | 부동 소수점으로 표현한 실수 (E-표기법) |
%g | 값에 따라 %f나 %e를 사용함. |
%G | 값에 따라 %f나 %E를 사용함. |
%% | 퍼센트(%) 기호 출력 |
🤓 예제
printf("%%c를 사용한 결과 : %c\n", 'a'); // 문자
printf("%%s를 사용한 결과 : %s\n", "즐거운 C언어"); // 문자열
printf("%%f를 사용한 결과 : %f\n", 0.123456);
printf("%%f를 사용한 결과 : %f\n", 0.123456789); // 소수점 6자리까지만 표현
printf("%%o를 사용한 결과 : %o\n", 123); // 8진 정수
printf("%%x를 사용한 결과 : %x\n", 123); // 16진 정수
printf("%%g를 사용한 결과 : %g\n", 0.001234); // 값에 따라 %f나 %e
printf("%%g를 사용한 결과 : %g\n", 0.00001234); // 값에 따라 %f나 %e
printf("%%G를 사용한 결과 : %G\n", 0.000001234); // 값에 따라 %f나 %E
✨ 실행결과
%c를 사용한 결과 : a
%s를 사용한 결과 : 즐거운 C언어
%f를 사용한 결과 : 0.123456
%f를 사용한 결과 : 0.123457
%o를 사용한 결과 : 173
%x를 사용한 결과 : 7b
%g를 사용한 결과 : 0.001234
%g를 사용한 결과 : 1.234e-05
%G를 사용한 결과 : 1.234E-06
💙 서식 지정자의 동시 사용
서식 지정자의 순서와 타입은 출력할 데이터의 순서와 타입과 반드시 일치해야 함
🤓 예제
printf("저장된 정수는 %d이며, 저장된 문자열은 %s입니다.\n", 123, "C언어");
✨ 실행결과
저장된 정수는 123이며, 저장된 문자열은 C언어입니다.
👉 출력 필드의 폭 설정
서식 지정자의 '%'기호와 타입을 나타내는 영문자 사이에 숫자를 추가하여 출력되는 필드의 폭을 직접 설정
- 내부의 숫자는 오른쪽 정렬이 기본 (숫자 앞에 '-'기호를 붙이면 왼쪽 정렬)
- 숫자 앞에 '+'기호를 붙이면 숫자를 오른쪽 정렬한 상태에서 양수에는 '+'기호를, 음수에는 '-'기호를 붙여서 출력
- 이때 소수 부분의 숫자는 출력되는 소수의 자릿수를 명시
🤓 예제
printf(" %%d를 사용한 결과 : |%d|\n", 123);
printf(" %%7d를 사용한 결과 : |%7d|\n", 123);
printf(" %%+7d를 사용한 결과 : |%+7d|\n", 123);
printf(" %%-7d를 사용한 결과 : |%-7d|\n\n", 123);
printf(" %%f를 사용한 결과 : |%f|\n", 1.23);
printf(" %%.1f를 사용한 결과 : |%.1f|\n", 1.23);
printf(" %%7.2f를 사용한 결과 : |%7.2f|\n", 1.23);
printf("%%+7.2f를 사용한 결과 : |%+7.2f|\n", 1.23);
printf("%%-7.2f를 사용한 결과 : |%-7.2f|\n\n", 1.23);
✨ 실행결과
%d를 사용한 결과 : |123|
%7d를 사용한 결과 : | 123|
%+7d를 사용한 결과 : | +123|
%-7d를 사용한 결과 : |123 |
%f를 사용한 결과 : |1.230000|
%.1f를 사용한 결과 : |1.2|
%7.2f를 사용한 결과 : | 1.23|
%+7.2f를 사용한 결과 : | +1.23|
%-7.2f를 사용한 결과 : |1.23 |
c. scanf() 함수
printf()의 설명과 동일함
📘 문법
#include <stdio.h>
int scanf(const char * restrict format, ...);
입력받은 데이터를 어떤 서식으로 변환할지 서식 지정자(format specifier)를 통해 직접 지정
🤓 예제 :
#include <stdio.h>
int main(void)
{
int num01, num02;
printf("첫 번째 정수를 입력하세요 : ");
scanf("%d", &num01);
printf("두 번째 정수를 입력하세요 : ");
scanf("%d", &num02);
printf("입력하신 두 정수의 합은 %d입니다.\n", num01 + num02);
return 0;
}
📝 예제 설명
- 주소 연산자(&) : 입력받은 데이터를 뒤에 나오는 변수에 저장하라는 의미
- 변수 : 데이터를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간
✨ 실행결과
첫 번째 정수를 입력하세요 : 10
두 번째 정수를 입력하세요 : 20
입력하신 두 정수의 합은 30입니다.
👉 서식 지정자의 동시 사용
서식 지정자의 순서와 타입은 출력할 데이터의 순서와 타입과 반드시 일치해야 함
입력받는 데이터의 구분은 공백(줄 바꿈, 탭, 띄어쓰기 등)을 기준
🤓 예제 : 두 개의 정수를 한 번에 입력받아, 각각 8진수와 16진수로 출력하기
#include <stdio.h>
int main(void)
{
int num01, num02;
printf("두 개의 정수를 입력하세요 : ");
scanf("%d %d", &num01, &num02);
printf("입력하신 두 정수를 8진수로 나타내면 %o와 %o가 되고,\n", num01, num02);
printf("입력하신 두 정수를 16진수로 나타내면 %x와 %x가 됩니다.\n", num01, num02);
return 0;
}
✨ 실행결과
두 개의 정수를 입력하세요 : 10 20
입력하신 두 정수를 8진수로 나타내면 12와 24가 되고,
입력하신 두 정수를 16진수로 나타내면 a와 14가 됩니다.
👉 double형 실수의 입력
float형 실수를 입력받을 때는 서식 지정자로 '%f'를 사용
double형 실수를 입력받을 때는 '%lf' 서식 지정자를 사용
🤓 예제 : 두 개의 실수를 한 번에 입력받아 출력하는 예제
#include <stdio.h>
int main(void)
{
float num01;
double num02;
printf("두 개의 실수를 입력하세요 : ");
scanf("%f %f", &num01, &num02);
printf("입력하신 두 실수는 %f와 %f입니다.\n", num01, num02);
printf("입력받은 두 실수 중 두 번째 double형 변수에는 전혀 다른 값이 저장되었습니다.\n\n");
printf("다시 한 번 두 개의 실수를 입력하세요 : ");
scanf("%f %lf", &num01, &num02);
printf("입력하신 두 실수는 %f와 %f입니다.\n", num01, num02);
printf("이번에는 두 실수 모두 제대로 저장되었습니다.\n");
return 0;
}
✨ 실행결과
두 개의 실수를 입력하세요 : 1.2 3.4
입력하신 두 실수는 1.200000와 0.000000입니다.
입력받은 두 실수 중 두 번째 double형 변수에는 전혀 다른 값이 저장되었습니다.
다시 한 번 두 개의 실수를 입력하세요 : 1.2 3.4
입력하신 두 실수는 1.200000와 3.400000입니다.
이번에는 두 실수 모두 제대로 저장되었습니다.
📝 예제 설명
- float 👉 float 👍
- double 👉 float 💢
4. IDE 설치하기
C 코드를 작성하기 위한 텍스트 편집기와, c코드를 컴퓨터가 이해할 수 있는 언어로 변환하는 GCC와 같은 컴파일러를 설치하기 위해 IDE(통합개발환경)을 설치해야 함
W3School에서는 Code::Blocks를 사용함에 최신버전의 IDE를 설치함
💥 WARNING
잘못된 버전을 설치한건지 GCC를 찾을 수 없다고 떠서 빌드가 되지 않았다
여기서 해결법을 찾아 아래 주소에서 GCC를 따로 다운로드 받고
내가 원하는 경로에 설치해준 후 Codeblocks로 돌아와서
위 Auto-detect를 누르면 알아서 GCC파일을 찾아줌! (해결)
출처 : http://www.tcpschool.com/c/intro
https://www.w3schools.com/c/index.php
'프로그래밍 언어 > C' 카테고리의 다른 글
C 연산자 총정리 -2 (비교, 논리, 비트, 기타 등) (0) | 2023.08.16 |
---|---|
C 연산자 총정리 -1 (산술, 대입, 증감) (0) | 2023.08.16 |
[자료형(data type)] 기본형 총정리 (0) | 2023.08.16 |
C 상수 총정리 (0) | 2023.08.16 |
C(++) 변수 총정리 (0) | 2023.08.16 |