icon

안동민 개발노트

2장 : C프로그래밍

C언어 기본 구조, 변수, 자료형, 입출력

C프로그래밍 학습 절입니다.

이제부터는 C프로그래밍으로 들어갑니다.

1장 1~4절에서는 컴퓨터 내부를 배웠습니다.

0과 1
→ 논리게이트
→ 조합논리회로
→ 순서논리회로

2장 1절부터는 사람이 컴퓨터에게 명령하는 방법을 배웁니다.

이번 절의 핵심은 다음과 같습니다.

C 프로그램은 어떻게 생겼는가?
변수는 무엇인가?
자료형은 왜 필요한가?
printf와 scanf는 어떻게 쓰는가?

이 내용은 네 C프로그래밍 출제범위 중 C프로그램의 구성, 상수와 변수, 자료형과 변수 선언, 선행처리기, 표준 입출력함수에 해당합니다.


C 프로그램 시작

C언어는 무엇인가?

C언어는 컴퓨터에게 명령을 내리는 프로그래밍 언어입니다.

특징은 다음과 같습니다.

특징설명
절차지향 언어위에서 아래로 순서대로 실행하는 방식
컴파일 언어사람이 쓴 코드를 기계어에 가깝게 번역한 뒤 실행
하드웨어와 가까움메모리, 주소, 포인터를 직접 다룰 수 있음
빠름실행 속도가 빠른 편
기초 언어자료구조, 운영체제, 컴퓨터구조 이해에 도움

C는 그냥 코딩 언어 하나가 아닙니다. 나중에 배울 자료구조의 배열·포인터·연결리스트, 운영체제의 메모리 관리, 컴퓨터구조의 기억장치와 주소를 이해하는 데 매우 중요합니다.


프로그램은 어떻게 실행되는가?

C 프로그램은 보통 이런 과정을 거칩니다.

소스 코드 작성
→ 컴파일
→ 실행 파일 생성
→ 실행

1단계: 소스 코드 작성

사람이 C언어 문법으로 코드를 씁니다.

#include <stdio.h>

int main(void) {
    printf("Hello");
    return 0;
}

이런 사람이 읽을 수 있는 코드를 소스 코드라고 합니다.


2단계: 컴파일

컴퓨터는 C언어를 그대로 이해하지 못합니다. 그래서 컴파일러가 C 코드를 컴퓨터가 실행할 수 있는 형태로 바꿉니다.

C 코드 → 컴파일러 → 실행 가능한 프로그램

3단계: 실행

컴파일 결과 만들어진 실행 파일을 실행하면 프로그램이 동작합니다.

C프로그래밍 범위에도 프로그램 개발단계, 소스 코드 생성, 컴파일링, C프로그램의 구성이 포함되어 있습니다.


기본 문법 구조

가장 기본적인 C 프로그램 구조

가장 기본적인 C 프로그램은 이렇게 생겼습니다.

#include <stdio.h>

int main(void) {
    printf("Hello, C");
    return 0;
}

이 코드를 부분별로 살펴보겠습니다.

코드
#include <stdio.h>표준 입출력 기능을 사용하기 위한 준비
int main(void)프로그램이 시작되는 main 함수
{ }실행할 문장들을 묶는 영역
printf("Hello, C");화면에 글자를 출력
return 0;프로그램을 정상 종료

main 함수

C 프로그램은 기본적으로 main 함수에서 시작합니다.

int main(void)

뜻을 나누면 다음과 같습니다.

부분
intmain 함수가 정수를 돌려준다는 뜻
main프로그램 시작점
voidmain 함수가 입력받는 값이 없다는 뜻
main 함수 = C 프로그램의 출발점

이라고 이해하면 됩니다.


문장 끝에는 세미콜론 ;

C언어에서는 대부분의 실행문 끝에 세미콜론을 붙입니다.

printf("Hello");
return 0;

세미콜론은 문장의 마침표 같은 것입니다.

틀린 예
printf("Hello")
return 0
맞는 예
printf("Hello");
return 0;

시험에서 코드가 나왔을 때 세미콜론이 없으면 문법 오류로 볼 수 있습니다.


중괄호 { }

중괄호는 여러 문장을 하나의 덩어리로 묶습니다.

