★ C언어를 알아보기 전 기본 개념

1) 프로그래밍 언어

프로그래밍 언어는 컴퓨터의 시스템을 구동시키는 소프트웨어를 작성하기 위한 언어를 의미하며 크게 저급 언어(low-level language)와 고급 언어(high-level language)로 나뉜다.
저급, 고급 언어는 기계가 이해하기 쉬운가(저급 언어), 사람이 이해하기 쉬운가(고급 언어)를 상대적으로 나눈 개념이라고 할 수 있다.

 

2) 저급 언어

저급 언어는 컴퓨터가 이해하기 쉽게 작성된 프로그래밍 언어

대표적인 언어로는 기계어(machine language)와 어셈블리어(assembly language) 등이 있다.
이 언어는 실행 속도가 매우 빠르지만, 사람이 배우기에는 매우 어려워 프로그램의 유지보수가 힘들다.

 

3) 고급 언어는 컴퓨터보다는 사람이 알기 쉽도록 작성된 프로그래밍 언어
고급 언어는 컴파일러나 인터프리터에 의해 기계가 이해 할 수 있는 언어로 번역되어 실행 되므로 저급 언어보다 상대적으로 실행 속도가 느리다. 대신 저급 언어에 비해 가독성이 높고 다루기가 쉽다.

대표적인 예시 : 자바, 파이썬 등


1. C언어의 뜻

C언어는 현재 사용하고 있는 거의 모든 컴퓨터 시스템에서 사용할 수 있는 프로그래밍 언어

C언어는 저급 언어와 고급 언어의 특징을 모두 가지고 있는 절차 지향 프로그래밍 언어(procedure-oriented programming language)이다.

 

▶절차 지향 언어(Procedural Programming)

순차적으로 처리되고 프로그램 전체가 유기적으로 연결되도록 만드는 방법이며 대표적인 예로 C언어가 있다. 컴퓨터의 처리구조와 유사해 실행 속도가 빠른 장점이 있지만 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려워 유지보수가 어렵다. (c언어도 절차 지향 언어이긴 하나 c언어는 코드가 복잡하지 않아 상대적으로 유지보수가 쉽다고 한다)

(프로그램 전체가 유기적으로 연결돼있으므로 일부분이 고장이 나도 전체를 수리해야 한다(매우 비효율적이다)

절차지향과 비슷한 예로는 자동차 제조가 있다. 자동차는 엔진, 차제, 핸들, 의자, 바퀴 순으로 차례대로 만들어져야 하고 순서도 틀리면 안된다고 한다.

이와 대조되는 개념으로는 객체 지향 언어가 있다. (대표적으로 자바)

 


2. C언어의 탄생 배경

C언어 이전에 유닉스 운영체제는 어셈블리어라는 저급 언어를 사용했는데 어셈블리어는 특정 하드웨어에 종속적인 언어여서, 이 언어로 작성된 프로그램은 다른 하드웨어로 이식할 수 없어 하나의 기능을 하는 프로그램을 CPU의 종류만큼 여러 번 작성해야만 했다. 따라서 이식성도 좋고 어셈블리어보다 쉬운 언어가 필요해졌고, 그래서 개발된 언어가 바로 C언어이다.


3. C언어의 컴파일 과정

① 소스 파일(source file) 작성

C언어를 사용하여 문법에 맞게 논리적으로 작성된 프로그램을 원시 파일 또는 소스 파일이라고 한다.

C언어를 통해 작성된 소스 파일의 확장자는 .c가 된다.

 

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

선행처리란 소스 파일 중에서도 선행처리 문자(#)로 시작하는 선행처리 지시문의 처리 작업을 의미한다.

선행처리기는 코드를 생성하는 것이 아닌, 컴파일하기 전 컴파일러가 작업하기 좋도록 소스를 재구성해주는 역할만 한다.

출처는 아래 참고

 

③ 컴파일러(compiler) 에 의한 컴파일

컴퓨터는 0과 1로 이루어진 이진수로 작성된 기계어만 이해할 수 있는데 소스 파일은 이해할 수 없으므로 소스 파일을 컴퓨터가 알아볼 수 있는 기계어로 변환시키는 작업을 컴파일이라고 한다. 

컴파일이 끝나 기계어로 변환된 파일을 오브젝트 파일이라고 한다. 

 

④ 링커(linker)에 의한 링크

컴파일러에 의해 생성된 오브젝트 파일은 운영체제와의 인터페이스를 담당하는 시동코드를 가지고 있지 않고 또한 대부분의 C 프로그램에서 사용하는 C 표준 라이브러리 파일도 포함되어 있지 않다.

이때 하나 이상의 오브젝트 파일과 라이브러리 파일, 시동 코드 등을 합쳐 하나의 파일로 만드는 작업을 링크라고 한다.

 

링크가 끝나면 하나의 새로운 실행 파일이나 라이브러리 파일이 생성된다.

⑤실행 파일(executable file)의 생성

소스 파일은 선행처리기, 컴파일러 그리고 링커에 의해 위와 같은 과정을 거쳐 실행 파일로 변환 된다.

이렇게 생성된 실행파일의 확장자는 .exe가 된다.

출처는 아래 참고


출처 : 코딩의 시작, TCP School


4. C 표준 라이브러리

① 라이브러리(library)

라이브러리란 다른 프로그램의 구성 요소로 사용하기 위해 미리 만들어 둔 프로그램 조각이다. 즉, 자주 사용하는 기능을 모듈·패키지로 만들어 둔 것이다. 한 번 만들어 놓으면 여러 프로그램에서 재사용할 수 있고, 다른 사람과 공유할 수도 있다.
② 표준 라이브러리(standard library)

대다수 프로그래밍 언어는 프로그램을 만들 때 공통적으로 필요한 기능을 미리 만들어 라이브러리로 제공한다. 프로그래밍 언어가 공식적으로 제공하는 라이브러리를 표준 라이브러리라고 한다. 표준 라이브러리는 프로그래밍에 필요한 가장 중요한 기능을 제공하며, 신뢰성도 다른 라이브러리에 비해 매우 높다.

출처  : 11장 다양한 작업을 돕는 라이브러리 | 연오의 파이썬 프로그래밍 입문서 (bakyeono.net)

 

③ C 표준 라이브러리

C언어를 위한 표준 라이브러리이다. C 표준 라이브러리의 API는 많은 헤더 파일들에 정의되어 있다. 각 헤더 파일은 하나 이상의 함수 정의와 데이터 타입 정의 그리고 매크로들을 포함한다.

C 표준 라이브러리 안에 헤더파일도 들어있는데 그 중에 대표적인 예가 <stdio.h>이고 표준 라이브러리 안에 있는 이 헤더파일을 사용함으로써 손쉽게 그 헤더파일안에 있는 함수를 쓸 수 있게 되는 것이다.

출처 : C 표준 라이브러리 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)

출처는 아래 참고

사진 출처 : C언어 이론 11. 표준 라이브러리(정의~문자열 처리 함수) (tistory.com)

▶API

응용 프로그램 프로그래밍 인터페이스)는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스라고 한다.

 

