루비(Ruby)에서 문자열을 포맷하는 방법에 대해 알아보겠습니다.
문자열 포맷팅은 왜 필요할까요? 10보다 작은 숫자 앞에 0을 붙여 두 자리로 표시하거나(예: 01, 02, 03…), 콘솔 출력 결과를 보기 좋게 열 단위로 정렬해야 하는 상황에서 특히 유용합니다.
C 언어를 사용해 본 적이 있다면 printf 함수가 낯설지 않을 겁니다. printf를 사용하려면 포맷 지정자(format specifier) 목록과 그에 대응하는 변수 또는 값 목록을 함께 전달해야 하는데, 루비에서도 비슷한 방식으로 문자열 포맷팅을 할 수 있습니다.
루비 문자열 포맷팅 시작하기
루비에는 sprintf 함수도 있지만, 이 글에서는 더 관용적인(idiomatic) 방식인 % 연산자를 사용해 보겠습니다. 문자열 뒤에 % 연산자를 붙이고 포맷할 값들을 배열로 전달하면 됩니다.
다음은 간단한 예제입니다:
time = 5 message = "데이터 처리가 %d초 만에 완료되었습니다" % [time] puts message
출력 => "데이터 처리가 5초 만에 완료되었습니다"
이 예제에서 %d가 바로 포맷 지정자이며, time은 포맷팅할 변수입니다. %d는 정수만 표현하고, 배열([]) 안의 값이 지정자 위치에 순서대로 삽입됩니다.
부동소수점 표시하기: %f
실수(부동소수점 숫자)를 표시하려면 %f를 사용합니다. 원하는 소수점 자릿수는 %0.2f처럼 지정할 수 있습니다.
여기서 2는 소수점 둘째 자리까지만 표시하겠다는 의미입니다.
score = 78.5431 puts "평균 점수는 %0.2f점입니다" % [score]
출력 => 평균 점수는 78.54점입니다
숫자는 반올림되어 출력된다는 점에 유의하세요. 위 예제에서 78.549를 사용했다면 78.55가 출력됩니다.
자주 사용되는 포맷 지정자
- %s : 문자열(String)
- %d : 정수(Decimal)
- %f : 부동소수점(Float)
- %x : 16진수(Hexadecimal)
- %e : 지수 표기법(Scientific notation)
진수 변환과 자릿수 채우기(Padding)
%x 포맷을 사용하면 10진수를 16진수로 변환해 출력할 수 있습니다:
puts "10진수 122는 16진수로 %x입니다" % [122]
출력 => 10진수 122는 16진수로 7a입니다
문자열에 0 채워 넣기:
원하는 자릿수만큼 0으로 숫자를 채우려면 다음 형식을 사용합니다: %0<0의 개수>d
puts "숫자는 %04d입니다" % [20]
출력 => 숫자는 0020입니다
이 루비 문자열 포맷 기법을 응용하면 정렬된 텍스트 열(column)도 만들 수 있습니다. 0 대신 대시(-)를 넣으면 왼쪽 정렬 효과를 얻을 수 있습니다:

.ljust와 .rjust 메서드로 문자열 정렬하기
포맷 지정자 외에도 String 클래스의 .ljust(왼쪽 정렬)와 .rjust(오른쪽 정렬) 메서드를 사용하면 같은 작업을 더 직관적으로 처리할 수 있습니다.
예제:
names_with_ages = [["john", 20], ["peter", 30], ["david", 40], ["angel", 24]]
names_with_ages.each { |name, age| puts name.ljust(10) + age.to_s }
# 아래와 같이 이름이 왼쪽에 정렬된 표가 출력됩니다
john 20
peter 30
david 40
angel 24
ljust(10)은 문자열 전체 길이가 10이 되도록 오른쪽에 공백을 채워 줍니다. 반대로 rjust는 왼쪽에 공백을 채워 오른쪽 정렬을 만듭니다.
마무리
지금까지 살펴본 것처럼 루비 & 레일즈 문자열 포맷팅은 생각보다 훨씬 쉽습니다. 핵심은 어떤 포맷 지정자들이 있는지 이해하고 상황에 맞게 조합하는 것입니다.
출력 포맷팅의 세계를 짧게 둘러보았습니다. 도움이 되셨다면 더 유용한 콘텐츠를 놓치지 않도록 뉴스레터 구독도 잊지 마세요 🙂