int main(void) {
    printf("Hello");
    return 0;
}

여기서 {부터 }까지가 main 함수의 몸통입니다.

나중에 조건문과 반복문에서도 중괄호를 씁니다.

if (score >= 60) {
    printf("pass");
}

중괄호 안에 있는 문장들이 조건이 맞을 때 실행됩니다.


주석

주석은 컴퓨터가 실행하지 않는 설명입니다.

사람이 코드를 이해하기 쉽게 적어두는 메모입니다.

한 줄 주석

// 이것은 한 줄 주석입니다.

여러 줄 주석

/*
이것은
여러 줄 주석입니다.
*/

주석은 실행 결과에 영향을 주지 않습니다.

printf("A");
// printf("B");

이 코드는 A만 출력됩니다. B 출력문은 주석 처리되어 실행되지 않습니다.


예약어

예약어는 C언어가 이미 특별한 의미로 정해둔 단어입니다.

int
float
char
if
else
for
while
return
break
continue
register

예약어는 변수 이름으로 사용할 수 없습니다.

틀린 예
int for = 10;

왜냐하면 for는 반복문에 쓰이는 예약어이기 때문입니다.

C프로그래밍 예시문제에도 “예약어가 아닌 것은?”이라는 문제가 나오는데, for, break, register는 예약어이고 printf는 함수 이름이지 예약어가 아닙니다.

중요 포인트

printf는 예약어가 아닙니다.
printf는 표준 출력 함수입니다.

이 부분은 시험에서 자주 혼동되는 지점입니다.


변수와 상수

변수란?

변수는 값을 저장하는 이름 붙은 공간입니다.

쉽게 말하면 메모리 안에 이름표를 붙인 상자입니다.

int age = 15;

이 코드는 이렇게 이해하면 됩니다.

age라는 이름의 상자를 만들고,
그 안에 정수 15를 넣습니다.

변수는 값을 바꿀 수 있습니다.

int age = 15;
age = 16;

처음에는 15였지만 나중에 16으로 바뀝니다.

그래서 이름이 변수입니다.

변수 = 변할 수 있는 값

변수 선언

C언어에서는 변수를 사용하기 전에 먼저 선언해야 합니다.

int score;
score라는 이름의 정수형 변수를 만들겠습니다.

변수를 만들면서 값을 바로 넣을 수도 있습니다.

int score = 90;

이것을 초기화라고 합니다.

코드의미
int score;변수 선언
score = 90;값 대입
int score = 90;선언과 동시에 초기화

변수 이름 규칙

변수 이름을 체계 없이 지을 수는 없습니다.

가능

int age;
int student_score;
int score2;
int totalSum;

불가능

int 2score;     // 숫자로 시작 불가
int student-score; // - 사용 불가
int for;        // 예약어 사용 불가

기본 규칙

규칙설명
영문자, 숫자, 밑줄 _ 사용 가능score_1 가능
숫자로 시작 불가2score 불가능
예약어 사용 불가int, for 등 불가능
대소문자 구분scoreScore는 다름

즉, C언어에서 다음 둘은 다른 변수입니다.

int score;
int Score;

상수란?

상수는 변하지 않는 값입니다.

10
3.14
'A'
"Hello"

이런 값들은 프로그램 실행 중에 그 자체로 고정된 값입니다.

상수를 이름으로 정해둘 수도 있습니다.

const 사용

const int MAX = 100;

MAX는 100으로 고정됩니다. 나중에 값을 바꾸려고 하면 오류가 납니다.

MAX = 200; // 오류

#define 사용

#define PI 3.14

이것도 상수를 정의하는 방법입니다.

단, #define은 선행처리기에서 다룹니다. C프로그래밍 범위에도 선행처리기, 파일 포함, 매크로 정의가 포함되어 있습니다.


자료형과 형 변환

자료형이란?

자료형은 변수에 어떤 종류의 값을 저장할지 정하는 것입니다.

예를 들어
int age = 15;
float height = 165.5;
char grade = 'A';

여기서 int, float, char가 자료형입니다.

자료형저장하는 값
int정수
float실수
double더 정밀한 실수
char문자 하나
void값이 없음

자료형이 필요한 이유는 메모리 크기와 해석 방식이 달라지기 때문입니다.

