해당 C언어 시리즈는 처음 코딩을 접하는 사람들이 쉽게 이해할 수 있도록 작성되었습니다.
우리는 이미 "나의 첫 프로그램. Hello, World!"에서 printf를 사용해 본 적이 있습니다.
printf는 이전에 언급했듯이 출력하다의 print와 정형화된의 formatted가 합쳐진 말입니다. 정형화된 출력 함수라고 보면 됩니다.
변수가 가지고 있는 값을 원하는 형태로 출력할 수 있다는 장점이 있기에 C언어에서는 출력 함수 중 printf를 가장 많이 사용합니다. 다른 출력 함수도 중요하지만 printf만 잘 활용해도 대부분의 출력 작업을 할 수 있기에 꼭 익혀두셨으면 합니다.
printf는 서식 지정자(포맷 스트링)라는 형식을 제공합니다. 서식 지정자는 데이터를 출력할 때 어떠한 형태로 출력할지 지정하는 걸 의미합니다.
위의 표에 %d, %f, %lf, %c 등 의미를 도대체 알 수 없는 문자들이 쓰여 있습니다. 늘 강조하듯 코딩을 공부할 때는 어떤 단어의 약자인지 알아두는 게 좋습니다. 원말을 알면 이해도도 높아지고 기억도 오래가기 때문이죠.
다음은 서식 지정자의 원말입니다.
- %d: decimal(10진법의)
- %hd: short decimal
- %u: unsinged(음수를 제외하고 0, 양수만 사용)
- %o: octal(8진법의)
- %x: hexadecimal(16진법의)
- %f: float
- %lf: long float(double)
- %c: character(문자)
- %s: string(문자열: 문자 2개 이상을 뜻함)
원말과 대조하여 꼭 외워주시기 바랍니다.
printf("문자열");
printf는 기본적으로 printf("");의 형태를 가집니다.
출력하고자 하는 문구를 큰따옴표 안에 넣어주면 문구가 출력됩니다.
printf("C언어 프로그래밍");
위의 코드는 다음과 같은 출력값을 가집니다.
C언어 프로그래밍
printf("서식 지정자", 서식 지정자에 부합하는 출력 대상);
위의 형식만 봐서는 이해가 힘들 거라 생각합니다.
다음의 코드를 참고하시면 됩니다.
#include <stdio.h>
void main(void)
{
int number = 3;
printf("%d", number);
}
변수 number에 값 3이 들어있습니다.
printf 함수를 보면 "" 안에 %d가 들어있음을 확인할 수 있습니다.
%d를 통해 10진 정수의 값을 출력합니다.
"" 뒤에는 ,와 함께 서식 지정자와 매칭되는 값이 옵니다.
, 뒤에 number가 있는 걸 보니 변수 number의 값을 출력하려고 하는 걸 알 수 있습니다.
%d와 변수 number가 매칭되므로 number의 값 3이 출력됩니다.
3
#include <stdio.h>
void main(void)
{
int number1 = 3;
int number2 = 5;
printf("%d %d", number1, number2);
}
그렇다면 printf의 "" 안에 서식 지정자가 여러 개 있다면 어떻게 될까요?
"" 안의 서식 지정자가 , 뒤의 값과 순서대로 매칭이 됩니다. 첫 번째 %d는 number1, 두 번째 %d는 number2와 매칭됩니다. 따라서 다음과 같은 결과가 출력됩니다.
3 5
다음은 이전에 배운 아스키 코드를 이용한 예시입니다.
#include <stdio.h>
void main(void)
{
char ch = 65;
printf("%c의 ASCII 값은 %d입니다.", ch, ch);
}
A의 ASCII 값은 65입니다.
아스키 코드표에서 10진 정수 65는 영문자 A와 매칭됩니다.
첫 번째 서식 지정자는 아스키 코드 표의 문자를 출력하는 %c이기 때문에 변수 ch의 값 65와 매칭되는 영문자 A가 출력됩니다.
두 번째 서식 지정자 %d는 10진 정수를 출력하기 때문에 변수 ch의 값을 그대로 출력하게 됩니다.
- 출력 칸 수 조절
- 좌/우 정렬
- 공백 대체
- 실수의 소수점 자릿수 조절
서식 지정자는 특수기호 %와 영문자의 조합으로 이루어져 있습니다.
특수기호 %와 영문자 사이에 숫자를 넣어주면 값이 출력되는 칸 수를 조절할 수 있습니다.
#include <stdio.h>
void main(void)
{
int number = 3;
printf("[%d] [%3d]", number);
}
[3] [ 3]
위 코드와 같이 %와 d 사이에 3이라는 숫자를 넣으면 값을 출력할 때 자릿수와 무관하게 3칸을 확보하고 출력하게 됩니다. 따라서 [ 3]과 같이 공백 두 칸과 숫자 3 한 칸, 총 3칸이 출력됩니다.
출력 칸 수 조절 코드에서는 값이 우측으로 정렬되어 나왔다는 사실을 알 수 있습니다.
필요에 따라 옵션을 통해 좌측으로 정렬할 수도 있습니다.
#include <stdio.h>
void main(void)
{
int number = 3;
printf("[%d] [%-3d]", number);
}
[3] [3 ]
C언어에서 수학에서와 마찬가지로 +를 생략할 수 있습니다.
특수기호 %와 영문자 d 사이에 표시를 하지 않았지만 +가 기본으로 들어가 있기 때문에 값이 우측으로 정렬되어 왔던 겁니다. 위 코드처럼 - 옵션을 넣어주면 출력 결과와 같이 값이 좌측으로 정렬시킬 수 있습니다.
출력 칸 수를 늘렸을 때 문제점 중 하나는 총 몇 칸인지 알기 힘들다는 겁니다. 이러한 상황에서 해결 방법이 하나 있는데 바로 0이라는 옵션을 주는 겁니다.
#include <stdio.h>
void main(void)
{
int number = 3;
printf("[%d] [%03d]", number);
}
[3] [003]
특수기호 %와 출력 칸 수를 조절하는 숫자 사이에 0이라는 옵션을 넣어주면 빈 출력 칸 대신 0을 넣을 수 있습니다.
#include <stdio.h>
void main(void)
{
float pi = 3.141592f;
printf("[%f]", pi);
}
[3.141592]
위 출력 결과를 보면 소수를 출력할 때 소수점 아래 6자리까지 출력되는 걸 확인할 수 있습니다. 출력할 때 소수점 아래 자릿수 역시 마찬가지로 조절할 수 있습니다.
#include <stdio.h>
void main(void)
{
float pi = 3.141592f;
printf("[%.4f]", pi);
}
[3.1416]
소수점 아래 넷째 자리까지 출력된 걸 볼 수 있습니다.
여기서 주의할 점이 하나 있습니다. 소수점 아래로 자리를 끊어 출력할 때 반올림하여 출력한다는 겁니다. 3.14159이기 때문에 다섯 번째 자리 9를 반올림하여 넷째 자리 5가 6으로 바뀝니다.
#include <stdio.h>
void main(void)
{
float pi = 3.141592f;
printf("[%7.4f]", pi);
}
[ 3.1416]
위 코드는 출력 칸 수와 소수점 자릿수를 모두 조정한 결과입니다.
그런데 이상한 점이 하나 있습니다. 우리는 분명 출력 칸 수를 7칸으로 지정했는데 공백이 하나밖에 존재하지 않습니다.
소수점도 하나의 칸으로 인정하기 때문입니다.
출력 결과를 보면 정수 5칸, 소수점 1칸, 공백 1칸, 총 7칸이 존재함을 알 수 있습니다.
printf는 서식 지정자(포맷 스트링) 말고도 제어 문자(이스케이프 스퀀스)를 제공합니다. 우리가 프로그램을 실행했을 때 나타나는 검은색 창을 콘솔 창이라고 부르는데, 콘솔 창의 깜빡이는 요소를 캐럿이라고 합니다.
제어 문자는 캐럿을 이동하는 데에 도움을 주고 외에도 경고음이나 문법적 표기와 겹쳐 사용하지 못하는 문자를 출력하게 해주는 데에도 큰 도움을 줍니다.
다음은 각 제어 문자별 원말입니다.
- \a: alert(경고)
- \b: backspace(뒤로 한 칸)
- \n: Line Feed, new Line(개행)
- \r: Carriage Return(복귀)
- \t: tab(탭: 8칸 단위 띄어쓰기)
주의할 점은 캐럿을 앞으로 옮긴 뒤 다시 출력을 하면 이전의 출력 데이터가 덮어씐다는 겁니다.
printf("A언어");
printf("\rC");
C언어