이번 시간에는 문자열 포매팅에 대하여 알아보겠습니다.

데이터를 다루거나 웹 애플리케이션을 개발할 때, 수집된 원시 데이터를 우리가 원하는 '특정 형태'로 가공하여 화면에 보여주거나 파일로 저장해야 하는 순간이 반드시 찾아옵니다.
특히 최근 AI Agent를 개발할 때 프롬프트 템플릿(Prompt Template)을 동적으로 구성하기 위해 문자열 포매팅 기법이 핵심적으로 사용되고 있습니다. (ex: LangChain의 프롬프트 구성, Jinja2 템플릿 엔진 등)
오늘은 파이썬에서 문자열을 조립하고 가공하는 3가지 대표적인 포매팅 기법을 과거부터 최신 문법까지 순서대로 알아보겠습니다.
1. 1세대 포매팅: % 연산자 (C언어 스타일)
파이썬의 가장 오래된 포매팅 방식으로, C언어의 printf 스타일을 차용했습니다. 데이터의 '타입(Type)'을 명시적으로 지정해야 한다는 특징이 있습니다.
- %d : 정수 (Decimal)
- %f : 부동소수점 (Float)
- %s : 문자열 (String)
x = 1
y = 2
# 요구사항: 최종 형태 '1 + 2 = 3' 만들기
print('%d + %d = %d' % (x, y, x + y))
⚠️ 주의할 점 및 실무 팁
타입이 엄격하게 적용되기 때문에, 포맷 기호와 실제 데이터의 타입이 다르면 에러가 발생합니다.
# ❌ TypeError 발생! 정수 자리(%d)에 문자열('하이')이 들어감
# '%d + %d = %d' % (x, '하이', x + y)
# ✅ 실무 팁(Pro-Tip): 만능 치트키 '%s'
# 데이터의 타입을 정확히 모를 때는 모든 데이터를 문자열로 자동 변환해 주는
# '%s'를 사용하면 에러 없이 범용적인 처리가 가능합니다.
print('%s + %s = %s' % (x, 'hi', x + y))
2. 2세대 포매팅: .format() 함수
파이썬 3.0부터 도입된 방식으로, % 연산자의 단점을 보완하고 객체 지향적인 언어 특성을 살린 함수형 포매팅입니다. 포맷 자리를 중괄호 {}로 대체합니다.
# 1. 기본 형태 (순서대로 매핑)
print('{} + {} = {}'.format(x, y, x + y))
# 2. 인덱스(순번) 지정
# 인자를 지칭하는 인덱스를 지정하여 원하는 위치에 자유롭게 배치할 수 있습니다.
print('{0} + {1} = {2}'.format(x, y, x + y))
# 순서를 섞거나 특정 인자를 여러 번 중복해서 사용할 수도 있습니다.
print('{1} + {0} = {0}'.format(x, y, x + y)) # 2 + 1 = 1
# 3. 매개변수명(키워드) 지정
# 데이터가 의미하는 바를 명확히 표현할 수 있어 가독성이 매우 높아집니다.
print('{온도} + {습도} = {최종반죽온도}'.format(온도=x, 습도=y, 최종반죽온도=x+y))
3. 3세대 포매팅: f-string (가장 권장됨 🌟)
파이썬 3.6 버전부터 도입된 최신 문법으로, 현재 실무에서 가장 권장되고 널리 쓰이는 방식입니다. 포맷 문자열 앞에 f를 붙이고, 중괄호 {} 안에 변수나 표현식을 직접 삽입합니다. 직관적일 뿐만 아니라 연산 속도도 가장 빠릅니다.
# 변수와 연산 결과를 직관적으로 바로 배치
print(f'{x} + {y} = {x + y}')
💡 [추가 지식] f-string의 강력한 디테일 제어 기법
f-string은 단순히 값을 넣는 것을 넘어, 콜론(:)을 사용하여 문자열의 정렬, 자릿수, 소수점 등을 아주 세밀하게 제어할 수 있습니다. 로그(Log)를 남기거나 콘솔에 표 형태로 데이터를 정돈하여 출력할 때 필수적입니다.
1) 정렬 및 여백 채우기 (로그 처리 시 중요)
- < : 왼쪽 정렬 (기본값)
- > : 오른쪽 정렬
- ^ : 중앙 정렬
# {변수:채울문자+정렬방향+전체자리수}
print(f'{x:->10}') # 오른쪽 정렬, 빈칸은 '-'로 채움 (전체 10자리)
print(f'{y:*<10}') # 왼쪽 정렬, 빈칸은 '*'로 채움
print(f'{x+y:@^12}') # 중앙 정렬, 빈칸은 '@'로 채움
print(f'{x:->10} + {y:*<10} = {x+y:@^12}')
#결과 ---------1 + 2********* = @@@@@3@@@@@@
# 여러 줄 문자열과 결합하여 깔끔한 출력 구조 만들기
print(f'''
{x:->10}
{y:*<10}
{x+y:@^12}
''')
'''
결과
---------1
2*********
@@@@@3@@@@@@
'''
2) 소수점 자릿수 제한 (데이터 분석, 금융 데이터)
부동소수점 데이터의 소수점 아래 자릿수를 강제로 고정할 때 f 포맷터를 결합하여 사용합니다.
pi = 3.1415926535
# 소수점 둘째 자리까지만 반올림하여 표기
print(f'원주율: {pi:.2f}') # 원주율: 3.14
3) 디버깅 기능 (파이썬 3.8 이상)
변수명과 그 값을 동시에 출력하고 싶을 때, 변수 뒤에 = 기호를 붙여주면 테스트 및 디버깅 시 시간을 크게 단축할 수 있습니다.
user_age = 32
# 기존 방식: f'user_age = {user_age}'
print(f'{user_age=}') # 결과: user_age=32
디버깅 기능은 수업시간에 배우지 않아서 따로 더 공부해 보았는데요.
🐛 f-string 디버깅 기법 (=)
기존에는 코드 중간에 변수에 어떤 값이 들어있는지 확인(디버깅)하려면, 변수명과 값을 구별하기 위해 변수 이름을 두 번씩 타이핑해야 했습니다.
user_name = "홍길동"
user_age = 30
# 파이썬 3.8 이전 (또는 기존 방식)
# 개발자가 변수명을 직접 문자로 치고, 중괄호 안에 또 변수를 넣어야 함
print(f"user_name: {user_name}, user_age: {user_age}")
# 출력: user_name: 홍길동, user_age: 30
하지만 파이썬 3.8부터는 = 기호 하나로 이 번거로움이 완벽하게 해결되었습니다.
# 파이썬 3.8 이후
# 변수명 뒤에 '='만 붙이면 끝!
print(f"{user_name=}, {user_age=}")
# 출력: user_name='홍길동', user_age=30
1. 복잡한 수식이나 함수의 결과를 즉각 확인할 때
가격 = 10000
수량 = 3
할인율 = 0.1
# 수식과 그 결과값을 동시에 출력!
# (띄어쓰기까지 그대로 유지해 줍니다)
print(f"{가격 * 수량 * (1 - 할인율) = }")
# 출력: 가격 * 수량 * (1 - 할인율) = 27000.0
2. 데이터의 '타입(Type)'을 명확하게 눈으로 구분해야 할 때 (가장 중요 ⭐)
data_a = 123 # 정수
data_b = "123" # 문자열
# 기존 방식은 눈으로 타입 구분이 안 됨
print(f"a: {data_a}, b: {data_b}")
# 출력: a: 123, b: 123 (둘 다 똑같이 보임 😭)
# '=' 기호 사용 시
print(f"{data_a=}, {data_b=}")
# 출력: data_a=123, data_b='123' (문자열은 따옴표가 붙어서 명확히 구분됨! ✨)
3. 기존 포매팅(소수점, 자릿수) 기법과 결합할 때
pi_value = 3.1415926535
# 원주율 값을 소수점 둘째 자리까지만 디버깅 출력
print(f"{pi_value=:.2f}")
# 출력: pi_value=3.14
오늘의 한 마디
수업 들을 때 의자가 좋지 않아서 목이 너무 아픕니다. 그래서 무려 2만 5천 원정도의 거금을 사용하여 의자에 매다는 목 받침대를 샀습니다. 비록 지금은 2만 5천원이지만 병원에서 치료 받으려면 2만 5천원 이상의 금액이 들 것입니다.
따라서 미래에 병원에서 돈 쓸 생각하지 말고 자세를 제대로 고치고 아이템을 아낌없이 사서 건강을 지켜야 합니다!