Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 문자열: 파이썬에서 가장 인기 있는 데이터 유형 완벽 가이드

문자열(String)은 파이썬에서 가장 널리 사용되는 데이터 유형 중 하나입니다. 높은 수준에서 보면, 문자열은 문자의 시퀀스로 구성된 객체입니다. 문자는 기호 하나하나를 의미하며, 예를 들어 영어 알파벳은 26개의 문자로 이루어져 있습니다.

파이썬 문자열은 생성과 조작이 매우 직관적입니다. 지금 바로 문자열 다루는 법을 배워보세요. 이 글에서는 파이썬 문자열의 개념, 작동 원리, 그리고 자주 쓰이는 연산들을 자세히 다룹니다.

파이썬에서 문자열이란?

파이썬에서 문자열을 만들려면 문자들을 따옴표로 감싸기만 하면 됩니다. 작은따옴표(')나 큰따옴표(") 모두 사용할 수 있습니다. 변수에 할당하여 문자열을 선언하고 초기화해 보겠습니다.

double_quote_string = "I'm a string"
single_quote_string = 'I\'m a string'  # 작은따옴표 안의 아포스트로피는 이스케이프 처리 필요

참고: 작은따옴표로 감싼 문자열 안에 아포스트로피(작은따옴표)를 포함하려면 백슬래시(\)로 이스케이프해야 합니다. 그래야 문자열 종료가 아닌 문자열 값의 일부로 인식됩니다.

독스트링(Docstring)과 여러 줄 문자열

독스트링은 파이썬의 또 다른 문자열 형태입니다. 세 개의 따옴표(""" 또는 ''')로 감싸며, 함수나 클래스의 첫 줄에 위치하면 여러 줄 주석처럼 동작하며 해당 코드 블록의 용도를 설명합니다.

def print_string(s):
    """ 전달받은 문자열을 콘솔에 출력합니다 """
    print(s)

독스트링은 코드 블록의 목적을 설명합니다. 만약 로직에서 독스트링을 활용하고 싶다면 변수에 할당하면 되는데, 이때 독스트링은 여러 줄 문자열(Multi-line String)이 됩니다.

multiline = '''
    나는 변수에 할당할 수 있는 여러 줄 문자열입니다. 형식은
    입력한
       그대로
           유지됩니다.
                
                '''
print(multiline)

여러 줄 문자열은 세 따옴표 안의 포맷(들여쓰기, 줄바꿈)을 그대로 따릅니다. 변수에 할당하지 않으면 주석으로 취급되어 실행 시 무시됩니다.

로우 문자열(Raw String)

파이썬에는 로우 문자열이라는 개념이 있습니다. 이는 문자열 안의 모든 내용을 작성한 그대로 다루며, 특히 백슬래시(\)를 이스케이프 시퀀스로 해석하지 않습니다. 차이를 비교해 보세요.

not_raw = "I'm not a raw string, escape chars DO matter \n\r\t\b\a"
raw_string = r"I'm a raw string, escape chars don't matter \n\r\t\b\a"
print(not_raw)  # 줄바꿈, 탭 등 이스케이프 시퀀스가 적용되어 출력
print(raw_string)  # \n\r\t\b\a 가 그대로 문자열로 출력

로우 문자열은 일반 문자열 앞에 소문자 r을 붙여 표현합니다.

r"This is a raw string"

백슬래시가 특수 이스케이프 시퀀스로 해석되지 않게 하려면 로우 문자열을 사용하세요. 정규식 패턴이나 윈도우 파일 경로 등을 다룰 때 특히 유용합니다.

문자열 속 유니코드 문자

유니코드(Unicode)는 세상의 모든 언어에서 쓰이는 각 문자에 고유한 코드를 부여하는 문자 규약입니다. 문서에서는 보통 U+<16진수 값> 형태로 표기합니다. 예: U+2661 → ♡.

파이썬 3에서 유니코드 작성하기

파이썬 3에서는 일반 문자열 안에서 \u로 시작하는 이스케이프 시퀀스 뒤에 유니코드 코드포인트(16진수)를 적어 유니코드 문자를 표현합니다.

unicode_string = '\u2661'
print(unicode_string)  # ♡

유니코드 문자는 원하는 만큼 연속해서 쓸 수 있습니다. 이 방식은 파이썬 2와 다릅니다. 파이썬 2에서는 ASCII와 유니코드가 구분되어 u'\u<번호>' 같은 별도 유니코드 리터럴을 써야 했습니다.

문자열의 값에 접근하기

파이썬에서는 대괄호([])를 사용해 문자열의 각 문자에 접근합니다. 다른 언어와 마찬가지로 인덱스는 0부터 시작합니다(Zero-based Indexing). 즉, 첫 번째 문자는 인덱스 0입니다.

hello = "hello world"
print(hello[4])  # o

hello[4]는 5번째 문자 o를 출력합니다. 존재하지 않는 인덱스에 접근하면 IndexError: string index out of range 에러가 발생합니다.

참고: C나 Java 같은 언어에서는 문자가 별도의 자료형(char)을 가집니다. 하지만 파이썬에서는 개별 문자를 길이 1인 부분 문자열(Substring)로 취급합니다.

여러 문자 한 번에 접근하기 (슬라이싱)

문자열 슬라이싱(Slicing)을 사용하면 여러 문자를 한 번에 가져올 수 있습니다. 문법은 다음과 같습니다.

문자열변수[시작_인덱스? : 끝_인덱스?]

끝 인덱스는 포함되지 않습니다(Non-inclusive). 예를 들어 "Hello"[1:3]el을 반환하고 ell은 아닙니다.

파이썬 슬라이싱의 장점은 인덱스 값을 생략할 수 있다는 점입니다. 자주 쓰이는 패턴을 정리했습니다.

  • 문자열[:] — 콜론만 넣으면 문자열 전체를 복사합니다.
hello = "hello world"
copy = hello[:] + " ← 전체 문자열 복사"
print(copy)  # hello world ← 전체 문자열 복사
  • 문자열[시작_인덱스:] — 특정 인덱스부터 끝까지 자릅니다. 끝 인덱스를 생략하면 됩니다.
hello = "hello world"
copy = hello[2:] + " ← 2번 인덱스부터 끝까지"
print(copy)  # llo world ← 2번 인덱스부터 끝까지
  • 문자열[:끝_인덱스] — 처음부터 특정 인덱스 직전까지 자릅니다. 시작 인덱스 자리를 비웁니다.
hello = "hello world"
copy = hello[:7] + " ← 처음부터 7번 인덱스 직전까지"
print(copy)  # hello w ← 처음부터 7번 인덱스 직전까지
  • 문자열[시작_인덱스:끝_인덱스] — 두 인덱스 사이를 자릅니다. 끝 인덱스는 포함되지 않음에 유의하세요. 인덱스 1부터 6까지 원하면 hello[1:7]로 써야 합니다.
hello = "hello world"
copy = hello[1:7] + " ← 1번부터 7번 직전까지"
print(copy)  # ello w ← 1번부터 7번 직전까지

음수 인덱스도 사용할 수 있습니다. -1은 마지막 문자, -2는 끝에서 두 번째 문자를 가리킵니다.

hello = "hello world"
copy = hello[-7:-2] + " ← 음수 인덱스 슬라이싱"
print(copy)  # o wor ← 음수 인덱스 슬라이싱

슬라이싱은 원본 문자열을 변경하지 않고(new string in memory) 새로운 부분 문자열을 만들 때 유용합니다. 원본을 보존한 채로 문자열을 조작할 수 있습니다.

파이썬에서 문자열 순회하기

파이썬에서는 문자열을 배열처럼 다룹니다. for ... in 구문으로 배열을 순회하듯 문자열도 한 문자씩 순회할 수 있습니다.

# for ... in 문법
for <변수> in <문자열>:
    # 반복 로직

# 예제
word = "career karma"

for letter in word:
    print(letter)  # 각 반복마다 문자 하나씩 출력

여기서 letter에는 매 반복마다 word의 현재 문자가 할당되며, 루프 몸체에서 해당 문자를 다룰 수 있습니다.

문자열 길이 구하기

문자열의 길이를 구하려면 내장 함수 len()을 사용합니다.

len_example = "The quick brown fox jumps over the lazy dog."
print(len(len_example))  # 44

주의: 변수명이나 함수명으로 len을 쓰면 안 됩니다. 내장 함수 len()과 충돌해 의도치 않은 동작을 일으킬 수 있습니다.

innot in 연산자 활용하기

파이썬에서는 in, not in 키워드로 문자열 안에 특정 부분 문자열이 있는지 쉽게 검사할 수 있습니다.

check_string = "Career Karma will help you make a career switch to the tech industry"

위 문자열을 다음 두 예제의 검사 대상으로 사용합니다.

in 연산자

in은 검사 대상이 문자열에 포함되어 있으면 True, 없으면 False를 반환합니다. 문법이 자연어와 거의 같습니다.

print("tech" in check_string)  # True

읽는 법: "'tech'가 check_string 안에 있는가?" → "그렇다(True)."

not in 연산자

not in은 반대입니다. 검사 대상이 문자열에 없으면 True, 있으면 False를 반환합니다. 헷갈리기 쉬우니 주의하세요.

print("tech" not in check_string)  # False

읽는 법: "'tech'가 check_string 안에 없는가?" → "아니다(False). 'tech'는 안에 있다."

문자열의 내용을 바꿀 수 있을까? (불변성)

파이썬 문자열은 불변(Immutable)입니다. 한번 생성된 문자열의 개별 문자를 변경하거나 삭제할 수 없습니다.

del_string = "Can we delete this or change this?"
del_string[2] = "b"  # 에러 발생!
print(del_string)

이 코드를 실행하면 다음과 같은 에러가 발생합니다.

Traceback (most recent call last):
  File "main.py", line N, in 
    del_string[2] = "b"
TypeError: 'str' object does not support item assignment

TypeError는 문자열 객체가 항목 할당(Item Assignment)을 지원하지 않는다는 뜻입니다. 문자열 일부를 바꾸고 싶다면 새로운 문자열을 만들어 변수에 다시 할당해야 합니다.

del_string = del_string[:2] + "b" + del_string[3:]
print(del_string)  # Can we delete... → Cbn we delete...

위 코드가 문자열의 한 문자를 '변경'하는 올바른 방법입니다. 슬라이싱으로 앞부분과 뒷부분을 떼어내고 중간에 원하는 문자를 끼워 넣어 새 문자열을 만듭니다.

개별 문자를 삭제하는 것도 불가능합니다. 하지만 del 키워드로 문자열 변수 자체를 삭제할 수는 있습니다.

del del_string
print(del_string)  # NameError: name 'del_string' is not defined

자주 쓰는 문자열 메서드

파이썬 문자열에는 수많은 메서드가 있습니다. 최신 전체 목록은 파이썬 공식 문서를 참고하세요. 여기서는 실무에서 가장 많이 쓰이는 메서드들을 예제와 함께 소개합니다. 기준 문자열은 다음과 같습니다.

test_string = "this is a test string."

capitalize()

문자열의 첫 글자만 대문자로, 나머지는 소문자로 바꿔 새 문자열을 반환합니다.

capitalized = test_string.capitalize()
print(capitalized)  # This is a test string.

find()

인수로 받은 부분 문자열이 처음 나타나는 인덱스를 반환합니다. 없으면 -1을 반환합니다.

found = test_string.find("test")
not_found = test_string.find("not")

print(found)      # 10
print(not_found)  # -1

join()

join()은 메서드를 호출한 문자열을 구분자(Separator)로 삼아, 인수로 받은 이터러블(문자열, 리스트, 튜플, 집합 등)의 요소들을 연결해 하나의 문자열로 만듭니다.

separator = ", "  # 구분자 (메서드 호출 주체)
numbers = "123"   # 이터러블 (여기선 문자열)

joined_by_comma = separator.join(numbers)
print(joined_by_comma)  # 1, 2, 3

문자열뿐 아니라 리스트, 튜플, 집합 등 다양한 이터러블에 적용해 보세요. 예를 들어 ", ".join(["사과", "바나나", "체리"])"사과, 바나나, 체리"를 만듭니다.

lower()upper()

대소문자 변환 메서드입니다. 원본은 그대로 두고 변환된 새 문자열을 반환합니다.

uppercase = test_string.upper()
print(uppercase)  # THIS IS A TEST STRING.

lowercase = test_string.lower()
print(lowercase)  # this is a test string.

이밖에도 split()(분리), replace()(치환), title()(각 단어 첫 글자 대문자), swapcase()(대소문자 반전) 등 실용적인 메서드가 많으니 공식 문서에서 확인해 보시기 바랍니다.

마치며

이 글에서는 파이썬 문자열의 정의, 생성 방법, 인덱싱과 슬라이싱, 순회, 길이 구하기, 멤버십 연산자(in, not in), 불변성, 그리고 주요 내장 메서드까지 폭넓게 다뤘습니다.

이 가이드를 마스터했다면, 이제는 파이썬 문자열 포매팅(String Formatting) — f-string, .format(), % 연산자 등 — 을 배워 더 강력하고 읽기 좋은 문자열 처리 코드를 작성해 보세요!