본문으로 건너뛰기

라이브러리와 서식 출력

정보처리기사 목차언어의 특성과 라이브러리레슨 148 / 233

목차

라이브러리(library)는 자주 쓰는 기능을 함수·클래스로 미리 만들어 모아 둔 꾸러미이고, 서식 출력은 printf나 f-문자열에 너비와 정밀도를 적어 값이 찍히는 칸 수와 자릿수를 정하는 일입니다.

글자를 찍는 일까지 새로 만들지 않고, 언어가 함께 주는 표준 라이브러리를 불러와 씁니다. 실기는 출력을 빈칸까지 그대로 쓰게 하므로, 서식 하나가 칸을 몇 개 잡는지 셀 수 있어야 합니다. 아래 그림은 C의 printf가 같은 42와 3.14159를 서식마다 다른 칸 수와 자릿수로 찍는 장면입니다.

7단계 중 1단계. 1번 줄 — printf는 C 표준 라이브러리 가운데 stdio.h 헤더에 선언되어 있습니다. 이 줄이 있어야 printf를 부를 수 있습니다.

1라이브러리: 헤더·패키지·모듈

언어와 함께 오는 것을 표준 라이브러리, 따로 받아 설치하는 것을 외부 라이브러리라고 합니다. 불러오는 단위와 줄은 언어마다 다릅니다.

언어단위불러오는 줄
C헤더 파일#include <stdio.h>
Java패키지import java.util.Scanner;
Python모듈import math

Java의 String·System이 든 java.lang은 import 없이 씁니다. Python은 math.sqrt(16)처럼 씁니다.

C 헤더는 맡은 일로 고릅니다. 빼면 그 함수를 모른다는 컴파일 오류가 납니다.

헤더맡은 일대표 함수
stdio.h표준 입출력printf · scanf
stdlib.h메모리 할당 · 문자열을 수로 · 난수malloc · free · atoi · rand
string.h문자열 다루기strlen · strcpy · strcmp · strcat
math.h수학 계산sqrt · pow

2printf 서식: 너비와 정밀도

서식 지정자(format specifier)는 %[플래그][너비][.정밀도]변환 문자 차례로 적습니다. %d·%c·%s와 \n은 '출력과 변수' 레슨에서 배웠고, 여기서는 그 사이에 끼는 플래그·너비·정밀도를 봅니다. 그림의 코드입니다. 대괄호는 칸의 끝을 보이려고 찍었습니다.

#include <stdio.h>

int main(void) {
    int n = 42;
    double pi = 3.14159;
    printf("[%5d]\n", n);
    printf("[%-5d]\n", n);
    printf("[%05d]\n", n);
    printf("[%.2f]\n", pi);
    printf("[%5.2f]\n", pi);
    return 0;
}
실행 결과
[   42]
[42   ]
[00042]
[3.14]
[ 3.14]
  • 너비는 칸 수입니다. 값이 짧으면 오른쪽에 붙고 왼쪽이 빈칸입니다.
  • 플래그 -는 왼쪽에 붙이고, 0은 빈칸 대신 0을 채웁니다.
  • 정밀도 .2는 소수점 아래 두 자리까지 반올림합니다. 정밀도가 없으면 %f는 여섯 자리(3.141590)를 찍습니다.
  • 너비에는 소수점도 한 칸으로 들어갑니다. 3.14는 네 칸이라 %5.2f에서 빈칸이 하나 붙습니다.
  • 너비보다 긴 값은 자르지 않고 다 찍습니다.

변환 문자는 값을 어떤 꼴의 글자로 바꿀지 정합니다.

변환 문자꼴값 → 찍히는 글자
%d10진 정수255 → 255
%o · %x8진 · 16진 정수8 → 10 · 255 → ff
%f · %e실수 · 지수 꼴314.159 → 314.159000 · 3.141590e+02
%c · %s글자 하나 · 문자열65 → A · "ab" → ab

3Python의 print와 f-문자열

Python의 print는 값 사이에 sep을, 끝에 end를 붙입니다. sep의 기본은 빈칸 하나, end의 기본은 줄바꿈입니다. f-문자열(f-string)은 중괄호 안 콜론 뒤에 printf와 같은 꼴로 너비·정밀도를 적고, 정렬은 <(왼쪽)·>(오른쪽)·^(가운데)로 정합니다.

pi = 3.14159
print('A', 'B', 'C')
print('A', 'B', 'C', sep='-')
print('A', end='')
print('B')
print(f'[{pi:5.2f}]')
print(f'[{42:<5}]')
print(f'[{42:^5}]')
실행 결과
A B C
A-B-C
AB
[ 3.14]
[42   ]
[ 42  ]
  • end=''로 두면 줄을 바꾸지 않아 다음 print가 같은 줄에 이어 찍습니다.
  • 너비만 적으면 수는 오른쪽, 문자열은 왼쪽에 붙습니다. 가운데에서 남는 칸이 홀수면 오른쪽이 한 칸 더 많습니다.
  • '[%5.2f]' % pi처럼 C 꼴 서식도 쓸 수 있고, 결과는 같습니다.

예제

같은 서식을 Java로 찍습니다. print는 줄을 바꾸지 않고 println은 바꿉니다. printf의 서식은 C와 같고, 줄바꿈은 %n으로 씁니다. 폰 화면에 맞추려고 main 머리와 printf 줄을 둘로 나눴습니다. 한 줄로 쓴 것과 같습니다. 무엇이 찍힐까요?