도통 무슨 말인지 감이 안오는데 이 개념을 이해하기 위해서 우선 UI(User Interface) 개념을 생각해보도록 하자.

UI는 말 그대로 컴퓨터와 사람이 상호작용할 수 있도록 도와주는 매개체인데 쉽게 생각해서 그냥 사용자가 PC나 휴대폰을 볼 때 보게되는 화면을 UI라고 생각할 수 있다.

UI가 사람과 컴퓨터를 연결한다면 API는 프로그램과 다른 프로그램을 연결해주는 매개체라고 생각하면 된다. 

먼저 UI를 먼저 생각해보자. 스마트폰 화면에는 사람이 이용하기 편하도록 버튼이 있다. 만약 버튼이 없으면 어떻게 될까..

사용자는 스마트폰과 상호작용할 수 있는 방법을 몰라 헤매게 된다. 이런 헤매는 사용자를 도와주는 것이 바로 UI이다.

같은 방식으로 API도 이해해보자. 

지도를 이용한 맛집찾기 프로그램을 만들고자 한다고 생각해보자. 

일반인들은 이런 지도 기능들을 제공할만한 기반이 되는 데이터도 없고 관련 프로그램도 없다.

그리고 일반인들 입장에서는 그런 지도 데이터를 공개해도 여러 문제점 때문에 그 지도데이터를 사용하기 어려울 것이다. 

그래서 이 지도 데이터를 일종에 스마트폰의 버튼처럼 그 지도 데이터를 접근하기 쉽게 만들어 사용자들에게 공개한 것이 바로 지도API이다. (어떻게 보면 오픈 소스랑 비슷한 느낌이라고 볼 수 있다)

 

출처 설명이 대박이니 무조건 한번 보시는 것을 추천드립니다. 

출처 : API 란?. 저도 API가 무엇인지 자세히 알지 못하였기 때문에 검색을 하며 스스로… | by 초보개발자 | Medium

 

▶헤더 파일

헤더파일은 메뉴판이다. 대표적인 헤더파일로 stdio.h가 있는데 이 헤더파일을 사용함으로써 헤더파일이라는 메뉴판에 적혀있는 메뉴, 즉 여러가지 함수를 사용할 수 있었던 것이다. 

 

간단한 프로그램을 작성해보자. 

출처는 아래 참고

더하기 기능을 사용하기 위해서 sum 이라는 함수를 만들어낸 것인데 실제로 프로그램을 만들 때는 함수를 많이 만들어야 하기 때문에 이렇게 정리를 하게 되면 뭐가 뭔지 눈에 들어오지도 않고 가독성이 떨어질 것이다. 

그래서 파일을 분리한다.

head.h라는 헤더파일에는 함수이름만 적고 함수 기능은 또 다른 소스파일을 만들어서 거기에 저장한다.

그리고 마지막으로 main 소스파일에는 #include "head.h"라고 서서 헤더파일을 불러온다.(예시로 설명하면 "head.h"를 선언해줌으로써 sum함수를 main 소스파일에서 사용할 수 있게 되었다.)

 

이런식으로 만들게 되면 실제 프로그램을 작동하도록 만드는 사람은 새로 기능을 추가할 때 헤더파일만 불러오면 되며 여러 사람이 분업을 해서 만들기 좋아졌다.

출처는 아래 참고

내용 출처, 사진출처 : [C언어]18. 헤더파일이란 무엇인가 ( 헤더파일을 만드는 법 ) (tistory.com)

 

▶#include에서 #의 의미

#은 컴파일러에게 명령을 하는 키워드 전처리기라고 한다.

#include는 ~을 포함해라라는 의미이다. 

출처 : [C언어]19.#include 가 어떻게 작동하는가. (#include , #의 의미 ) (tistory.com)

+ Recent posts