본문 바로가기
CS/C

쉽게 풀어쓴 C 언어 EXPRESS 개정 3판 챕터3. C 프로그램 구성요소

by 대니스 2025. 5. 10.

"덧셈" 프로그램 #1

일반적인 프로그램은 외부로부터 데이터를 받아서(입력단계), 데이터를 처리한 후에(처리단계), 결과를 화면에 출력(출력단계)한다.

데이터 입력 -> 데이터 처리-> 결과출력

 

주석

주석이란?

주석 (comment)

- /*와 */로 묶어진 부분

- 프로그램이 하는 일을 설명하는 설명글로서 프로그램의 실행 결과에 영향을 끼치지 않는다

- 프로그램을 읽는 사람을 위한 것이다

- 프로그램의 가독성을 높인다

- 보통 프로그램의 구조와 동작을 설명해주는 문장들이 들어간다

/* 두 수를 더하는 프로그램 */
#include <iostream>

using namespace std;

int main()
{
	return 0;
}

 

주석을 붙이는 방법

- 이중 슬래시(//)는 현재 위치에서부터 줄의 끝까지가 주석이라는 것을 나타낸다

- 주의할 점은 주석 안에 다른 주석이 들어가면 안 된다

/* 한 줄로 된 주석*/

/* 여러
	줄로
    된 주석*/

// 이 줄은 주석이다.

 

주석의 중요성

- 많은 시간이 흘렀다면, 만든 사람이라고 하더라도 내용을 잘 기억할 수 없는 경우도 있기 때문에 주석이 필요하다

- 훨씬 쉽게 프로그램의 내용을 알 수 있다

- 주석을 반드시 추가하는 편이 좋다

- 좋은 주석은 코드를 반복하거나 코드를 설명하지 않는 것이다

- 그 대신 주석에는 코드를 작성한 의도를 명확히 나타내는 편이 낫다

 

들여쓰기

들여쓰기(indentation)

- 소스 코드의 가독성을 높이기 위하여 같은 수준에 있는 문장들을 왼쪽 끝에서 몇 자 안으로 들였는 것이다

- 소스를 보기가 아주 편하다

- 문장은 한 줄에 하나만 쓰는 것이 좋다

- 문장과 문장 사이에 적절한 빈 줄을 두어서 의미적으로 구분하는 것도 프로그램을 이해하는데 도움이 된다

 

전처리기

모든 전처리기 지시어는 # 기호로 시작하고 첫 번째 열부터 시작하는 것이 보통이다

 

헤더파일 (header file)

- 코드의 일부분이 들어 있는 텍스트 파일로서 ".h"의 확장자를 가진다.

- 실제로 stdio.h에는 표준 입력과 표준 출력에 관한 라이브러리 함수들의 정의가 들어있다

 

표준 입력

- 키보드로부터의 입력을 의미

표준 출력

- 모니터로의 출력

 

함수

함수(function)

- 특정 기능을 수행하는 처리 단계들을 괄호로 묶어서 이름을 붙인 것이다

 

함수 안에 들어있는 것

문장(statement)

- 함수의 중괄호 안에는 작업의 세부 단계들이 나열되어 있으며 이러한 작업의 세부 단계를 말한다

- 프로그램을 이루는 가장 기본적인 단위

- 문장이 모여서 함수가 되고 함수가 모여서 프로그램이 된다.

- 문장의 끝은 항상 세미콜론(;)으로 끝나게 된다

 

변수

변수(variable)

- 데이터를 일시적으로 저장할 목적으로 사용하는 메모리 공간

- 변수에도 담을 수 있는 데이터의 종류나 범위에 따라 여러 가지 유형(type)이 있다

 

자료형(data type)

- 변수가 저장할 데이터가 정수인지, 실수인지, 아니면 또 다른 어떤 데이터인지를 지정하는 것

- 자료형에는 정수형, 실수형, 문자형이 있다

- 정수의 범위에 따라 다시 short, int, long, long long으로 나누어진다

- 실수의 범위에 따라 float, double, long double로 나누어진다

- 문자형은 하나의 문자를 나타내는 자료형으로 char 뿐이다

자료형 명칭 크기 표현범위
정수형 char 1byte -128 ~ 127
  short 2byte -32,768 ~ 32,767
  int 4byte -2,147,483,648 ~
2,147,483,647
  long 4byte -2,147,483,648 ~
2,147,483,647
  long long 8byte -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
실수형 float 4byte +-3.4*10^-37 ~ +-3.4*10^38
  double 8byte +-1.7*10^-307 ~
+-3.4*10^308
  long double 8byte 이상 double 이상의 표현범위

변수는 사용하기 전에 선언되어야 한다!

C언어에서 변수를 사용하려면 먼저 변수를 선언해야 한다.

 

변수 선언

- 컴파일러에게 지금부터 이러 이러한 변수를 사용하겠다고 미리 말을 해두는 것

- 어떤 타입의 데이터가 그 변수에 저장되는지도 컴파일러에게 미리 알리는 것이다.

- 변수를 선언하는 것도 하나의 문장이므로 반드시 세미콜론으로 끝나야 한다.

int x;

- 변수는 선언되면 메모리 안에 공간이 확보되며 이 공간에 이름이 매긴다

 

변수의 이름짓기

변수는 반드시 이름이 있어야 한다

변수의 이름이나 함수의 이름은 모두 식별자의 일종이다

 

식별자(identifier)

- 변수 이름, 함수 이름 등에 사용되어서 다른 것들과 식별할 수 있게 해주는 것이다

 

식별자의 규칙

- 영문자와 숫자, 밑줄 문자(_)로 이루어진다

- 중간에 공백이 들어가면 안된다

- 첫 글자는 반드시 영문자 또는 밑줄 기호여야 한다. 숫자로 시작할 수 없다

- 대문자와 소문자는 구별된다. 변수 index, Index, INDEX는 모두 서로 다른 변수이다

- C언어의 키워드와 똑같은 식별자는 허용되지 않는다

 

키워드(keyward)

- C언어에서 고유한 의미를 가지고 있는 특별한 단어이다

- 키워드를 예약어(reserved words)라고도 한다

- 사용자가 다시 정의하거나 사용하는 것이 금지되어 있다.

- 프로그래머들에게는 변수 이름을 짓는 관례(convertion)가 있으며, 이를 따르는 것이 좋다

- 일반적으로 컴파일러는 처음 63개의 문자만을 사용하여 구별한다

- 컴파일러에 따라서는 처음 31개의 문자만을 사용할 수 있는 경우도 있다

- 비주얼 스튜디오에서는 한글도 식별자로 사용할 수 있다. 왜냐하면 유니코드이면 무엇이던지 식별자가 된다

 

좋은 변수 이름

- 변수의 이름을 지을 때는 변수의 역할을 가장 잘 설명하는 이름을 지어야 한다

- 전체 프로그램을 읽기 쉽게 만든다

- 밑줄 문자를 사용하는 것이다

- 첫 번째 글자를 대문자로 하는 것이다.

 

변수 초기화

변수가 선언되면 변수의 값을 아직 정의되지 않은 상태가 된다

 

변수의 초기화(initialization)

- 변수를 선언과 동시에 값을 넣는 방법은 변수 이름 뒤에 =을 붙이고 초기값을 적어 넣으면 된다

- 변수를 선언과 동시에 초기화하는 것은 먼저 선언한 후에 값을 대입하는 것과 동일하다

- 동일한 타입의 변수인 경우, 같은 줄에서 선언과 동시에 변수들을 초기화할 수 있다.

int x=10; // 여기서 10은 초기값이다.
int width=100, height=200;

 

수식과 연산

변수에 값 저장하기

변수에 값을 저장하는 방법은 =연산자가 바로 변수에 값을 저장한다

 

대입 연산자(assignment operator)

- = 연산자 이다

- =의 좌변에는 항상 변수가 위치하고 우변에는 값이 위치한다

- =연산자는 우변의 값을 좌변의 변수에 저장한다

- 변수의 값은 몇 번이든 변경이 가능하다

int value;
value=10;
value=20;

 

- 변수에는 다른 변수의 값도 대입할 수 있다

int value1=10;
int value2;
value2=value1;

 

산술연산

컴퓨터는 기본적으로 계산을 하는 기계이다

프로그램 안에서 산술 연산을 할 수 있다

산술 연산자는 일반적으로 수학에서 사용하는 연산 기호이다

사칙 연산자들은 이항 연산자라고 불리는데 두 개의 피연산자를 가지기 때문이다

 

printf()

라이브러리 함수

- 컴파일러가 프로그래머에게 사용할 수 있도록 제공하는 함수들

 

printf()

- 모니터에 출력을 하기 위한 표준 출력 함수

scanf()

- 키보드에서의 입력을 위한 표준 입력 함수

printf()와 scanf()을 사용하면 형식화된 입출력이 가능하다

 

문자열 출력

printf()를 적어주고 필요한 데이터를 ()안에 넣으면 된다

printf("Hello World!");

함수 호출 시에는 함수 이름 뒤에 괄호를 붙이고 괄호 안에 데이터를 나열하게 된다

 

인수(argument)

- 함수에게 전달하는 데이터

- 함수를 호출하는 측이 함수에게 제공하는 데이터가 된다

 

변수 출력

%d는 출력 형식을 지정한다

형식 지정자 의미
%d 10진 정수로 출력
%f 실수로 출력
%c 문자로 출력
%s 문자열로 출력

형식 지정자와 변수들은 1개 이상일 수 있고 중간에 문자열이 있을 수 있다. 이 경우에는 형식 지정자와 변수들이 다음과 같이 대응된다.

printf("%d %f", number, grade);

형식 지정자의 자리에 변수의 값이 대체되어서 출력된다고 생각하면 된다.

주의할 점은 형식과 변수의 자료형들은 반드시 일치하여야 한다.

 

scanf()

scanf()

- scanf() 함수는 키보드로부터 입력된 데이터를 지정된 형식으로 변환하여 변수에 저장하는 라이브러리 함수이다

 

scanf("%d", &x); //%d는 형식지정자, &x는 값을 지정하는 변수의 주소

- 첫 번째 인수인 "%d"는 형식 지정자로서 정수형의 데이터를 받을 것임을 지정한다

- 두 번째 인수인 &x은 입력을 받을 변수의 주소를 나타낸다

- 변수는 메모리에 생성되고 따라서 주소를 가지고 있다. 변수 이름 앞에 &를 붙이면 변수의 주소를 의미한다.

 

- scanf()기 호출되면 컴퓨터는 사용자가 숫자 입력을 마칠 때까지 기다리게 된다.

형식 지정자 의미
%d 정수를 10진수로 입력한다
%f float 형의 실수를 입력한다
%lf double 형의 실수로 입력한다
%c 문자 형태로 입력한다
%s 문자열 형태로 입력한다.

- double형의 실수는 float 형의 실수보다 더 정밀하다

- 형식 지정자의 타입과 변수의 타입은 일치하여야 한다

- 여기서 형식 지정자가 문자인 경우를 제외하면 scanf()는 모든 여백을 건너뛴다

 

비주얼 스튜디오 2019에서의 scanf_s() 함수

scanf()는 약간의 위험한 함수이다. 변수의 주소를 받아서 변수의 값을 저장함수라서 잘못된 주소가 전달되면 엉뚱한 곳에 값을 저장할 수 있다.

하지만 C언어는 운영체제나 리눅스, 임베디드 프로그래밍에 주로 사용되는데, 그곳에서는 아직도 scanf() 함수가 사용되고 있다

소스 코드의 맨 첫 부분에 _CRT_SECURE_NO_WARNINGS를 정의하고 scanf() 함수를 그대로 사용하기로 하였다

gcc 컴파일러를 사용하는 리눅스 사용자나 임베디드 프로그래머는 _CRT_SECURE_NO_WARNINGS을 사용하지 않아도 된다.