Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

9 문자열

Updated: 30 mrt 2026

현대 프로그래밍 언어 분야에서 가장 중요하게 사용되는 자료형 중에 하나가 문자열이다. ChatGPT 등 대규모 언어 모델(LLM) 모델 기반 AI는 모두 수많은 데이터로부터 정보를 추출하는 방식을 학습하는 데 이때 문자열 다루기가 가장 기본이다.

파이썬의 문자열 자료형은 문장에 포함된 정보 추출을 위한 유용한 기능을 제공하며, 그만큼 파이썬 문자열 자료형과 친숙해지는 일이 중요하다.

9.1빈 문자열

어떤 문자나 기호도 포함하지 않은 문자열 ''은 빈 문자열이라 부른다. 빈 문자열을 만드는 방법은 다음 세 가지 방법이 있다.

empty_str1 = ''
empty_str2 = ""
empty_str3 = str()

빈 문자열을 출력하면 아무 것도 보이지 않는다.

print(empty_str1)

9.2화이트 스페이스

화이트 스페이스whitespace는 화면상 보이지는 않지만 엄연히 하나의 기호로 취급되는 여백을 가리키는 문자다.

파이썬 6종의 화이트 스페이스를 제공한다.화이트 스페이스 각각의 기능은 다음과 같다.

기호기능
' '스페이스space
'\t'tab
'\n'줄 변경new line
\r캐리지 리턴carriage return
'\v' 또는 '\x0b'수직탭vertical tab
'\f' 또는 '\x0c'폼피드form feed

이중에 스페이스, 줄 변경, 탭 세 종류의 화이트 스페이스가 가장 많이 사용되며, 다른 화이트 스페이스는 여기서는 다루지 않는다. 아래 코드를 실행했을 때의 결과를 보고 세 종류의 화이트 스페이스가 문자열 출력에 어떤 기능을 갖는지 확인하기 바란다.

print(' 1\n2\t3')
 1
2	3

9.3len() 함수

문자열의 길이, 즉 문자열에 포함된 기호의 개수를 반환한다.

len('apple')
5
len('hello, world!')
13
len('파이썬 재밌게 배우는 중?')
14

화이트 스페이스는 모두 하나의 기호로 간주된다.

len('\n')
1
len('\t')
1
len('\\')
1

빈 문자열의 길이는 0이다.

len('')
0

9.4이스케이프 시퀀스

큰따옴표로 감싸인 문자열에 작은따옴표가 포함될 수 있다. 이는 큰따옴표를 이용한 문자열의 시작과 끝이 작은따옴표가 포함되었음에도 불구하고 명확하기 때문이다.

fan_python = "I'am a fan of python."
print(fan_python)
I'am a fan of python.

동일한 이유로 작은따옴표로 감싸인 문자열이 큰따옴표를 포함할 수 있다.

me_too = '나도 "그렇다" 라고 답했다.'
print(me_too)
나도 "그렇다" 라고 답했다.

반면에 큰따옴표로 감싸진 문자열에 큰따옴표를, 작은따옴표로 감싸진 문자열에 작은따옴표를 그냥 사용할 수는 없다. 이유는 문자열의 끝이 명확하지 않기 때문이다.

fan_python_1 = 'I'am a fan of python.'
  Cell In[13], line 1
    fan_python_1 = 'I'am a fan of python.'
                                         ^
SyntaxError: unterminated string literal (detected at line 1)
me_too_1 = "나도 "그렇다" 라고 답했다."
  Cell In[14], line 1
    me_too_1 = "나도 "그렇다" 라고 답했다."
                    ^
SyntaxError: invalid syntax

위와 같은 오류를 방지할 수 없는 경우가 있다. 예를 들어 아래의 경우처럼 큰따옴표와 작은 따옴표가 모두 사용되는 경우가 그렇다.

"I've also said "yes"!"

또는

'I've also said "yes"!'

이런 경우엔 이스케이프 문자를 사용한다. 이스케이스 문자escape character는 특별한 기능을 수행하는 문자의 기능을 해체시키는 기능을 갖는 문자다.

