Chapter 03 C 언어 개요
C 언어 역사 1972년에 개발된 언어 특징 C 언어에서 발전된 언어 C 언어는 1972년경, 시스템 PDP-11에서 운용되는 운영체제 Unix를 개발하기 위한 언어 미국전신전화국인(AT&T) 벨연구소의 데니스 리치(Dennis Ritchie)가 개발 C 언어는 켄 톰슨(Ken Tompson)이 개발한 B 언어에서 발전된 언어 ANSI(American National Standards Institute) C 미표준화위원회에서 공인한 표준 C를 지칭 특징 C 언어는 운영체제 Unix 시스템을 개발하기 위한 목적으로 고안된 언어 시스템의 세세한 부분까지 제어할 수 있는 기능을 갖고 있으며, 여러 뛰어난 기능 때문에 현재까지도 널리 활용 C 언어에서 발전된 언어 1972년에 개발된 C 언어는 그 이후 1983년 개발된 프로그램 언어 C++의 기본 언어로 발전 프로그램 언어 C++는 C 언어에 객체지향 프로그래밍 개념을 확장한 언어 1995년에는 하드웨어 회사로 유명한 선(Sun)에서 C++ 언어를 발전시킨 Java 언어를 개발 Java 언어는 마이크로소프트가 2000년에 발표한 프로그램 언어 C#의 개발에 많은 영향
C 프로그램 구조 프로그램 구성 C 응용 프로그램의 구조 C 프로그램은 하나 이상의 여러 함수가 모여 하나의 프로그램을 구성 C 프로그램은 적어도 main() 함수 하나는 가져야 응용 프로그램으로서 실행될 수 있음 C 응용 프로그램의 구조 붉은 색 부분이 문법에 맞는 문장이고, 문장은 컴퓨터에게 작업 명령을 내리는 기본 단위로 세미콜론(;)으로 종료 뉘어 쓴 부분은 문장 구조를 표현하고 있으며, 녹색 부분은 프로그램을 설명하기 위한 주석 여러 파일에 나누어 기술 가능
콘솔 응용 프로그램 구조 콘솔 응용 프로그램 도스 창에서 결과가 나오는 응용 프로그램
프로그램 실행 순서 C 프로그램은 여러 함수의 조합으로 구성 실행 순서 함수란 정해진 규칙에 의하여 일련의 작업을 수행하는 프로그램의 단위 하나의 응용 프로그램이 실행 가능한 응용 프로그램이 되려면 바로 이 main() 함수를 가져야 함 실행 순서 여러 함수 중에서 main 함수는 프로그램이 실행되면 가장 먼저 시작되는 부분 모든 함수 내부에서는 위에서 아래로, 좌에서 우로, 문장이 위치한 순서대로 실행 실행순서는 가장 먼저 문장 1이 시작되고, 순서대로 위에서 아래로 실행되고, 마지막으로 return 문장을 실행하고 종료
컴파일러와 전처리기 전처리기(preprocessor) 미리 처리하는 프로그램으로, 컴파일러가 일을 하기 전에 먼저 처리하는 프로그램이라는 의미 컴파일러는 전처리기의 처리 결과인 소스를 컴파일 전처리기는 넓은 의미로 컴파일러의 일부분
전처리기 #include <헤더파일이름> 전처리기 명령어 #include 이것을 전처리기 지시자(preprocessor directives) 또는 전처리기 명령어라 함 전처리기의 대표적인 지시자가 #include 문 #include 전처리기 지시자는 항상 #으로 시작하고, 한 줄에 하나의 지시자 만을 기술 일반 문장과는 다르게 지시자 마지막에 세미콜론(;)은 없음 지시자 include는 #include로 기술하여 다음 <…> 사이에 헤더파일 이름이 기술 #include <헤더파일이름>
#include #include <stdio.h> 지시자 헤더 파일 헤더 파일은 확장자가 *.h로 일반 C 소스가 들어 있는 텍스트 파일 헤더 파일 stdio.h에는 입력과 출력에 관련된 여러 정보가 있는 소스 파일 함수의 정보인 함수원형과 여러 전처리기 지시자를 의미 함수 printf()를 이용하려면 적당한 소스 위치에서 헤더 파일 stdio.h을 첨가 일반적으로 헤더파일은 소스의 처음 부분에서 삽입 파일 이름 stdio.h는 표준 입출력(STanDard Input Output)에서 따오고, 확장자 h는 헤더 파일이라는 h
주석 Comments 주석은 프로그램 언어의 문법과는 관계없이 프로그램을 설명하는 설명문을 표현하기 위한 방법 주석은 쉽게 설명문이라고 이해 C 언어의 주석은 원래 /* … */로 이용하다가 C++ 언어가 나오면서 //..을 추가 두 가지 방법 주석의 시작 부분인 /와 * 사이에 공백이 없어야 하며, 마찬가지로 주석 종료 부분인 *와 / 사이에도 공백이 없어야 함 주석 /* … */은 여러 줄에 걸쳐 계속해서 설명문을 이용할 때 유용 여러 줄 주석 /* … */ 은 주석 안에 다시 주석을 이용하는 중복된(nested) 주석은 불허 주석 //은 // 이후부터 그 줄 끝까지 설명문을 넣을 수 있음 //은 한 줄 설명문에 이용 중요성 적절한 주석이 없는 프로그램은 이해하기 어렵고, 수정이 어려움 주석은 프로그램 유지 보수에 매우 중요하며, 따라서 주석 처리도 기술이며, 적절한 코드를 작성하는 것만큼 중요
예제 소스 Comments.c 고려사항 두 줄의 간단한 문장을 출력하는 기능에 주석 처리한 프로그램 자기만의 고유한 주석 처리 스타일을 만들어보자. 주석 처리는 시각적으로 정돈된 느낌을 주어야 하며, 프로그램의 내용을 적절히 설명해 주어야 함
들여쓰기 Indentation 집합기호 {…}로 표현하는 함수 정의 부분이나 블록에서, 입력하는 모든 문장 코드의 시작을 여러 개의 공백이나 탭을 이용하여 여백을 두고 코딩하는 방법을 들여쓰기(indentation) 들여쓰기는 새로운 블록이 시작되는 부분에서 시작하여 블록이 종료되는 부분까지 시작 줄의 왼쪽을 어느 정도 들여서 맞추는 것이 일반적 매우 중요 들여쓰기는 문법과는 관련이 없으나 프로그램의 이해를 돕기 위하여 반드시 필요한 코딩 방법
키워드 예약된 단어(Reserved Words) 이러한 의미에서 키워드는 예약어라고도 함 프로그램 언어마다 고유한 키워드(keyword)를 갖는데, C 언어는 32개의 기본 키워드 미표준화위원회 ANSI에서 지정한 C 언어의 32개의 키워드로, 전처리기 지시자는 키워드에서 제외된다. 이러한 키워드는 프로그램 언어에서 문법적인 의미를 갖음
식별자 Identifier 식별자 작성 규칙 식별자는 프로그램 작성을 위하여 사용자가 직접 정의하여 사용하는 여러 단어를 말하는데, 주로 변수이름과 함수이름 등을 말함 프로그램 내부의 일정한 영역에서 식별자는 서로 구별되어야 하며, 키워드는 식별자로 이용 불가능 식별자 작성 규칙 식별자를 구성하는 문자는 영문 대소문자(A~Z, a~z), 숫자(0~9), 밑줄(_)의 63개 뿐이다. 식별자의 첫 글자는 숫자를 이용할 수 없다. 대소문자는 구별하며, 키워드는 사용할 수 없다.
예제 소스 Identifiers.c 이 소스에서 키워드와 식별자를 구분해 보자. 키워드의 수인 정수 32를 적당한 변수 countKeywords에 저장한 후 출력하는 프로그램 이 소스에서 키워드와 식별자를 구분해 보자. 전처리기 지시자인 #include 문을 제외한 문장에서 파란색인 int, void, return이 키워드이고, 검은색인 main, printf는 함수이름인 식별자, countKeywords는 변수인 식별자
변수 선언 변수 변수 선언 프로그램에서 임시로 자료 값을 저장할 수 있는 저장 장소 변수는 필요한 자료 값을 저장할 수 있는데, 변수를 사용하기 위해서는 사용 전에 변수 선언을 반드시 선행 변수 선언 선언이란 내부적으로는 사용할 변수의 저장 공간을 메모리의 적당한 위치에 확보하는 것 다음이 변수 countKeywords에 대한 선언 // 변수선언 구조 자료유형 변수이름; // 실제 예 int countKeywords;
변수 선언 메모리에서 공간을 확보 메모리 내부 프로그램에서 변수의 선언은 메모리에서 적당한 공간을 확보의 의미 즉 변수는 물건을 저장하는 창고나 물건을 담는 박스와 같은 역할을 담당 메모리 내부 다음은 변수를 선언하는 경우, 컴퓨터 내부의 저장장치인 주기억장치 RAM에 적당한 메모리 공간이 확보되는 과정을 표현한 그림
자료 유형 자료 값의 종류 저장공간에 저장되는 자료 값의 종류를 나타내는 것으로, 자료 값의 종류인 유형에 따라 저장 공간인 박스의 크기와 종류가 다르다. 자료유형 int, short, float 등 위의 문장은 다음과 같이 일단 변수 선언을 한 후에 값을 저장하는 두 문장으로 나누어 // 변수 countKeywords를 int로 선언하면서 값을 32로 저장 int countKeywords = 32; // 변수 countKeywords를 int로 선언하면서 값을 32로 저장 int countKeywords; countKeywords = 32;
변수의 초기 값 변수의 초기 값 변수(variables)는 선언하면서 그 초기(처음) 값을 저장 변수는 초기값이 무엇이든 항상 마지막 값만을 저장 같은 자료 유형의 변수는 여러 개를 한 문장으로 선언 가능 같은 자료 유형의 변수는 선언하면서 변수의 초기 값을 저장 // 변수 count를 int로 선언하면서 값을 10으로 저장 int count = 10; // 변수 count 값을 25로 수정하여 저장 count = 25; // 변수 a, b를 int로 선언하면서 초기 값을 저장하지 않음 int a, b; // 변수 c, d를 int로 선언하면서 초기 값으로 각각 10과 20을 저장 int c = 10, d = 20;
예제 소스 Declarations.c 실행 자료유형 int 형 변수 a를 선언한 후 값을 저장하지 않고 출력 자료유형 short 형 변수 b를 선언한 후, 이 변수에 32768을 초기 값으로 저장하여 출력 실행 컴파일하면 에러는 발생하지 않으나 경고가 발생한다. 이를 무시하고 실행 자료유형 short인 변수 b 는 출력 값이 음수인 –32768 “자료유형 short는 자료를 저장할 수 있는 공간 크기가 작아서 정수 32768을 저장할 수 없기 때문이다”
토큰이 모여 문장 문장 토큰 int year = 2004 ; C 언어 문장의 마지막에는 반드시 세미콜 론(;)을 기술 문장은 컴퓨터에게 작업 명령을 내리는 기본 단위로 세미콜론(;)으로 종료 토큰 문장을 이루는 의미 있는 단어나 기호를 토큰(token) 토큰 중에서 키워드나 식별자, 연산자 등을 구별 위 문장은 5개의 토큰으로 구분 int year = 2004 ; 토큰 의미 int 정수 자료형을 의미하는 키워드 year 변수 이름인 식별자 = 대입연산자 2003 정수 상수 ; 문장의 종료를 의미
문장의 모임 블록 함수를 정의하거나 여러 개의 문장을 묶어 하나의 블록으로 구성하는 경우, 집합기호인 중괄호 {…}를 이용 함수 main()을 정의하기 위하여 중괄호 사이에 필요한 여러 문장을 기술 #include <stdio.h> int main(void) { int a = 10, b = 5; printf("10 - 5 = %d\n", a - b); printf("10 + 5 = %d\n", a + b); printf("10 * 5 = %d\n", a * b); printf("10 / 5 = %d\n", a / b); return 0; } 함수 main()을 정의하기 위한 시작을 의미하는 중괄호이다. 함수 main() 정의 부분의 종료를 의미하며 함수 main()의 끝 부분에 기술한다.
표현식 expressions 표현식의 예 프로그램 언어에서 변수나 상수, 연산자로 구성된 식을 표현식(expression) 표현식은 항상 결과(반환) 값을 갖음 표현식의 예 표현식(a=2, b=3) 결과값 의미 a 2 변수 하나로 구성된 표현식 10 상수 하나로 구성된 표현식 11.3 실수 상수로 구성된 표현식 a + 11.3 13.3 변수와 상수와 연산자로 구성된 표현식 a – b * 5.0 -13
예제 소스 Expressions.c 정수형 int 변수 두 개를 변수이름 a, b에 각각 선언하고, 초기 값을 10, 5로 저장하여 사칙연산의 결과를 출력
상수(literals) 상수 진수의 표현 소수의 표현 문자와 문자열 100, 34.5와 같은 정수나 소수(실수)는 프로그램에서도 그대로 이용이 가능 진수의 표현 정수 017은 십진수 17이 아니라 8진수 17을 의미 정수 앞에 0(숫자 0)이 나오면 그 다음에 계속되는 수는 8진수 정수 앞에 0x(숫자 0과 알파벳 x, 대문자 X도 가능)는 그 다음 수는 16진수 소수의 표현 상수 32.5E23, 17.1e-3은 지수승을 표현하는 방식으로 각각 32.5*1023과 17.1*10-3을 의미 문자와 문자열 작은 따옴표와 큰 따옴표로 표현 상수 종류 예 정수 상수 10, 2, 017, 0x17, 0X18 실수 상수 3.14, 25.3, 32.5E23, 17.1e-3 문자 상수 ‘A’, ‘+’, ‘\n’ 문자열 상수 “대한민국 2002”
대입문 대입연산자(assignment operator) = int jungsu; //변수_이름 = 표현식; 기호 =도 C 언어에서 자주 이용하는데 대입 연산자로 사용 수학에서는 “우측의 값과 좌측의 값이 같다”라는 의미이나, C 언어에서는 “우측의 값을 좌측의 저장 장소에 저장하라”라는 의미 대입 연산자인 =의 좌측에는 항상 저장 공간인 변수만이 올 수 있음 좌측에는 상수나 상수의 합이 올 수 없음, 다음은 잘못된 문장 7 = 3 + 4; a + b = 5; b + 1 = 1 + b; 대입 연산자인 = 의 우측에는 좌측의 저장공간에 저장할 자료 값을 알 수 있는 표현식이 올 수 있음 a = 3 + 10 * 3; b = a + 2; int jungsu; //변수_이름 = 표현식; jungsu = 17;
대입문의 의미 대입문 int jungsu; jungsu = 17;
예제 소스 Literals.c 정수 상수인 17, 017, 0x17을 int 형 변수 jungsu에 순서대로 저장하고, 각각 출력 값을 알아보는 프로그램 결과 8진수 17이 십진수로는 15이고, 16진수 17이 십진수로 23 변수에 저장하는 과정에서 8진수와 16진수 표현으로 저장하더라도 출력에서는 특별한 변환을 하지 않는 경우, 십진수로 출력
출력 함수 함수 printf 문자열이나 상수, 변수 등을 출력하려면 함수 printf()를 사용 print formatted라는 표현에서 print에 f를 추가하여 만든 C 라이브러리 함수 C 시스템에서 사용자가 바로 이용할 수 있도록 만들어 놓은 함수를 라이브러리 함수 함수 printf()를 사용하려면 전처리기 지시자인 #include <stdio.h>를 이용 헤더 파일 stdio.h 에는 함수 printf()를 비롯한 입출력 함수의 원형(prototype)과 매크로 (macro)가 정의 printf(“제어 문자열(control string)”); printf(“제어 문자열(control string)”, 변수); printf(“제어 문자열(control string)”, 표현식); printf(“제어 문자열(control string)”, 변수나표현식, …);
예제 소스 Printf.c 변수 a, b, sum을 선언하여 a+b의 결과를 출력
출력 제어 제어 문장열 제어 문자열(control string) 만이 있는 경우 제어 문자열에 있는 문자열을 그대로 출력
출력 제어 제어 문장열 printf()는 제어 문자열 다음에 표현식이 오는 구문 제어 문자열 콤마 뒤의 표현식에 대응하는 변환 명세(conversion specification)가 제어 문자열 내부에 존재 간단한 변환 명세는 %와 문자로 구성 변환 명세가 %d로, 표현식 a+b의 결과값이 정수이므로 정수의 십진수(decimal)를 의미하는 d를 기술 변환 명세 %d 부분에는 a+b의 결과 값이 출력 제어문자열의 \t는 수평 탭(horizontal tab)을 의미하는 표현으로 탭만큼의 공간을 비우고 출력하라는 명령
변환명세 출력 값 종류에 따라 표현 변환 명세에는 출력하려는 값의 종류에 따라 여러 문자를 이용한다. 즉 변환 명세는 %와 한 문자나 두 개 문자를 조합해서 출력 값을 표현 제어문자열에도 출력하려는 표현식 값의 종류에 따라 변환 명세도 순서적으로 기술 제어문자열 내부의 변환 명세와 표현식에서, 그 수와 값의 종류가 서로 순서대로 일치해야 함 printf (“ … %d … “, 정수표현식); printf (“ … %c … “, 문자표현식); printf (“ … %f … “, 실수(float)표현식); printf (“ … %lf … “, 실수(double)표현식); printf (“ … %d … %f …“, 정수표현식, 실수표현식);
프로그램 연습 프로그램 목적 정수와 실수를 저장하는 변수를 다루어보고, 저장된 변수 값을 출력하는 출력문 등을 이용한 프로그램을 작성 파일 구성 프로그램 저장 장소 D:\source 폴더 프로젝트 이름 variables 소스 파일 이름 variables.c