예를 들어 같은 4바이트라도 정수로 해석할지, 실수로 해석할지에 따라 의미가 달라집니다.


대표 자료형

int

정수를 저장합니다.

int age = 15;
int count = -3;

정수는 소수점이 없는 수입니다.

1, 2, 3, 0, -1, -10

float

실수를 저장합니다.

float height = 165.5;

실수는 소수점이 있는 수입니다.

3.14, 12.5, -0.7

double

float보다 더 정밀한 실수를 저장합니다.

double pi = 3.141592;

보통 실수는 double을 많이 씁니다.


char

문자 하나를 저장합니다.

char grade = 'A';

주의해야 합니다.

문자 하나는 작은따옴표를 씁니다.

'A'

문자열은 큰따옴표를 씁니다.

"ABC"
구분
문자 하나'A'
문자열"A" 또는 "ABC"

'A'"A"는 다릅니다.

'A' = 문자 하나
"A" = 문자열

자료형을 왜 조심해야 하는가?

자료형이 다르면 저장 방식과 출력 방식이 달라집니다.

예를 들어
float k = 12.5;
int j;
j = k;
printf("%d", j);

이 코드의 출력은?

12

왜냐하면 실수 12.5를 정수형 변수 j에 넣으면 소수점 아래가 버려지기 때문입니다.

12.5 → 12

C프로그래밍 예시문제에도 이 코드가 나오고 정답은 12입니다.

핵심

실수 → 정수 변환 시 소수점 아래는 버려집니다.

반올림이 아닙니다.

12.9 → 12

이렇게 됩니다.


형 변환

형 변환은 자료형이 바뀌는 것입니다.

크게 두 종류가 있습니다.

종류설명
암묵적 형 변환컴파일러가 자동으로 바꿈
명시적 형 변환개발자가 직접 바꿈

암묵적 형 변환

int a = 10;
float b = a;

정수 10이 실수 10.0처럼 바뀌어 저장됩니다.

명시적 형 변환

float x = 12.5;
int y = (int)x;

(int)를 붙여서 직접 정수로 바꿉니다.

y = 12

입출력

출력 함수 printf

화면에 값을 출력할 때 printf를 사용합니다.

printf("Hello");
결과
Hello

줄바꿈

줄을 바꾸려면 \n을 사용합니다.

printf("Hello\n");
printf("C");
결과
Hello
C

\n은 newline, 즉 줄바꿈입니다.


서식 지정자

변수 값을 출력하려면 서식 지정자를 사용합니다.

int age = 15;
printf("%d", age);
결과
15

여기서 %d는 정수를 출력하라는 뜻입니다.

대표 서식 지정자는 다음과 같습니다.

서식 지정자의미
%d정수 출력10
%f실수 출력3.140000
%c문자 출력A
%s문자열 출력Hello
%lfdouble 입력에 주로 사용scanf에서 중요

주의: printf에서 double도 보통 %f로 출력합니다. 하지만 scanf에서 double을 입력받을 때는 %lf를 씁니다.


printf 예제

#include <stdio.h>

int main(void) {
    int age = 15;
    float height = 165.5;
    char grade = 'A';

    printf("age = %d\n", age);
    printf("height = %f\n", height);
    printf("grade = %c\n", grade);

    return 0;
}
출력
age = 15
height = 165.500000
grade = A

%f는 기본적으로 소수점 아래 6자리까지 출력합니다.


소수점 자리 조절

실수를 소수점 둘째 자리까지만 출력하고 싶으면 이렇게 씁니다.

printf("%.2f", height);
float height = 165.5;
printf("%.2f", height);
출력
165.50
코드
%f실수 기본 출력
%.2f소수점 아래 2자리 출력
%.1f소수점 아래 1자리 출력

여러 값 출력하기

int a = 10;
int b = 20;

printf("%d %d", a, b);
출력
10 20

서식 지정자 개수와 뒤에 오는 변수 개수가 맞아야 합니다.

printf("%d %d", a, b);

여기서는 %d가 2개, 변수도 2개입니다.

틀린 예
printf("%d %d", a);

이런 코드는 위험합니다. 서식 지정자는 2개인데 변수는 1개뿐이기 때문입니다.


