C프로그래밍 1강 - C 언어의 개요
C 언어가 등장한 배경과 주요 특징을 살펴보고, 소스 코드가 컴파일과 링크를 거쳐 실행 파일이 되는 과정을 학습한다. 또한 C 프로그램의 기본 구조와 구성 토큰, 명칭 작성 규칙, 에러와 경고의 차이를 체계적으로 정리한다.
1. 프로그래밍과 프로그래밍 언어
프로그래밍의 의미
프로그래밍은 컴퓨터가 작업을 수행하기 위해 실행해야 하는 일련의 명령을 작성하는 활동이다. 컴퓨터는 프로그램에 기록된 명령에 따라 입력된 데이터를 처리하고 그 결과를 출력한다. 따라서 프로그램은 컴퓨터가 무엇을 어떤 순서로 처리할지를 표현한 명령의 집합이라고 할 수 있다.
프로그래밍 언어는 이러한 프로그램을 작성하기 위해 사용하는 언어이다. 사람이 이해하기 쉬운 표현과 컴퓨터가 실행할 수 있는 표현 사이에는 차이가 있으므로, 언어의 세대에 따라 번역 도구가 필요하다.
| 세대 | 언어와 예 | 번역·처리 도구 |
|---|---|---|
| 제1세대 | 컴퓨터가 직접 처리하는 기계어 | 컴퓨터 하드웨어가 직접 실행 |
| 제2세대 | 기계 명령을 기호로 나타낸 어셈블리어 | 어셈블러 |
| 제3세대 | C, C++, Java, Python 등의 고급언어 | 컴파일러 또는 인터프리터 |
시험 포인트: C는 사람이 이해하기 쉬운 표현을 사용하는 제3세대 고급언어이지만, 하드웨어에 가까운 제어도 가능하다는 점이 특징이다.
2. C 언어의 등장과 발전
C 언어의 탄생
C 언어는 1972년 벨 연구소의 데니스 리치(Dennis Ritchie)가 시스템 프로그래밍을 목적으로 개발했다. 당시 PDP-7 컴퓨터에서 어셈블리어로 구현되어 있던 유닉스(Unix) 커널을 C 언어로 다시 작성함으로써 다양한 컴퓨터 기종에 유닉스 운영체제를 이식할 수 있게 되었다.
C 언어의 계보는 1960년 ALGOL 60, 1963년 CPL, 1967년 BCPL, 1970년 B 언어를 거쳐 1972년 C 언어로 이어진다. 1978년에는 K&R C가 소개되었고, 1989년 ANSI C(C89), 1990년 ISO C(C90)로 표준화되었다. 이후 C99, C11, C17, C23 등으로 표준이 발전해 왔다.
C 언어의 특징
C는 논리적인 처리 구조를 만들 수 있는 데이터 표현과 흐름 제어 기능을 갖추고, 여러 유용한 처리를 위한 표준 라이브러리를 제공하는 범용 고급언어이다. 컴퓨터 기종에 대한 의존성이 비교적 낮아 프로그램의 이식성이 높다.
동시에 저급언어 수준의 특성을 갖추어 하드웨어 제어에 적합하고 실행 속도가 빠르므로 시스템 프로그래밍에 널리 활용된다. 문법 구조가 간결하다는 것도 중요한 특징이다.
C가 고급언어라는 사실과 하드웨어 수준의 제어가 가능하다는 사실은 서로 모순되지 않는다. 사람이 읽을 수 있는 구조적 문법을 제공하면서도 메모리와 장치를 세밀하게 다룰 수 있다는 의미이다.
3. 프로그램 개발과 실행 파일 생성 과정
프로그램 개발 단계
프로그램 개발은 단순히 소스 코드를 입력하는 것으로 끝나지 않는다. 먼저 해결할 문제와 프로그램의 목적을 정하고, 필요한 기능을 분석하여 처리 구조를 설계한다. 그 후 소스 코드를 작성하고 실행 가능한 형태로 변환하여 동작을 확인한다.
| 단계 | 주요 내용 |
|---|---|
| 목적 정의 | 요구 분석, 시스템 분석, 기능 정의 |
| 프로그램 설계 | 분석된 기능을 처리할 프로그램 구조 설계 |
| 소스 코드 작성 | 설계 내용을 프로그래밍 언어 문법에 맞게 표현 |
| 컴파일·링크 | 소스 코드를 목적 파일로 번역하고 필요한 라이브러리와 결합 |
| 프로그램 실행 | 필요한 데이터를 제공하여 프로그램을 실행 |
| 테스트·디버깅 | 오류를 검사하고 원인을 찾아 수정 |
| 유지 보수 | 사용 중 발생하는 오류와 변경 사항 처리 |
코딩, 컴파일, 링크
코딩 단계에서는 편집기로 헤더 파일과 C 소스 파일을 작성한다. 컴파일은 각 소스 파일을 컴퓨터가 처리할 수 있는 목적 파일로 번역하는 과정이다. 그러나 목적 파일만으로는 프로그램을 바로 실행할 수 없다.
링크 단계에서는 목적 파일과 프로그램이 사용하는 라이브러리를 결합하여 하나의 실행 파일을 만든다. 이를 흐름으로 나타내면 소스 파일 → 컴파일 → 목적 파일 → 링크(라이브러리 결합) → 실행 파일 순서이다.
컴파일과 링크를 구분해야 한다. 컴파일은 소스 파일을 목적 파일로 번역하고, 링크는 목적 파일과 라이브러리 등을 결합하여 실행 파일을 생성한다.
4. 개발 도구와 통합개발환경
C 프로그램 작성에 필요한 도구
C 프로그램 개발에는 소스 코드를 입력하는 편집기, 소스 코드를 번역하는 컴파일러, 목적 파일과 라이브러리를 결합하는 링커, 오류를 추적하는 디버깅 도구가 필요하다. 이러한 도구를 한 환경에 모아 편리하게 사용할 수 있도록 만든 것이 통합개발환경(IDE)이다.
IDE를 이용한 작성과 실행
강의에서는 Dev-C++와 Visual Studio를 예로 든다. Dev-C++에서는 소스 파일을 만들고 코드를 작성한 뒤 저장하고, 프로그램을 빌드하여 실행한다. Visual Studio에서는 먼저 C++ 언어의 빈 프로젝트를 만들고 프로젝트 이름, 저장 폴더, 솔루션 이름을 지정한다. 이어 솔루션 탐색기에서 소스 파일을 추가하고 편집 창에 코드를 작성한 다음 프로젝트를 빌드하고 실행한다.
IDE마다 메뉴 이름과 화면 구성은 다를 수 있지만 기본 흐름은 같다. 즉, 프로젝트 또는 소스 파일 생성 → 코드 작성과 저장 → 빌드 → 실행 → 결과 확인의 순서로 진행한다. 빌드는 일반적으로 컴파일과 링크를 포함하는 작업이다.
IDE는 프로그래밍 언어 자체가 아니라 여러 개발 도구를 통합한 작업 환경이다. IDE를 사용하지 않더라도 편집기, 컴파일러, 링커 등을 각각 이용하여 C 프로그램을 만들 수 있다.
5. C 프로그램의 기본 구조
함수와 main 함수
C 프로그램은 반드시 하나 이상의 함수를 포함하며, 프로그램 실행의 중심이 되는 main() 함수가 반드시 존재해야 한다. 함수의 몸체는 시작과 끝을 나타내는 중괄호 { }로 묶은 블록으로 구성한다.
프로그램의 도입부에는 헤더 파일을 포함하는 선행처리 지시어와 필요한 함수의 원형 선언 등을 둘 수 있다. main 함수의 블록에는 변수 선언문, 치환과 연산, 함수 호출과 같은 명령문을 작성하며, 필요하면 main 함수 밖에 사용자가 정의한 다른 함수를 작성한다.
/* 도입부 */
#include <stdio.h>
int add(int x, int y);
int main()
{
int i = 10, j = 20, sum;
sum = add(i, j);
printf("%d+%d=%d", i, j, sum);
}
int add(int x, int y)
{
return x + y;
}
문장과 세미콜론
블록 안에는 선언문과 명령문을 문법에 맞게 작성한다. 일반적으로 문장의 끝에는 세미콜론(;)을 붙인다. 다만 #include와 같은 선행처리 지시어의 끝에는 세미콜론을 붙이지 않는다.
C 프로그램에는 main 함수가 반드시 있어야 하며, 함수 몸체는 중괄호로 구분한다. 선행처리 지시어를 제외한 문장의 끝에는 원칙적으로 세미콜론을 붙인다.
6. C 프로그램의 구성 요소
토큰의 종류
C 프로그램은 더 이상 나누면 의미가 달라지는 기본 단위인 토큰(token)을 문법과 의미에 맞게 나열하여 작성한다. 강의에서 제시한 토큰의 종류는 예약어, 명칭, 상수, 문자열, 구두점, 설명문이다.
| 구성 요소 | 의미와 예 |
|---|---|
| 예약어 | C에서 고유한 문법과 의미가 정해진 단어 |
| 명칭 | 변수와 함수 등을 식별하기 위해 사용자가 정의한 이름 |
| 상수 | 정수, 실수, 문자 등 값이 변하지 않는 자료 |
| 문자열 | 큰따옴표로 묶은 문자 시퀀스 |
| 구두점 | =, +, -, *, / 등의 연산자와 세미콜론·쉼표·괄호 등의 구분자 |
| 설명문 | 프로그램을 설명하는 주석 |
예약어
예약어(reserved word, keyword)는 C 언어에서 용도와 의미가 이미 정해진 단어이므로 다른 용도의 이름으로 사용할 수 없다. 자료형 관련 예약어에는 char, int, float, double, struct, void, typedef 등이 있다. 기억 관련 예약어에는 auto, static, extern, register, volatile, sizeof 등이 있으며, 제어 관련 예약어에는 if, else, switch, for, while, break, continue, return 등이 있다.
상수와 연산자
상수에는 123과 같은 수치 상수, 'a'와 같은 문자 상수, "KNOU"와 같은 문자열 상수가 있다. 연산자는 산술, 관계, 논리, 비트, 대입 등의 연산을 표현하는 기호이며, 연산의 대상을 피연산자라고 한다. 연산 종류에 따라 1개에서 3개의 피연산자가 사용될 수 있다.
7. 명칭과 설명문 작성 규칙
명칭의 정의 규칙
명칭(identifier)은 변수, 함수 등 프로그램의 여러 요소를 식별하기 위해 정의하는 이름이다. 영문자와 숫자를 조합할 수 있지만 첫 문자는 영문자 또는 밑줄(_)이어야 한다. 밑줄 이외의 특수문자와 공백은 사용할 수 없고, 예약어도 명칭으로 사용할 수 없다.
C는 영문 대문자와 소문자를 구별한다. 따라서 myname, myName, MyName은 서로 다른 명칭이다. my_name, flag01, For도 올바른 명칭이다. 특히 For는 대문자 F로 시작하므로 예약어 for와 구별된다.
| 명칭 | 판정 | 이유 |
|---|---|---|
my_name | 올바름 | 밑줄 사용 가능 |
flag01 | 올바름 | 영문자로 시작하고 숫자 조합 가능 |
my name | 잘못됨 | 공백 사용 불가 |
my-name | 잘못됨 | 밑줄 이외의 특수문자 사용 불가 |
4days | 잘못됨 | 숫자로 시작할 수 없음 |
auto | 잘못됨 | 예약어는 명칭으로 사용할 수 없음 |
설명문
설명문(comment, 주석문)은 프로그램의 의미와 동작을 설명하기 위한 문장이다. 컴파일러는 설명문 영역을 무시하므로 프로그램 실행에는 직접 영향을 주지 않는다. /*와 */ 사이에는 여러 줄에 걸친 설명을 작성할 수 있고, // 뒤에는 그 행의 끝까지 간단한 설명을 작성할 수 있다.
주석은 임의의 형식으로 작성할 수 있지만 코드의 목적과 처리 내용을 이해하고 유지 보수하는 데 도움이 되도록 명확하게 작성하는 것이 좋다.
8. 에러와 경고
에러
에러(error)는 프로그램을 정상적으로 빌드할 수 없는 문제가 소스 코드에 포함되어 있을 때 발생한다. C 문법에 맞지 않는 문장을 사용하거나 반드시 필요한 요소를 빠뜨린 경우가 대표적이다. 에러가 발생하면 빌드가 중지되고 목적 코드와 실행 파일이 생성되지 않으므로, 메시지를 확인하여 반드시 수정해야 한다.
예를 들어 printf("Hello~\n") 문장의 끝에서 세미콜론을 빠뜨리면 문법 에러가 발생한다. 또한 printf를 print로 잘못 작성하면 정의되지 않은 함수를 사용한 것이 되어 컴파일 단계의 경고에 이어 링크 단계에서 외부 기호를 찾을 수 없다는 에러가 발생할 수 있다.
경고
경고(warning)는 빌드는 계속할 수 있지만 문제가 발생할 가능성이 있는 소스 코드에 대해 출력되는 메시지이다. 사용하지 않는 변수나 함수를 정의했거나 오차가 발생할 수 있는 문장을 작성한 경우가 예이다. 경고가 있어도 실행 파일은 생성될 수 있고 프로그램도 실행할 수 있다.
경고는 무조건 무시하는 메시지가 아니다. 내용을 확인하여 실제 문제가 될 수 있다면 적절히 수정해야 한다. 아무런 문제가 없는 경고는 무시할 수 있지만, 가능하면 원인을 파악하여 경고 메시지가 나오지 않도록 작성하는 것이 바람직하다.
| 구분 | 빌드와 실행 파일 | 대응 |
|---|---|---|
| 에러 | 빌드 중지, 목적 코드와 실행 파일 생성 불가 | 반드시 원인을 찾아 수정 |
| 경고 | 빌드 진행 가능, 실행 파일 생성 가능 | 내용을 확인하고 필요한 경우 수정 |
핵심 개념 정리
- C 언어는 1972년 데니스 리치가 시스템 프로그래밍을 위해 개발한 범용 고급언어이다.
- C는 이식성이 높고, 하드웨어 제어에 적합하며, 실행 속도가 빠르고 문법이 간결하다.
- 소스 파일은 컴파일을 통해 목적 파일이 되고, 링크 과정에서 라이브러리 등과 결합되어 실행 파일이 된다.
- IDE는 편집기, 컴파일러, 링커, 디버깅 도구 등을 통합한 개발 환경이다.
- C 프로그램은 하나 이상의 함수로 구성되며 main 함수가 반드시 필요하다.
- C 프로그램의 토큰에는 예약어, 명칭, 상수, 문자열, 구두점, 설명문이 있다.
- 명칭은 영문자나 밑줄로 시작하고 공백·특수문자·예약어를 사용할 수 없으며 대소문자를 구별한다.
- 에러는 빌드를 중지시키므로 반드시 수정해야 하고, 경고는 빌드가 가능하더라도 내용을 확인해야 한다.
최종 정리: C 프로그래밍의 출발점은 언어의 특징을 암기하는 데 그치지 않고, 소스 코드가 실행 파일로 만들어지는 과정과 프로그램을 이루는 기본 규칙을 함께 이해하는 것이다. 특히 컴파일과 링크, 예약어와 명칭, 에러와 경고의 차이를 명확히 구분해야 한다.
예상문제 20선
1. 프로그래밍의 의미로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
프로그래밍은 컴퓨터가 작업을 수행하기 위해 실행해야 할 일련의 명령을 작성하는 활동이다.
2. C, C++, Java, Python이 속하는 언어 세대는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
C를 비롯한 고급언어는 제3세대 언어이며 컴파일러나 인터프리터 같은 번역 도구를 사용한다.
3. C 언어를 1972년 벨 연구소에서 개발한 인물은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
데니스 리치는 시스템 프로그래밍을 목적으로 C 언어를 개발했다.
4. C 언어의 특징으로 옳지 않은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
C는 기종 간 호환성과 이식성이 높은 언어이다.
5. 프로그램 개발 단계의 일반적인 순서로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
문제와 목적을 먼저 정의하고 설계와 구현, 변환, 실행, 검증, 유지 보수의 순서로 진행한다.
6. 컴파일 과정의 결과로 만들어지는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
컴파일러는 C 소스 파일을 번역하여 목적 파일을 만든다.
7. 목적 파일과 라이브러리를 결합하여 실행 파일을 만드는 과정은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
링커는 목적 파일과 필요한 라이브러리를 결합하여 실행 파일을 만든다.
8. 통합개발환경(IDE)에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
IDE는 프로그램 작성에 필요한 여러 도구를 한 환경에 통합하여 개발을 편리하게 한다.
9. 모든 C 프로그램에 반드시 존재해야 하는 함수는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
C 프로그램은 하나 이상의 함수로 구성되며 실행의 중심인 main 함수가 반드시 필요하다.
10. C 함수의 몸체를 블록으로 구분할 때 사용하는 기호는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
함수 몸체는 시작과 끝을 나타내는 중괄호로 묶은 블록으로 구성한다.
11. 다음 중 문장 끝에 세미콜론을 붙이지 않는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
선행처리 지시어를 제외한 일반 문장의 끝에는 세미콜론을 붙인다.
12. C 프로그램을 구성하는 토큰에 해당하지 않는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
예약어, 명칭, 상수, 문자열, 구두점, 설명문은 토큰의 종류이지만 저장 폴더는 프로그램 구성 토큰이 아니다.
13. 예약어에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
예약어는 C 언어에 고유한 용도와 의미가 이미 정해진 단어이다.
14. 다음 중 올바른 C 명칭은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
명칭은 영문자나 밑줄로 시작해야 하며 이후 영문자와 숫자를 조합할 수 있다.
15. C의 명칭 작성 규칙으로 옳지 않은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
C 명칭의 문자 사이에는 공백을 사용할 수 없다.
16. 명칭 For를 사용할 수 있는 이유는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
C는 대문자와 소문자를 서로 다른 문자로 구별하므로 For와 for는 다른 토큰이다.
17. 여러 줄에 걸친 설명문을 작성할 때 사용하는 기호의 조합은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①/*와 */ 사이의 내용은 여러 줄에 걸쳐 주석으로 처리할 수 있다.
18. 연산의 대상이 되는 값을 무엇이라고 하는가?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
연산자가 나타내는 연산의 대상을 피연산자라고 한다.
19. 에러가 발생했을 때의 결과로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
에러는 정상적인 빌드를 막으므로 원인을 찾아 반드시 수정해야 한다.
20. 경고에 대한 설명으로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
경고가 있어도 실행 파일은 생성될 수 있지만, 실제 문제 가능성이 있으므로 원인을 확인하고 필요하면 수정해야 한다.
댓글
댓글 쓰기