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)뜻을 나누면 다음과 같습니다.
| 부분 | 뜻 |
|---|---|
int | main 함수가 정수를 돌려준다는 뜻 |
main | 프로그램 시작점 |
void | main 함수가 입력받는 값이 없다는 뜻 |
main 함수 = C 프로그램의 출발점이라고 이해하면 됩니다.
문장 끝에는 세미콜론 ;
C언어에서는 대부분의 실행문 끝에 세미콜론을 붙입니다.
printf("Hello");
return 0;세미콜론은 문장의 마침표 같은 것입니다.
printf("Hello")
return 0printf("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 등 불가능 |
| 대소문자 구분 | score와 Score는 다름 |
즉, 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, -10float
실수를 저장합니다.
float height = 165.5;실수는 소수점이 있는 수입니다.
3.14, 12.5, -0.7double
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 → 12C프로그래밍 예시문제에도 이 코드가 나오고 정답은 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 |
%lf | double 입력에 주로 사용 | 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 20a = 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 2010 + 20 = 30자료형별 scanf
| 자료형 | 입력 형식 | 예 |
|---|---|---|
int | %d | scanf("%d", &a); |
float | %f | scanf("%f", &x); |
double | %lf | scanf("%lf", &y); |
char | %c | scanf("%c", &ch); |
| 문자열 | %s | scanf("%s", str); |
문자열에서는 보통 &를 붙이지 않습니다.
왜 그런지는 배열과 포인터에서 자세히 배웁니다.
지금은 이렇게만 기억해 둡니다.
int, float, double, char 변수 입력 → 보통 & 붙임
문자열 배열 입력 → 보통 & 안 붙임printf와 scanf 비교
| 구분 | printf | scanf |
|---|---|---|
| 역할 | 출력 | 입력 |
| 방향 | 변수 값 → 화면 | 키보드 → 변수 |
변수 앞 & | 안 붙임 | 보통 붙임 |
| 예 | printf("%d", a); | scanf("%d", &a); |
이 차이를 반드시 기억해야 합니다.
printf("%d", a);
scanf("%d", &a);선행처리기와 매크로
#include <stdio.h>가 필요한 이유
printf와 scanf를 쓰려면 보통 맨 위에 이것을 적습니다.
#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+21 + 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 == 10a가 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 | 문자열 |
%lf | double 입력 |
핵심 한 문장
이번 절의 핵심을 한 문장으로 정리하면 다음과 같습니다.
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절은 그 값으로 계산하고, 판단하고, 반복하는 법입니다.