지난 포스팅에서는 문자열을 칼로 자르듯 원하는 대로 잘라내는 인덱싱과 슬라이싱에 대해 배웠습니다. 데이터를 자르는 법을 배웠으니, 이제는 데이터를 보기 좋게 조립하고 포장하는 법을 배울 차례입니다.
프로그래밍을 하다 보면 고정된 문장 사이에 변수 값을 끼워 넣어야 할 일이 수도 없이 발생합니다. 예를 들어, "철수님의 점수는 80점입니다.", "영희 님의 점수는 95점입니다."처럼 말이죠. 이때 이름과 점수만 바뀌고 나머지 문장은 그대로입니다.
초보자들은 흔히 더하기(+) 기호를 써서 이를 해결하려 하지만, 이는 매우 비효율적이고 오류가 발생하기 쉽습니다. 파이썬은 이런 불편함을 해소하기 위해 '문자열 포맷팅(String Formatting)'이라는 강력한 기능을 제공합니다.
이번 글에서는 파이썬 문자열 포맷팅의 변천사(%, format, f-string)를 살펴보고, 왜 전 세계 개발자들이 f-string에 열광하는지 그 이유와 활용법을 완벽하게 정리해 드리겠습니다.

1. 왜 단순히 더하기(+)를 쓰면 안 될까?
가장 직관적인 방법은 문자열끼리 더하는 것입니다. 하지만 여기에는 치명적인 단점이 있습니다.
name = "파이썬"
version = 3.12
# 단순 더하기 (+) 사용 시도
# print("언어: " + name + ", 버전: " + version) # -> 에러 발생!
위 코드를 실행하면 TypeError가 발생합니다. 파이썬은 문자열(str)과 숫자(float)를 직접 더하는 것을 허용하지 않기 때문입니다. 이 코드를 작동시키려면 str(version)처럼 숫자를 문자로 일일이 변환해 주어야 합니다. 변수가 많아지면 코드가 매우 지저분해지겠죠? 이것이 바로 포맷팅이 필요한 이유입니다.
2. 방법 1: 고전적인 방식 (% formatting)
파이썬 초창기부터 사용되던 방식입니다. C언어의 printf 함수 스타일을 그대로 가져왔기 때문에 C언어 경험자에게는 익숙할 수 있습니다.
name = "홍길동"
age = 20
# %s는 문자열, %d는 정수가 들어갈 자리임을 표시
print("이름: %s, 나이: %d세" % (name, age))
- 장점: 오래된 코드에서 여전히 많이 보입니다.
- 단점:
%s,% d등 자료형에 맞는 코드를 외워야 합니다. 변수가 많아지면 뒤에 괄호로 묶인 변수들의 순서가 헷갈리기 쉽고 가독성이 매우 떨어집니다.
3. 방법 2: 과도기의 해결사 (. format 함수)
파이썬 3 버전 초기에 등장하여 % 방식의 단점을 보완한 방식입니다. 자료형 코드(% s 등)를 신경 쓸 필요 없이 중괄호 {}만 사용하면 됩니다.
temperature = 24
humidity = 60
# 중괄호 {} 자리에 순서대로 변수가 들어갑니다.
print("현재 기온은 {}도, 습도는 {}%입니다.".format(temperature, humidity))
- 장점: 숫자를 문자로 바꿀 필요도 없고, 자료형을 몰라도 알아서 들어갑니다.
- 단점: 여전히 문장 끝에. format(...)을 길게 적어야 해서 타자 칠 내용이 많습니다. 문장이 길어지면 괄호 안의 변수가 본문의 어느 위치에 들어가는지 매칭하기가 어렵습니다.
4. 방법 3: 혁명적인 기술, f-string (★강력 추천)
파이썬 3.6 버전부터 추가된 f-string은 문자열 포맷팅의 판도를 완전히 뒤집어 놓았습니다. 현재 파이썬 개발자들이 가장 선호하는 방식이며, 여러분도 무조건 이 방식을 주력으로 사용하셔야 합니다.
(1) 사용법: f 하나만 붙이면 끝
문자열을 시작하는 따옴표 앞에 f만 붙여주세요. 그리고 중괄호 {} 안에 변수 이름을 직접 집어넣으면 됩니다.
name = "제임스"
score = 90
# 직관 그 자체!
print(f"학생 {name}의 점수는 {score}점입니다.")
(2) f-string을 써야 하는 3가지 이유
- 압도적인 가독성: 변수가 문장 속에 자연스럽게 녹아있어, 코드를 읽는 즉시 어떤 내용이 출력될지 파악할 수 있습니다.
- 가장 빠른 속도: 내부적으로 처리가 최적화되어 있어,
% 나format()방식보다 실행 속도가 더 빠릅니다. - 표현식 지원: 중괄호 안에서 더하기, 빼기 등 간단한 연산이 가능합니다.
a = 10
b = 20
print(f"두 수의 합은 {a + b}입니다.") # 결과: 두 수의 합은 30입니다.
5. 실무에서 쓰는 고급 f-string 기술
f-string은 단순히 변수만 넣는 것이 아니라, 출력 모양을 예쁘게 다듬는 강력한 기능도 숨겨져 있습니다. 이 기능들은 데이터 분석이나 금융 프로그램을 짤 때 필수적입니다.
(1) 소수점 자릿수 제한하기 (:. 2f)
실수를 출력할 때 소수점 10자리까지 나오면 보기가 싫죠? 콜론(:) 뒤에. 자릿수 f를 적으면 반올림하여 깔끔하게 보여줍니다.
pi = 3.1415926535
print(f"원주율은 {pi:.2f}입니다.") # 결과: 원주율은 3.14입니다.
(2) 천 단위 콤마 찍기 (:,)
돈을 다룰 때 1000000보다 1,000,000으로 보여주는 것이 훨씬 좋겠죠? 콜론 뒤에 콤마(,) 하나만 찍으면 끝납니다.
money = 1000000000
print(f"당첨금: {money:,}원") # 결과: 당첨금: 1,000,000,000원
(3) 정렬하기 (왼쪽, 가운데, 오른쪽)
표(Table) 같은 형식을 만들 때 글자 정렬이 필요합니다.
{변수:<10}: 10칸 확보 후 왼쪽 정렬{변수:>10}: 10칸 확보 후 오른쪽 정렬{변수:^10}: 10칸 확보 후 가운데 정렬
6. 결론: f-string은 선택이 아닌 필수
과거의 유물인 % 방식이나 번거로운 format() 함수를 고집할 이유는 전혀 없습니다. f-string은 코드를 짧게 만들어주고, 읽기 쉽게 해 주며, 심지어 성능까지 가장 좋습니다.
오늘 배운 f-string을 활용하면 "현재 체력: 50/100" 같은 게임 UI나 "결제 금액: 15,400원" 같은 영수증 출력 기능을 아주 쉽게 구현할 수 있습니다.
자, 이제 데이터를 변수에 담고(변수), 계산하고(연산자), 문자로 예쁘게 포장하는(포맷팅) 방법까지 모두 익혔습니다. 하지만 사용자가 입력한 데이터의 형태가 내 마음대로 되지 않을 때가 있습니다. 문자로 들어온 숫자를 진짜 숫자로 바꾸거나 그 반대로 해야 할 때죠. 다음 포스팅에서는 '자료형 변환(Casting): 문자를 숫자로, 숫자를 문자로 바꾸는 법'에 대해 알아보겠습니다.