프로그래밍 언어/C

C언어와 프로그램의 이해

순정법사 2023.08.16
더보기

[목차]

 

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)로 변환되어야 실행할 수 있음

 

C언어에서 실행 파일을 생성하는 순서

 

1) 소스 파일(source file)의 작성

 

프로그래밍에서 가장 먼저 해야 할 작업은 바로 프로그램을 작성하는 것

원시 파일 / 소스 파일 : C언어를 사용하여 문법에 맞게 논리적으로 작성된 프로그램

소스 파일의 확장자는 .c 

 

2) 선행처리기(preprocessor)에 의한 선행처리

 

선행처리(preprocess) : 소스 파일 중에서 선행처리 문자(#)로 시작하는 선행처리 지시문의 처리 작업

선행처리 작업은 선행처리기(preprocessor)가 수행

선행처리기는 코드를 생성 ✖ 컴파일하기 전 컴파일러가 작업하기 좋도록 소스를 재구성해주는 역할만 함

 

 

[선행처리] 선행처리기, 매크로 함수, 미리 정의된 매크로

A. 선행처리기 1. 선행처리 a. 선행처리(preprocess)란? 🌟 실행 파일을 생성하는 과정에서 소스 파일 내에 존재하는 선행처리 지시문을 처리하는 작업 컴파일 하기 전 선행처리기(preprocessor)에 의해

monamu.tistory.com

 

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를 설치함

 

Code::Blocks

The IDE with all the features you need, having a consistent look, feel and operation across platforms.

www.codeblocks.org

 

💥 WARNING

 

잘못된 버전을 설치한건지 GCC를 찾을 수 없다고 떠서 빌드가 되지 않았다

 

Can't find file executable in your configured search path for gnc gcc compiler

My problem is that code::blocks error message tells me that it can't find file executable in the search path for gnc gcc compiler. Although, I don't know what that means. Also I typed out some ...

stackoverflow.com

 

여기서 해결법을 찾아 아래 주소에서 GCC를 따로 다운로드 받고

 

 

tdm-gcc

GCC compiler, Windows-friendly.

jmeubank.github.io

위 버전으로 다운로드 했다
64비트로 받기!

 

내가 원하는 경로에 설치해준 후 Codeblocks로 돌아와서

 

Settings -> Compiler 클릭후 나오는 창

 

위 Auto-detect를 누르면 알아서 GCC파일을 찾아줌! (해결)

 

Hello world!

 

 

 


출처 : http://www.tcpschool.com/c/intro
https://www.w3schools.com/c/index.php

 

C Tutorial

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com