public class Main {
  public static void main(
      String[] args) {
    double pi = 3.14159;
    System.out.print("A");
    System.out.println("B");
    System.out.println("C");
    System.out.printf(
        "[%5.2f]%n", pi);
  }
}
실행 결과 보기
실행 결과
AB
C
[ 3.14]

A 뒤에 줄이 바뀌지 않아 B가 같은 줄에 붙고, println이 줄을 바꿔 C는 다음 줄에 찍힙니다.

시험 포인트

  • 필기: 함수와 헤더를 짝짓게 합니다 — 입출력 printf·scanf는 stdio.h, 메모리 할당 malloc·free는 stdlib.h, 문자열 strlen·strcmp는 string.h, sqrt·pow는 math.h입니다. 서식 지정자의 변환 문자는 %d(10진)·%o(8진)·%x(16진)·%f(실수)·%e(지수)·%c(글자)·%s(문자열)입니다. 너비는 소수점까지 센 칸 수이고, 값이 길면 자르지 않습니다. -는 왼쪽 붙임, 0은 0 채움입니다. Java의 java.lang은 import 없이 쓰입니다.
  • 실기: 출력을 빈칸·자릿수까지 글자 그대로 씁니다(f-string·출력 형식 출제 주제). 빈칸 채우기로 묻는 이름은 print의 sep·end와 f-문자열(f-string)입니다.

확인 문제

1. 두 문자열이 같은지 strcmp로 견주는 C 프로그램을 씁니다. 맨 위에 꼭 두어야 할 줄을 고르세요.

  • ① #include <stdlib.h>
  • ② #include <string.h>
  • ③ #include <math.h>
  • ④ #include <time.h>
정답

②입니다. strlen·strcpy·strcmp 같은 문자열 함수는 string.h에 들어 있습니다.

  • ① stdlib.h는 메모리 할당(malloc·free)과 문자열을 수로 바꾸는 atoi 같은 함수의 헤더입니다.
  • ③ math.h는 sqrt·pow 같은 수학 함수의 헤더입니다.
  • ④ time.h는 시각을 다루는 헤더입니다. 문자열을 견주는 함수는 없습니다.

2. 다음 (가)~(다)에 맞는 이름을 쓰세요. (가)·(나)는 Python print에 넘기는 이름으로, (다)는 한글 이름과 영문으로 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) print(2026, 10, 15, ___='.')⁠가 2026.10.15를 찍게 하는 이름입니다.
  • (나) 반복문 안에서 숫자를 한 줄에 이어 찍으려고, 줄을 바꾸는 대신 붙일 글자를 정하는 이름입니다.
  • (다) 따옴표 앞에 f를 붙이고, 중괄호 안에 값과 :5.2f 같은 모양을 적어 값을 끼워 넣는 꼴입니다.
정답

받는 답: (가) sep · (나) end · (다) f-문자열(f-string)

(가)의 실마리는 '값 사이에 들어가는 글자', (나)는 '끝에 붙는 글자 — 기본은 줄바꿈', (다)는 '따옴표 앞의 f와 중괄호'입니다.

  • 틀리는 꼴 end — (가)에: 마지막 값 뒤에 한 번 붙습니다. 2026.10.15처럼 값 사이마다 들어가는 것은 sep입니다.
  • 틀리는 꼴 sep — (나)에: 한 print 안의 값 사이에만 들어갑니다. 다음 print와 이어 주는 것은 end입니다.
  • 틀리는 꼴 format — (다)에: '{:5.2f}'.format(pi)처럼 문자열 뒤에 붙여 부르는 메서드입니다. 따옴표 앞에 f를 붙이는 꼴의 이름은 f-문자열입니다.

3. 위 2절 C 코드에서 4번 줄만 int n = 123456;으로 바꿨습니다. 6~8번 줄이 찍는 세 줄을 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

정답

받는 답:

[123456]
[123456]
[123456]

세 줄이 모두 같습니다. 123456은 여섯 칸이라 너비 5보다 깁니다. 너비보다 긴 값은 자르지 않고 다 찍으므로 붙일 쪽(-)도 채울 칸(0)도 남지 않습니다.

  • 틀리는 꼴 [12345]·[23456]: 다섯 칸에 맞춰 자른다고 봤습니다. 너비는 가장 적은 칸 수일 뿐입니다.

4. 다음 코드의 실행 결과를 빈칸까지 그대로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

a = 7
b = 2.5
print(a, b, sep='|', end='')
x = f'[{a:03d}]'
y = f'[{b:>6.2f}]'
print(x, y, sep='')
정답

받는 답:

실행 결과
7|2.5[007][  2.50]

첫 print는 end가 빈 문자열이라 줄을 바꾸지 않아 두 print가 한 줄이 됩니다. 03d는 세 칸을 0으로 채워 007, >6.2f는 2.50 네 칸을 여섯 칸 오른쪽에 붙여 빈칸 둘이 앞에 섭니다. 마지막 print는 sep이 빈 문자열이라 두 대괄호가 붙습니다.

  • 틀리는 꼴 7|2.5와 두 대괄호를 두 줄로 나눠 쓴 답: 첫 print의 end=''을 놓쳤습니다.
  • 틀리는 꼴 두 대괄호 사이에 빈칸 하나를 넣은 답: 마지막 print의 sep=''을 놓쳤습니다.
  • 틀리는 꼴 7 앞을 0 대신 빈칸 둘로 채운 답: 너비 앞의 0을 놓쳤습니다. 0은 빈칸 대신 0을 채웁니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

정보처리기사 목차로