파이썬은 백슬래시 기호 \ (또는 원화 기호 ₩)를 이스케이프 문자로 사용하며 주요 용도는 다음과 같다.

이스케이프 활용의미
\'작은따옴표 기호 자체
\"큰따옴표 기호 자체
\\백슬래시(원화) 기호 자체
\n줄바꿈
\t탭추가

즉, 이스케이프 문자와 함께 사용하면 인용부호 자체, 이스케이프 문자 자체, 줄바꿈, 탭추가 문자를 문자열에 제한 없이 사용할 수 있다.

인용부호 활용

print() 함수는 이스케이프 문자의 기능을 적절히 반영해서 화면에 출력한다.

said_yes_1 = "I\'ve also said \"yes\"!"
print(said_yes_1)
I've also said "yes"!
said_yes_2 = 'I\'ve also said \"yes\"!'
print(said_yes_2)
I've also said "yes"!

백슬래시(원화) 기호

백슬래시(원화) 기호를 이스케이프 문자의 기능이 아닌 백슬래시(원화) 기호 자체로 문자열에 포함시키고자 할 때는 백슬래시(원화) 기호를 두 번 연속 사용한다.

using_backslash = '백슬래시(원화) 기호 \\는 이스케이프 문자를 만들 때 사용함.'

\\에서 첫째 백슬래시(원화) 기호는 이스케이프 기능으로, 둘째 백슬래시(원화) 기호는 백슬래시(원화) 기호 자체로 이해된다.

print(using_backslash)
백슬래시(원화) 기호 \는 이스케이프 문자를 만들 때 사용함.

줄바꿈

\n은 줄바꿈을 의미하는 이스케이프 문자다.

two_lines = '첫째줄\n둘째줄.'

print() 함수를 이용하면 실제 의도한 대로 두 줄로 표현된다.

print(two_lines)
첫째줄
둘째줄.

탭 추가

\t는 두 문자열 사이에 탭을 추가하는 이스케이프 문자다. 탭은 보통 네 개의 스페이스키를 누르는 것에 해당한다.

using_tabs = '하나\t둘\t셋'

print() 함수를 이용하면 탭이 두 번 사용되었음을 확인할 수 있다.

print(using_tabs)
하나	둘	셋

9.5날 문자열

특수 문자에 대해 백슬래시(원화) 기호를 사용할지 여부를 고민하는 대신에 날 문자열raw string을 사용해서 인용부호와의 충돌 문제를 해결할 수도 있다.

문자열 앞에 가공되지 않았다 라는 의미를 뜻하는 영어 단어 raw 의 첫 글자인 r을 추가하면 날 문자열이 된다. 날 문자열은 특수 문자들의 기능을 모두 무시한다.

print(r"Hello\ World")
Hello\ World
print(r"Hello\n World")
Hello\n World
print(r"Hello\t World")
Hello\t World

날 문자열은 특히 파일과 폴더의 경로를 작성할 때 유용하다.

  • 일반 문자열

print('C:\some\name')
C:\some
ame
<>:1: SyntaxWarning: invalid escape sequence '\s'
<>:1: SyntaxWarning: invalid escape sequence '\s'
/tmp/ipykernel_50907/3441249919.py:1: SyntaxWarning: invalid escape sequence '\s'
  print('C:\some\name')

주의사항: SyntacWarning은 경고일 뿐이지 오류가 아니다. 경고는 권장사항에 어긋난다 정도로 이해한다.

  • 날 문자열 사용: 특수 문자 기능 없음

print(r'C:\some\name')
C:\some\name

9.6문자열 포매팅

문자열 포매팅string formatting은 문자열 내부에 확정되지 않은 값을 가리키는 표현식을 사용할 수 있도록 한다. 문자열 포매팅을 처리하는 여러 방식이 있지만 여기서는 가장 편리한 방식인 f-문자열f-string의 활용법만 소개한다.

f-문자열

f-문자열은 문자열 앞에 f를 붙이며, 문자열 중간에 중괄호 {}로 감싸인 표현식을 사용할 수 있다. 예를 들어, 아래 코드는 nameage 두 변수를 이용한 표현식을 문자열에 포함시킨다. 그러면 nameage 가 가리키는 값에 따라 다른 문자열이 지정된다.