입력 함수 scanf

키보드로 값을 입력받을 때는 scanf를 사용합니다.

int age;
scanf("%d", &age);

여기서 중요한 것은 &입니다.

&age = age 변수의 주소

scanf는 입력받은 값을 변수에 직접 넣어야 하므로 변수의 주소를 알아야 합니다.

그래서 보통 변수 앞에 &를 붙입니다.


scanf 예제

#include <stdio.h>

int main(void) {
    int age;

    printf("나이를 입력하세요: ");
    scanf("%d", &age);

    printf("당신의 나이는 %d살입니다.", age);

    return 0;
}
실행 예
나이를 입력하세요: 15
당신의 나이는 15살입니다.

핵심

scanf("%d", &age);

정수 입력에는 %d, 변수 앞에는 &.


여러 값 입력받기

int a, b;
scanf("%d %d", &a, &b);
입력
10 20
그러면
a = 10
b = 20

이 됩니다.

출력까지 해보면
#include <stdio.h>

int main(void) {
    int a, b;

    scanf("%d %d", &a, &b);
    printf("%d + %d = %d", a, b, a + b);

    return 0;
}
입력
10 20
출력
10 + 20 = 30

자료형별 scanf

자료형입력 형식
int%dscanf("%d", &a);
float%fscanf("%f", &x);
double%lfscanf("%lf", &y);
char%cscanf("%c", &ch);
문자열%sscanf("%s", str);

문자열에서는 보통 &를 붙이지 않습니다. 왜 그런지는 배열과 포인터에서 자세히 배웁니다.

지금은 이렇게만 기억해 둡니다.

int, float, double, char 변수 입력 → 보통 & 붙임
문자열 배열 입력 → 보통 & 안 붙임

printfscanf 비교

구분printfscanf
역할출력입력
방향변수 값 → 화면키보드 → 변수
변수 앞 &안 붙임보통 붙임
printf("%d", a);scanf("%d", &a);

이 차이를 반드시 기억해야 합니다.

printf("%d", a);
scanf("%d", &a);

선행처리기와 매크로

#include <stdio.h>가 필요한 이유

printfscanf를 쓰려면 보통 맨 위에 이것을 적습니다.

#include <stdio.h>

stdio.h는 standard input output header의 줄임말입니다.

쉽게 말하면
표준 입출력 기능을 쓰기 위한 설명서

입니다.

printf, scanf 같은 함수가 이 헤더 파일과 관련 있습니다.


선행처리기

#include#define처럼 #으로 시작하는 것은 선행처리기 지시문입니다.

선행처리기는 컴파일 전에 먼저 처리됩니다.

#include

#include <stdio.h>

외부에 있는 헤더 파일을 포함합니다.

#define

#define PI 3.14

코드 안의 PI를 컴파일 전에 3.14로 바꿔줍니다.

#define PI 3.14

int main(void) {
    printf("%f", PI);
    return 0;
}

여기서 PI는 사실상 3.14처럼 사용됩니다.


매크로 함정

C프로그래밍 예시문제에 이런 문제가 나옵니다.

#define SQ(x) x*x

void main() {
    printf("%d", SQ(1+2));
}

보기에는 이렇게 생각하기 쉽습니다.

SQ(1+2) = (1+2) * (1+2) = 9

하지만 실제로는 단순 치환입니다.

SQ(1+2)
→ 1+2*1+2
곱셈이 덧셈보다 먼저이므로
1 + 2*1 + 2
= 1 + 2 + 2
= 5

정답은 5입니다.

올바른 매크로 작성

#define SQ(x) ((x)*(x))

이렇게 괄호를 충분히 붙여야 합니다.

SQ(1+2)
→ ((1+2)*(1+2))
→ 9

입력 주의와 코드 읽기

문자와 문자열 입력 주의

문자 하나는 char에 저장합니다.

char ch;
scanf("%c", &ch);

문자열은 문자 여러 개입니다.

char name[20];
scanf("%s", name);

문자열은 나중에 배열에서 제대로 배웁니다.

지금은 이것만 기억해 둡니다.

구분자료형 예입력
문자 하나char ch;scanf("%c", &ch);
문자열char name[20];scanf("%s", name);

C 코드 읽는 순서

