1. C의 개요
C 언어는 범용 프로그래밍 언어로, 1972년 UNIX 운영체제 개발을 위해 탄생했습니다. 운영체제 자체와 연계 소프트웨어 대부분이 C로 작성되었습니다. 다만 UNIX에 종속되지 않고 모든 컴퓨터, 모든 운영체제에서 사용 가능합니다. ‘시스템 프로그래밍 언어’로 불리며 운영체제와 컴파일러 제작은 물론 각종 일반 소프트웨어 개발에도 활용됩니다.
C의 전신은 B 언어(BCPL 기반)입니다. B와 BCPL은 자료형이 없는 언어였지만, C는 완전한 자료형 체계를 새롭게 탑재했습니다.
2. 핵심 특징
1) 풍부한 자료형
전신인 B 언어와 비교했을 때 C는 매우 다양한 자료형을 제공합니다.
기본 자료형: 문자, 여러 크기의 정수, 소수(부동 소수점)
파생 자료형: 포인터, 배열, 구조체, 공용체. 포인터를 활용하면 하드웨어에 구애받지 않고 메모리 주소를 직접 조작할 수 있습니다.
규칙: 연산자를 조합해 식을 만들 수 있으며, 대입 연산이나 함수 호출 같은 식은 단독으로 한 줄의 명령문으로 취급됩니다.
2) 완전한 프로그램 흐름 제어
조건 분기(if-else), 다중 분기(switch), 두 가지 반복문(조건을 먼저 검사하는 while/for, 실행 후 검사하는 do), 반복문 조기 탈출 break 등을 지원합니다. 이러한 흐름 제어 구문을 통해 프로그램 로직을 풍부하게 구성할 수 있습니다.
3) 함수
함수란 고정된 일련의 작업을 하나로 묶은 단위입니다. 이름을 붙여두면 필요할 때 이름을 호출하는 것만으로 모든 절차가 자동 실행됩니다.
일상 예시로 설명하겠습니다:
‘빵 굽기’를 하나의 함수로 가정해봅시다.
빵을 구울 때마다 반죽하기 → 성형하기 → 굽기 순서를 매번 적을 필요가 없습니다.
‘빵 굽기’라고 호출하는 것만으로 전 과정이 자동 진행되는데, 이 행위를 함수 호출이라고 부릅니다.
빵을 두 번 굽고 싶다면 ‘빵 굽기’ 함수를 두 번 호출하면 됩니다.
C 언어로 바꿔 설명하면:
printf함수에는 ‘화면에 글자를 출력하는’ 모든 절차가 담겨있습니다.printf("안녕하세요")한 줄만 작성하면 화면 제어의 복잡한 과정을 직접 구현할 필요가 없습니다.
함수는 정수, 구조체, 포인터 등 모든 종류의 데이터를 반환할 수 있습니다.
재귀 호출(자기 자신을 호출하는 기능)을 지원합니다. 함수 내부의 지역 변수는 호출할 때마다 새로 생성되며, 함수 안에 다른 함수를 중첩 정의할 수 없습니다. 다만 변수는 코드 블록 안에 개별 선언 가능합니다.
프로젝트 소스 코드를 여러 .c 파일로 나누어 개별 컴파일할 수 있습니다.
변수는 세 가지 유효 범위로 나뉩니다: 오직 함수 내부에서만 접근 가능, 단일 파일 내 전역 범위, 프로그램 전체에서 참조 가능.
4 전처리기
컴파일 실행 전 전처리 단계가 진행됩니다: 매크로를 통한 문자열 일괄 치환, 외부 코드 파일 불러오기, 특정 코드의 조건부 컴파일 등의 작업을 수행합니다.
전처리기는 언어 본래 문법에 포함되지 않는 명령을 컴파일 전 미리 처리하는 도구를 의미합니다. 개발 효율을 높이기 위해 매크로 기능이 제공되며, 자세한 내용은 후속 장에서 다루겠습니다.
3. 저수준에 가까운 간결한 언어
여기서 말하는 저수준은 부정적인 뜻이 아닙니다. 컴퓨터 본연의 기본 데이터인 문자, 숫자, 메모리 주소를 직접 다루며 하드웨어 기본 연산 로직을 활용하기 때문에 실행 효율이 매우 높다는 의미입니다.
즉 다른 언어에 비해 컴퓨터의 내부 로직에 깊게 접근할 수 있으며, 메모리 주소 조작은 물론 하드웨어 제어까지 가능합니다.
언어 자체 기능은 극도로 간소화, 복잡한 기능은 라이브러리로 구현
C 언어에는 기본적으로 탑재되지 않은 기능이 많습니다: 문자열, 배열, 컬렉션, 파일 입출력, 콘솔 입출력 등.
문자열이나 배열 전체를 한 번에 조작하는 문법이 없고, 오직 구조체만 통째로 복사할 수 있습니다.
자동 메모리 관리 및 가비지 컬렉션 기능이 없어 메모리를 개발자가 직접 제어해야 합니다.
read/write 같은 전용 읽기쓰기 키워드가 없으며, 화면 출력과 키보드 입력은 모두 라이브러리 함수 호출로 처리합니다.
기본 단일 스레드 흐름만 지원하며 병렬 처리, 동기화, 코루틴 기능은 기본 제공하지 않습니다.
라이브러리란 다른 개발자가 C 언어 혹은 다른 언어로 미리 작성한 함수들의 집합을 말합니다. 라이브러리 함수를 호출하면 기본 기능을 처음부터 구현하는 수고를 덜 수 있습니다.
많은 기능을 라이브러리 호출로 구현해야 하지만 언어 자체 규칙이 적고 간결해 배우기 쉬우며, 개발자가 언어 전체 문법을 완벽하게 이해하기 용이합니다.
4. C 언어 표준화: ANSI C (1988)
표준화의 필요성은 C 언어가 널리 사용되면서 각 기업이 자체 규격을 만들어 규칙이 통일되지 않았기 때문에 생겼습니다. USB 단자나 콘센트 규격처럼 전문 기관이 통일된 규칙을 제정한 것이 표준 규격입니다.
ANSI = American National Standards Institute
설명
미국 국가 표준 협회의 약자로 미국 민간 표준화 기관입니다. 소프트웨어 제작이나 코드 작업은 하지 않고 공업, 전자, 컴퓨터, 프로그래밍 언어 등 모든 분야에 통일 규격을 정하는 업무를 수행합니다.
ANSI C란 무엇인가?
1983년 ANSI는 C 언어 문법을 통일하는 위원회를 설립하고 1988년 말 최초의 공식 표준을 발표했습니다. 이 표준을 ANSI C(C89라고도 부름)라고 칭합니다.
5. ANSI 표준 부속: 표준 라이브러리
파일 입출력, 서식화 입출력, 메모리 할당, 문자열 처리 등 범용 기능을 제공하는 통일된 표준 라이브러리가 추가되었으며, 통일된 헤더 파일을 통해 이용할 수 있습니다.
C 언어 본연의 문법은 매우 간소화되어 변수, 조건문, 반복문, 함수, 포인터 같은 기본 규칙만 정의되어 있을 뿐, 문자 출력, 키보드 입력, 파일 조작, 수학 연산, 문자열 처리 기능은 기본으로 제공하지 않습니다.
ANSI C 규격에서 정의한 모든 컴파일러에서 공통 사용 가능한 크로스 플랫폼 범용 함수 집합을 표준 라이브러리라고 부릅니다.
사용 방법: #include xxx.h로 헤더 파일을 불러오면 라이브러리 함수를 직접 사용할 수 있습니다.
예시:
#include <stdio.h> //입출력 라이브러리: printf(화면 출력), scanf(키보드 입력 읽기)
#include <stdlib.h> //메모리 할당, 프로그램 종료, 난수 생성
#include <string.h> //문자열 복사 및 비교
#include <math.h> //sin, sqrt 등 수학 연산 함수Code language: HTML, XML (xml)
ANSI 표준이 나오기 전 UNIX와 Windows의 출력 함수 문법이 달라 운영체제를 바꾸면 코드가 오류를 일으켰습니다. 표준 라이브러리 등장 후 printf("hello") 한 줄로 Windows, Linux, Mac 어느 환경에서도 수정 없이 동작하며 개발자의 부담이 크게 줄고 C 언어의 보급이 빨라졌습니다.
표준 라이브러리는 무엇으로 개발되었는가?
대부분의 기능은 C 언어로 구현되었으며 일부는 어셈블리 언어 등을 함께 사용합니다.
문자열 복사 함수 strcpy, 수학 연산, 메모리 복제처럼 하드웨어에 직접 접촉하지 않는 함수들은 거의 모두 순수 C 코드로 작성됩니다.
운영체제 및 하드웨어와 직접 상호작용하는 작업은 C 언어 단독으로 구현할 수 없어 보조 언어, 주로 어셈블리 언어와 결합해 개발합니다.
6. 이식성과 자료형 안전성
동일한 소스 코드는 약간의 수정 혹은 무수정으로 여러 운영체제에서 컴파일 후 실행 파일로 구동할 수 있습니다.
지금까지 내용을 읽었다면 C 언어에 대한 기본적인 이해가 생겼을 것입니다. 아직 이해가 어려운 부분이 있다 해도 걱정하지 마세요. 텍스트만으로 설명하면 이해하기 힘든 내용이 많으므로 이후 장에서 실제 예시와 함께 단계별로 풀어 설명하겠습니다.