name = '강현'
age = 3
s = f'{name}의 나이는 {age}살이다.'
print(s)

s1 = f'{name}의 동생은 {age - 2}살이다'
print(s1)
강현의 나이는 3살이다.
강현의 동생은 1살이다

표현식이 가리키는 값이 변함에 따라 출력되는 문자열도 달라진다.

name = '정우'
age = 10
s = f'{name}의 나이는 {age}살이다.'
print(s)

s1 = f'{name}의 동생은 {age - 2}살이다'
print(s1)
정우의 나이는 10살이다.
정우의 동생은 8살이다

문자열 좌우 정렬 출력

출력되는 문자열이 차지하는 총 길이를 지정하고 좌우로 정렬시킬 수 있으며, 길이가 다른 여러 개의 문자열을 출력할 때 매우 유용하다. 아래 코드는 총 10칸의 자리를 이용할 때 길이가 2인 문자열을 좌, 우, 중앙에 위치시키는 방법을 소개한다.

s1 = 'hi'
s2 = 'hello'
  • 왼쪽으로 정렬

print(f'{s1:<10}')
print(f'{s2:<10}')
hi        
hello     
  • 오른쪽으로 정렬

print(f'{s1:>10}')
print(f'{s2:>10}')
        hi
     hello
  • 중앙에 정렬

print(f'{s1:^10}')
print(f'{s2:^10}')
    hi    
  hello   

정렬 후 남은 빈 자리를 지정된 문자로 채울 수 있다.

  • + 기호로 채우기

print(f'{s1:+<10}')
print(f'{s2:+<10}')
hi++++++++
hello+++++
  • 0 기호로 채우기

print(f'{s1:0>10}')
print(f'{s2:0>10}')
00000000hi
00000hello
  • - 기호로 채우기

print(f'{s1:-^10}')
print(f'{s2:-^10}')
----hi----
--hello---

부동소수점 자릿수 지정

부동소수점의 소수점 이하 자릿수를 지정하려면 {표현식:.1f} 와 같은 형식을 사용한다.

num1 = 17.153742
num2 = 2.778
  • 소수점 이하 한 자리까지만 출력

print(f'소수점 둘째 자리에서 반올림: {num1:.1f}')
print(f'소수점 둘째 자리에서 반올림: {num2:.1f}')
소수점 둘째 자리에서 반올림: 17.2
소수점 둘째 자리에서 반올림: 2.8
  • 소수점 이하 두 자리까지만 출력

print(f'소수점 셋째 자리에서 반올림: {num1:.2f}')
print(f'소수점 셋째 자리에서 반올림: {num2:.2f}')
소수점 셋째 자리에서 반올림: 17.15
소수점 셋째 자리에서 반올림: 2.78
  • 소수점 이하 세 자리까지만 출력

print(f'소수점 넷째 자리에서 반올림: {num1:.3f}')
print(f'소수점 넷째 자리에서 반올림: {num2:.3f}')
소수점 넷째 자리에서 반올림: 17.154
소수점 넷째 자리에서 반올림: 2.778

부동소수점 전체가 차지하는 자릿수를 지정하려면 {표현식:15.2f} 와 같은 형식을 사용한다. 칸이 남을 경우 빈자리로 남긴다.

print(f'총 15칸을 차지할 때: {num1:15.2f}')
print(f'총 15칸을 차지할 때: {num2:15.2f}')
총 15칸을 차지할 때:           17.15
총 15칸을 차지할 때:            2.78

앞서 언급한 좌우 정렬, 기호로 채우기 등도 가능하다.