C 코드를 읽을 때는 위에서 아래로 읽되, 실행은 main 함수 안에서 시작한다고 보면 됩니다.

#include <stdio.h>

int main(void) {
    int a = 3;
    int b = 4;
    int c;

    c = a + b;

    printf("%d", c);

    return 0;
}
읽는 순서
1. a라는 정수 변수에 3 저장
2. b라는 정수 변수에 4 저장
3. c라는 정수 변수 선언
4. c에 a+b 결과 저장
5. c 출력
결과
7

대입 연산자 =

C에서 =는 같다는 뜻이 아닙니다.

a = 10;
이것은
a에 10을 넣어라

라는 뜻입니다.

수학의 같다는 뜻은 C에서 보통 ==를 씁니다.

a == 10
이것은
a가 10과 같은가?

라는 뜻입니다.

이번 절에서는 조건문을 본격적으로 배우지는 않지만, 이 차이는 지금부터 기억해야 합니다.

기호
=대입
==비교

초기화하지 않은 변수

C언어에서 변수를 선언만 하고 값을 넣지 않으면 이상한 값이 들어 있을 수 있습니다.

int a;
printf("%d", a);

이 코드는 어떤 값이 나올지 예측하기 어렵습니다.

왜냐하면 a에 값을 넣지 않았기 때문입니다.

좋은 습관
int a = 0;

변수는 가능하면 선언하면서 초기화하는 것이 좋습니다.


이번 절의 핵심 코드

이번 절에서 배운 내용을 모두 넣은 코드입니다.

#include <stdio.h>

#define PI 3.14

int main(void) {
    int age;
    float height;
    char grade;

    printf("나이를 입력하세요: ");
    scanf("%d", &age);

    printf("키를 입력하세요: ");
    scanf("%f", &height);

    printf("등급을 입력하세요: ");
    scanf(" %c", &grade);

    printf("나이: %d\n", age);
    printf("키: %.1f\n", height);
    printf("등급: %c\n", grade);
    printf("PI: %.2f\n", PI);

    return 0;
}

여기서 scanf(" %c", &grade);처럼 %c 앞에 공백이 하나 있습니다.

scanf(" %c", &grade);

이 공백은 이전 입력 뒤에 남은 줄바꿈 문자를 건너뛰는 역할을 합니다. 문자 입력에서는 이런 부분이 헷갈릴 수 있습니다.

지금은 깊게 들어가지 말고 이렇게 기억해 둡니다.

char를 scanf로 입력받을 때는 " %c"처럼 앞에 공백을 넣으면 안전한 경우가 많습니다.

자주 혼동되는 출제 포인트

혼동 포인트 1. printf는 예약어가 아닙니다

for, break, register = 예약어
printf = 함수 이름

C프로그래밍 예시문제에서도 이 포인트가 나옵니다.


혼동 포인트 2. scanf에는 보통 &가 필요합니다

틀린 예
scanf("%d", age);
맞는 예
scanf("%d", &age);

단, 문자열 배열은 예외적으로 보통 &를 붙이지 않습니다.


혼동 포인트 3. 실수를 정수에 넣으면 소수점 아래가 버려집니다

float k = 12.5;
int j;
j = k;
printf("%d", j);
출력
12

반올림이 아닙니다. 버림입니다.


혼동 포인트 4. 문자와 문자열은 다릅니다

'A'   // 문자
"A"   // 문자열

작은따옴표와 큰따옴표를 구분해야 합니다.


혼동 포인트 5. ===는 다릅니다

a = 10;   // a에 10을 넣음
a == 10;  // a가 10인지 비교

혼동 포인트 6. 매크로는 단순 치환입니다

#define SQ(x) x*x
SQ(1+2)
결과는
1+2*1+2 = 5

괄호가 없으면 의도와 다르게 계산됩니다.


이번 절의 핵심 정리

C 기본 구조

#include <stdio.h>

int main(void) {
    printf("Hello");
    return 0;
}

변수 선언

int age;
float height;
char grade;

초기화

int age = 15;

출력

printf("%d", age);

입력

scanf("%d", &age);

대표 자료형

자료형의미
int정수
float실수
double더 정밀한 실수
char문자 하나
void값 없음

