딱지 지도 — 지금 여기
- 횟수·거리·등급에 맞는 칸 종류를 골라요.
- 칸을 만들면서 첫 값을 넣고, 나중에 값을 바꿔요.
- 칸의 종류에 맞는 출력 표시를 골라요.
- 바꾸지 않을 칸에
const를 붙여요.
int·double·char 칸에 담고, printf의 %d·%.1f·%c에 맞춰 보여 줘요.지난 강에서 오늘로 · 글 대신 칸의 값을 보여 줄까요?
1강에서는 printf에게 글을 건넸어요. 줄을 바꾸려면 \n, 띄우려면 따옴표 안에 빈칸을 직접 넣었지요. return 0;은 화면 출력이 아니라 종료 보고였고요.
오늘은 산책 기록을 맡겨 둘 이름 붙인 칸을 만들어요. 매번 숫자를 printf 안에 직접 고쳐 쓰는 대신, 칸의 이름으로 지금 값을 찾아 보여 줄 거예요.
- 횟수·거리·등급에 맞는 칸 종류를 골라요.
- 칸을 만들면서 첫 값을 넣고, 나중에 값을 바꿔요.
- 칸의 종류에 맞는 출력 표시를 골라요.
- 바꾸지 않을 칸에
const를 붙여요.
오늘의 도착점: 횟수·거리·등급을 int·double·char 칸에 담고, printf의 %d·%.1f·%c에 맞춰 보여 줘요.
날짜: 1강 printf 실행: 했어요 아직
종류를 영어로 타입, 우리말로 자료형이라고 해요. 오늘은 같은 뜻으로 읽어요. %.1f는 %f의 친척이에요. 소수점 아래 한 자리까지 보여 달라는 표시예요.
가리고 짝을 말해요. 정수 칸은 , 거리 칸은 , 영문 등급 한 글자 칸은 . 답: int / double / char.
산책 모임 기록대에 작은 서랍 셋이 있어요. 횟수 서랍, 거리 서랍, 등급 한 글자 서랍이에요. 서랍 밖에는 각각 이름표를 붙여요. “거리 얼마였지?” 하고 찾을 때 이름표가 도움이 되지요.
컴퓨터에서는 지금 쓰는 내용을 메모리에 둬요. 변수는 값을 담아 두고 이름으로 찾아 쓰는 메모리 칸이라고 생각해요. 이름표는 distance, 안의 내용은 2.5, 칸의 종류는 double처럼 나누어 봐요. 변수라는 말에 ‘수’가 들어 있어도 글자를 담을 수 있어요.
왜 이름 앞에 종류를 적을까요? C가 번역할 때 이 칸에 값을 어떤 방식으로 저장하고 읽을지 알아야 하기 때문이에요. 종류에 따라 필요한 자리와 다루는 규칙이 달라요. 이름만 distance라고 붙여서는 종류를 알 수 없어요. C가 영어 뜻을 짐작해 주지는 않아요.
서랍 비유에는 한계가 있어요. 실제 메모리에 나무 서랍이 있지는 않고, 서로 다른 종류를 넣으려 할 때 언제나 빌드가 막히는 것도 아니에요. 숫자 종류 사이에는 변환이 일어날 수도 있어요. 그 계산·변환은 3강에서 봐요. 오늘은 처음부터 맞는 종류와 값을 짝지어요.
그림은 개념도예요. 칸의 실제 크기·주소·배치를 그린 것이 아니며, 같은 크기의 상자가 같은 저장 크기를 뜻하지 않아요. 오늘은 바이트 수를 외우지 않아요.
OnlineGDB의 오른쪽 위 Language가 C인지 확인해요. 편집 영역 안을 클릭하고 Windows는 Ctrl+A, Mac은 Command+A로 코드만 선택해 아래 코드로 바꿔요. 초록 Run을 한 번 눌러요. 옆의 작은 ▼는 누르지 않아요.
#include <stdio.h>int main(void) { int count = 3; double distance = 2.5; char grade = 'A'; printf("%d %.1f %c\n", count, distance, grade); return 0;}
3 2.5 A
count는 횟수, distance는 거리, grade는 등급이라는 뜻으로 우리가 고른 이름이에요. C 명령이 아니에요. 오늘은 책과 똑같이 써요. 영어 소문자·숫자·밑줄로 이름을 만들되 숫자로 시작하지 않고, 중간에 빈칸을 넣지 않아요. int 같은 C의 정해진 말이나 이미 쓰는 printf는 내 칸 이름으로 고르지 않아요. Count와 count도 다른 이름이에요.
위아래 틀인 #include, int main(void) {, return 0;, 마지막 }는 그대로 둬요. 오늘 바꿀 곳은 중괄호 안의 칸 만들기와 printf 줄이에요.
조각 읽기 ① · int count = 3;
int / count / = / 3 / ;
| 조각 | 이름 → 하는 일 | 화면에 나오나요? |
|---|---|---|
① int | 자료형 → 정수 칸으로 정해요 | 아니요 |
② count | 변수 이름 → 이 칸을 찾을 이름표예요 | 아니요 |
③ = | 첫 값을 넣는 표시 → 오른쪽 값을 왼쪽 칸에 넣어요 | 아니요 |
④ 3 | 값 → 처음 담을 내용이에요 | 이 줄만으로는 안 나와요 |
⑤ ; | 세미콜론 → 이 선언을 마쳐요 | 아니요 |
우리말 한 문장: “정수 칸을 count라는 이름으로 만들고, 첫 값 3을 넣어요.”
칸의 종류와 이름을 알리는 일을 선언, 만들면서 첫 값을 넣는 일을 초기화라고 해요. 이 줄은 둘을 함께 해요. 숫자 3에는 따옴표를 붙이지 않아요. double distance = 2.5;도 같은 순서예요. double 칸 distance를 만들며 2.5를 넣어요. 소수점은 점 .이에요.
조각 읽기 ② · char grade = 'A';
char / grade / = / ' / A / ' / ;
첫 세 조각은 글자 칸 / 이름 grade / 첫 값 넣기예요. 다음의 반듯한 작은따옴표 ' 한 쌍은 글자 하나를 나타내는 경계, 그 안의 A는 담을 글자, 끝 ;는 선언 끝이에요. 이 일곱 조각도 이 줄만으로 화면에 나오지는 않아요.
우리말 한 문장: “글자 칸 grade를 만들고, 첫 글자 A를 넣어요.”
한/영 전환으로 영문 입력 상태를 확인하고, 키보드의 반듯한 작은따옴표를 써요. 굽은 ‘ ’는 쓰지 않아요. 편집기가 닫는 따옴표를 자동으로 넣으면 또 넣지 말고 짝을 대조해요. 오늘 char에는 A·B처럼 영문 한 글자만 써요. 한글 한 글자가 char 한 칸에 들어간다고 생각하지 않아요.
조각 읽기 ③ · printf에 틀과 값을 함께 건네요
예제 1의 긴 줄에서 정수만 먼저 읽어요. printf("%d\n", count);
printf / ( / " / %d / \n / " / , / count / ) / ;
| 조각 | 이름 → 하는 일 | 화면에 나오나요? |
|---|---|---|
① printf | 함수 → 화면에 보여 주는 일을 맡아요 | 이름은 안 나와요 |
②·⑨ ( ) | 소괄호 → 함수에 건넬 내용을 감싸요 | 아니요 |
③·⑥ " " | 큰따옴표 → 출력 틀의 경계예요 | 아니요 |
④ %d | 서식 지정자 → 다음 정수 값을 끼워 넣을 자리예요 | %d 대신 값의 숫자 모양이 나와요 |
⑤ \n | 줄바꿈 → 다음 출력 자리를 아래로 옮겨요 | 기호 대신 줄이 바뀌어요 |
⑦ , | 쉼표 → 틀과 건넬 값을 구분해요 | 빈칸도 쉼표도 안 나와요 |
⑧ count | 변수 이름 → 지금 칸에 든 값을 찾아 건네요 | count 대신 그 값이 나와요 |
⑩ ; | 세미콜론 → 부탁 문장을 마쳐요 | 아니요 |
우리말 한 문장: “printf에게 정수 자리와 줄바꿈이 있는 틀, count의 현재 값을 건네어 보여 달라고 해요.”
서식 지정자는 값을 어떤 모양으로 보여 줄지 정하는 표시예요. 이제 예제 1로 돌아가요. 큰따옴표 안의 %d, %.1f, %c에, 쉼표 뒤의 count, distance, grade를 차례대로 짝지어요. 사이의 빈칸은 따옴표 안에 직접 적었어요.
예제 2 · 같은 거리, 보여 주는 자리만 달라요
#include <stdio.h>int main(void) { double distance = 2.5; printf("%f\n", distance); printf("%.1f\n", distance); return 0;}
2.500000 2.5
%.1f 안을 % / . / 1 / f로 읽어요. 서식 시작 / 소수점 아래 자리 수 표시 / 한 자리 / 소수점 모양이에요. 네 조각 자체는 출력되지 않고 값의 표시 모양을 정해요. 우리말로 “소수점 아래 한 자리까지 보여 줘요.”예요. 자릿수를 줄일 때는 반올림되어 보일 수 있어요.
예제 3 · 칸은 그대로, 내용만 다시 넣어요
#include <stdio.h>int main(void) { int count = 3; printf("%d\n", count); count = 5; printf("%d\n", count); return 0;}
3 5
새 줄을 count / = / 5 / ;로 읽어요. 기존 칸의 이름 / 대입 / 새 값 / 문장 끝이에요. 이 네 조각만으로 출력은 없어요. 우리말로 “오른쪽 5를 왼쪽 count 칸에 넣어요.” 이렇게 기존 칸에 값을 넣는 일을 대입, 다시 넣으면 재대입이라고 해요. 이름도 종류 int도 그대로이고, 현재 내용만 5가 돼요. 처음의 3이 더해지는 것은 아니에요.
1강에서 남겨 둔 말 · int와 void
이제 int main(void)의 int가 조금 익숙하지요? int count는 칸에 담을 값의 종류, int main은 함수가 끝날 때 돌려줄 값의 종류를 알려 줘요. 그래서 main 끝의 return 0;도 정수 0을 돌려줘요.
괄호 안 void는 이 함수가 시작할 때 받을 값이 없다는 표시예요. 빈 칸을 만드는 자료형으로 따라 쓰는 것이 아니고, 중괄호 안에 할 일이 없다는 뜻도 아니에요. 받을 것과 돌려줄 것은 서로 다른 방향이에요. 함수의 종류·받을 값·void의 다른 쓰임은 6강에서 다시 정리해요.
예제 4 · 바꾸지 않을 목표에는 const
#include <stdio.h>int main(void) { const int goal = 6; printf("%d\n", goal); return 0;}
6
const / int / goal / = / 6 / ;로 나누어요. 나중에 변경 금지 / 정수 칸 / 이름 / 첫 값 넣기 / 첫 값 / 선언 끝이에요. 이 선언 자체는 화면에 나오지 않아요. 우리말로 “나중에 바꾸지 않을 정수 칸 goal을 만들며 6을 넣어요.” 목표처럼 실행 중 바뀌면 안 될 값에 써요. 이 강에서는 이런 칸을 ‘상수용 칸’이라고 부를게요.
일부러 빌드만 확인할 코드예요. 이 상자도 독립 예제예요.
#include <stdio.h>int main(void) { const int goal = 6; goal = 8; printf("%d\n", goal); return 0;}
빌드 결과: 실패 — const로 정한 goal에 다시 대입할 수 없어요. 실행 결과는 없어요. 오류 메시지의 정확한 위치·문구는 컴파일러에 따라 달라요. 첫 error 줄을 보고 goal = 8; 줄을 지워 예제 4로 돌린 뒤 다시 Run해요. 고친 뒤 출력은 위와 같은 6이에요.
예제 5 · 쉼표만 넣으면 글이 이어질까요?
1강에서 미뤄 둔 줄이에요. 이제 printf의 첫 글이 출력 틀이라는 것을 알았으니 읽어 봐요.
#include <stdio.h>int main(void) { printf("사과", "배"); return 0;}
사과 — 마지막 글자 뒤에 줄바꿈 없이 끝나요.
printf는 줄을 저절로 바꾸지 않아요. 이 출력 틀에는 \n이 없으므로 사과 뒤에서 그대로 끝나요. 아래 고친 예제는 \n을 넣었으므로 줄도 바뀌어요.
"사과"에 추가 값을 끼울 자리가 없어서 뒤의 "배"는 출력에 쓰이지 않아요. 두 글을 건넸다고 자동으로 붙이거나 띄워 주지 않아요. OnlineGDB 기본 설정에서는 경고가 보이지 않을 수도 있어요. 추가 경고 옵션을 켠 검증에서는 남는 값에 대한 경고를 확인했어요. 의도한 경고 예제이며, 따라 쓸 바른 출력법은 아니에요.
고친 독립 예제:
#include <stdio.h>int main(void) { printf("사과 배\n"); return 0;}
사과 배
예제 3을 위에서 아래로 따라가요. 칸에 넣는 일과 보여 주는 일을 나누면 쉬워요.
| 처리한 줄 | count의 현재 값 | 그 줄에서 새로 출력한 것 |
|---|---|---|
int count = 3; | 3 | 없음 |
| 첫 printf | 3 | 3과 줄바꿈 |
count = 5; | 5 | 없음 |
| 둘째 printf | 5 | 5와 줄바꿈 |
이번에는 예제 1을 가리고 채워요.
| 이름 | 종류 | 첫 값 | 출력 표시 |
|---|---|---|---|
| count | |||
| distance | |||
| grade |
대조 답: int / 3 / %d, double / 2.5 / %.1f, char / 'A' / %c예요.
| 내가 실행할 예제 | 예상 결과 | 실제 결과 | 대조 |
|---|---|---|---|
| 예제 1 | 같음 다름 | ||
| 예제 2 | 같음 다름 | ||
| 예제 3 | 같음 다름 |
실행하지 않은 실제 결과 칸은 비워 두어요. 사이트가 덧붙이는 초록 종료 안내는 내 출력에 포함하지 않아요. 빌드 성공 / 종료 상태 0 / 원하는 출력은 각각 확인해요.
앞을 가려요. 빈칸과 번호는 종이 연습용이에요. 실행기에는 완성한 코드만 넣어요.
1. 이름 고르기. 횟수 칸 이름으로 쓸 수 있는 것은? count 2count walk count
2. 짝 맞추기. int / double / char를 %c / %d / %.1f와 연결해요.
3. 한 줄 조립. int / count / = / 4 / ;를 이어 칸을 만들어요. 첫 값을 넣는 일을 무엇이라고 하나요?
4. 틀 보고 가운데 바꾸기. 예제 1의 틀을 보고 첫 값만 횟수 4, 거리 1.5, 등급 B로 바꿔요. printf 줄은 그대로 두어요.
5. 도전 · 전체 쓰기. const int 칸 goal을 7로 초기화하고, 그 값을 한 줄로 보여 주는 프로그램을 써요. 막힌 틀은 예제 4를 봐도 괜찮아요. 틀 전체 암기보다 내 손으로 바꾼 줄을 설명하는 것이 먼저예요.
내 코드:
직접 쓰기 대조 답
1은 count, 2는 int–%d / double–%.1f / char–%c, 3은 int count = 4;, 초기화예요. 3의 줄은 아래 완성 코드 안에서 실행해요.
연습 4 완성 코드:
#include <stdio.h>int main(void) { int count = 4; double distance = 1.5; char grade = 'B'; printf("%d %.1f %c\n", count, distance, grade); return 0;}
4 1.5 B
연습 5 완성 코드:
#include <stdio.h>int main(void) { const int goal = 7; printf("%d\n", goal); return 0;}
7
직접 친 뒤에는 따옴표·소괄호·중괄호의 짝, 선언·대입·printf·return 뒤의 ;, 종류와 출력 표시의 짝을 확인해요. 줄바꿈은 /n이 아니라 역슬래시 키(₩ 모양 키)와 소문자 n으로 \n이에요.
고친 곳: 새로 Run한 실제 출력:
두 문제 모두 학습용 창작 문항이에요. 기출이나 기본서 문제를 옮기거나 변형하지 않았어요.
문제 1. 다음 프로그램의 실행 결과를 쓰시오.
#include <stdio.h>int main(void) { int count = 2; char grade = 'C'; count = 4; printf("%c %d\n", grade, count); return 0;}
내 답: 마지막 count의 값:
정답먼저 풀고 눌러서 펼쳐 보세요
C 4
해설: count는 2로 시작하지만 출력 전에 4가 들어가요. 출력 틀의 첫 자리는 %c라 grade의 C, 다음은 빈칸, %d 자리에는 count의 현재 값 4가 나와요. 선언한 칸의 순서가 아니라 printf에 건넨 값의 순서로 짝지어요. 끝의 \n에서 다음 출력 자리가 아래 줄로 옮겨요.
문제 2. 가장 알맞은 설명을 고르시오.
'B'를 쓴다.내 답: 이유:
정답먼저 풀고 눌러서 펼쳐 보세요
첫 값을 준비해야 하며, 쉼표는 건넬 내용을 나눌 뿐이에요. const는 초기화 뒤 값을 바꾸지 못하게 하는 표시이지 대문자 명령이 아니에요.
딱지 떼기
도장
정답을 가리고 내 말로 답한 뒤 체크해요. 아직 답하지 못하면 비워 두어도 돼요.
- 칸의 이름·종류·내용은 각각 무엇인가요? (예제 1)
- 왜 이름 앞에 int나 double을 적나요? (저장하고 읽는 규칙을 정해요)
- 선언만 한 것과 초기화까지 한 것은 어떻게 다른가요?
- count = 5;를 어느 방향으로 읽나요? 화면에도 5가 바로 나오나요?
- 'A'와 "A"를 왜 구별하나요? 문자열은 몇 강에서 담아 보나요?
- double 값을 보여 줄 때 어떤 표시를 쓰나요? %.1f는 칸 속 값을 바꾸나요?
- main의 int와 괄호 안 void는 각각 나가는 것과 들어오는 것 중 어느 쪽인가요?
- const가 붙은 칸의 값을 다시 넣으려 하면 어디서 멈추나요?
- 경고가 안 보였는데도 사과만 나온 까닭을 설명할 수 있나요?
- 직접 바꾼 세 칸을 실행하고 내 예상과 실제 출력을 대조했나요?
다시 볼 곳 하나: 내가 설명할 한 줄:
3강 예고 · 칸에 넣기 전에 계산해요
오늘은 종류를 정해 칸을 만들고, 값을 넣고, 맞는 표시로 보여 주었어요. 다음에는 그 칸에 담을 값을 계산해요. 7을 2로 나눴는데 왜 3이 나올까요? 정수 계산과 소수점 계산을 나누고, 원하는 결과가 나오도록 종류를 바꾸는 방법을 3강에서 만나요.
출처·저작 메모
- 산책 기록 비유·수치·코드·문항·그림은 이 강을 위해 새로 만들었어요. 다른 교재의 본문·문제·코드는 사용하지 않았어요.
- 개념은 ISO C17 표준의 초기화·대입·형식 출력·const 규칙을 기준으로 했어요. 코드 상자는 GCC로 직접 빌드·실행해 결과를 확인했어요. OnlineGDB의 컴파일러 버전에 따라 경고·메시지 문구는 조금 다를 수 있어요.
- 외부 이미지·아이콘은 사용하지 않았어요.