print(f'총 15칸 사용: {num1:<15.5f}')
print(f'총 15칸 사용: {num2:<15.5f}')
총 15칸 사용: 17.15374       
총 15칸 사용: 2.77800        
print(f'총 15칸 사용: {num1:0<15.5f}')
print(f'총 15칸 사용: {num2:0<15.5f}')
총 15칸 사용: 17.153740000000
총 15칸 사용: 2.7780000000000
print(f'총 15칸 사용: {num1:^15.5f}')
print(f'총 15칸 사용: {num2:^15.5f}')
총 15칸 사용:    17.15374    
총 15칸 사용:     2.77800    
print(f'총 15칸 사용: {num1:-^15.5f}')
print(f'총 15칸 사용: {num2:-^15.5f}')
총 15칸 사용: ---17.15374----
총 15칸 사용: ----2.77800----
print(f'총 15칸 사용: {num1:>15.5f}')
print(f'총 15칸 사용: {num2:>15.5f}')
총 15칸 사용:        17.15374
총 15칸 사용:         2.77800
print(f'총 15칸 사용: {num1:+>15.5f}')
print(f'총 15칸 사용: {num2:+>15.5f}')
총 15칸 사용: +++++++17.15374
총 15칸 사용: ++++++++2.77800

9.7예제

예제 1

아래 코드의 실행 결과를 설명하라.

print("\tHello World\n!")
	Hello World
!

답:

세 종류의 화이트 스페이스가 사용되었음.

  • ' ': 공백

  • '\t': 탭

  • '\n': 줄바꿈

문자열이 먼저 탭(스페이스 4칸)으로 시작하고 이후에 Hello World를 출력한 다음 줄바꿈을 진행한다. 줄이 바뀐 후 느낌표 기호가 출력된다.

예제 2

아래 코드의 실행 결과를 설명하라.

len("Hello\tWorld\n!")
13

답:

사용된 세 개의 모든 화이트스페이스 문자의 길이는 1이다. 여기에 Hello와 World 단어에 포함된 알파벳 10개를 포함해서 총 13개의 문자로 구성된 문자열이다.

예제 3

아래 두 코드의 실행 결과가 다른 이유를 설명하라.

주의사항: SyntacWarning은 경고일 뿐이지 오류가 아니다. 경고는 권장사항에 어긋난다 정도로 이해한다.

  • 코드 1

print('Python\nis\easy\to\learn')
Python
is\easy	o\learn
<>:1: SyntaxWarning: invalid escape sequence '\e'
<>:1: SyntaxWarning: invalid escape sequence '\e'
/tmp/ipykernel_50907/1790380387.py:1: SyntaxWarning: invalid escape sequence '\e'
  print('Python\nis\easy\to\learn')
  • 코드 2

print(r'Python\nis\easy\to\learn')
Python\nis\easy\to\learn

답:

  • 'Python\nis\easy\to\learn': \n\t 가 각각 줄바꿈과 탭으로 처리되어 화면에 출력됨.

  • r'Python\nis\easy\to\learn': 날 문자열로 처리되어 있는 그대로 출력됨.

예제 4

아래 두 개의 부동소수점을 소수점 이하 두 자리까지만 출력되도록 f-문자열을 활용하라.

num = 23.36778
num1 = -84.99888

답:

아래 코드는 소수점 이하 셋째 자리에서 반올림한 값을 출력한다.

print(f"{num:.2f}")
print(f"{num1:.2f}")
23.37
-85.00

예제 5

아래 두 개의 부동소수점의 소수점을 모두 버리고 정수 부문만 출력되도록 f-문자열을 활용하라. 단, int() 함수는 사용하지 않는다.

num2 = 23.36778
num3 = -274.5789

답:

아래 코드는 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.

print(f"{num2:.0f}")
print(f"{num3:.0f}")
23
-275

반면에 int() 함수는 반올림을 고려하지 않는다.

print(f"{int(num2)}")
print(f"{int(num3)}")
23
-274

예제 6

아래 두 개의 정수를 총 다섯 칸을 차지하도록 f-문자열을 활용하라. 단 모든 정수는 오른쪽으로 정렬되어야 하며 앞쪽 빈칸은 0으로 채운다.

num4 = 23
num5 = 833

답:

아래 코드는 총 5칸을 차지하도록 하며 오른쪽으로 정렬시킨다.

print(f"{num4:0>5d}")
print(f"{num5:0>5d}")
00023
00833

9.8연습문제