대표 서식 지정자

서식의미
%d정수
%f실수
%c문자
%s문자열
%lfdouble 입력

핵심 한 문장

이번 절의 핵심을 한 문장으로 정리하면 다음과 같습니다.

C 프로그램은 main 함수에서 시작하고, 변수는 값을 저장하는 공간이며, 자료형은 저장할 값의 종류를 정하고, printf와 scanf로 출력과 입력을 처리합니다.
더 짧게
main = 시작점
변수 = 저장 공간
자료형 = 값의 종류
printf = 출력
scanf = 입력

확인 문제

문제 1

C 프로그램이 기본적으로 시작되는 함수는?

① start ② main ③ printf ④ include


문제 2

다음 중 C언어 예약어가 아닌 것은?

① for ② break ③ printf ④ register


문제 3

정수형 변수를 선언할 때 사용하는 자료형은?

① char ② int ③ float ④ double


문제 4

문자 하나를 저장하는 자료형은?

① int ② float ③ char ④ string


문제 5

화면에 값을 출력할 때 사용하는 함수는?

① scanf ② printf ③ input ④ printline


문제 6

키보드로 정수 값을 입력받는 코드로 알맞은 것은?

scanf("%d", a);scanf("%d", &a);printf("%d", &a);printf("%d", a);


문제 7

다음 코드의 출력 결과는?

float k = 12.5;
int j;
j = k;
printf("%d", j);

① 12 ② 13 ③ 12.5 ④ 12.5000


문제 8

문자 하나를 나타내는 올바른 표현은?

"A"'A'A{A}


문제 9

다음 중 대입 연산자는?

===!=>=


문제 10

다음 매크로가 있을 때 SQ(1+2)의 실제 계산 결과는?

#define SQ(x) x*x

① 3 ② 5 ③ 6 ④ 9


정답과 해설은 절별 확인문제 정답해설에서 확인합니다.

다음 2장 2절은 C 연산자, 조건문, 반복문입니다. 2장 1절이 변수에 값을 넣고 출력하는 법이었다면, 2장 2절은 그 값으로 계산하고, 판단하고, 반복하는 법입니다.

목차

C 프로그램 시작
C언어는 무엇인가?
프로그램은 어떻게 실행되는가?
1단계: 소스 코드 작성
2단계: 컴파일
3단계: 실행
기본 문법 구조
가장 기본적인 C 프로그램 구조
main 함수
문장 끝에는 세미콜론 ;
중괄호 { }
주석
한 줄 주석
여러 줄 주석
예약어
중요 포인트
변수와 상수
변수란?
변수 선언
변수 이름 규칙
가능
불가능
기본 규칙
상수란?
const 사용
#define 사용
자료형과 형 변환
자료형이란?
대표 자료형
int
float
double
char
자료형을 왜 조심해야 하는가?
핵심
형 변환
암묵적 형 변환
명시적 형 변환
입출력
출력 함수 printf
줄바꿈
서식 지정자
printf 예제
소수점 자리 조절
여러 값 출력하기
입력 함수 scanf
scanf 예제
핵심
여러 값 입력받기
자료형별 scanf
printfscanf 비교
선행처리기와 매크로
#include <stdio.h>가 필요한 이유
선행처리기
#include
#define
매크로 함정
올바른 매크로 작성
입력 주의와 코드 읽기
문자와 문자열 입력 주의
C 코드 읽는 순서
대입 연산자 =
초기화하지 않은 변수
이번 절의 핵심 코드
자주 혼동되는 출제 포인트
혼동 포인트 1. printf는 예약어가 아닙니다
혼동 포인트 2. scanf에는 보통 &가 필요합니다
혼동 포인트 3. 실수를 정수에 넣으면 소수점 아래가 버려집니다
혼동 포인트 4. 문자와 문자열은 다릅니다
혼동 포인트 5. ===는 다릅니다
혼동 포인트 6. 매크로는 단순 치환입니다
이번 절의 핵심 정리
C 기본 구조
변수 선언
초기화
출력
입력
대표 자료형
대표 서식 지정자
핵심 한 문장
확인 문제
문제 1
문제 2
문제 3
문제 4
문제 5
문제 6
문제 7
문제 8
문제 9
문제 10