지난 포스팅에서는 숫자를 다루는 정수형(int)과 실수형(float)에 대해 알아보았습니다. 숫자가 컴퓨터 연산의 기초라면, 문자열(String)은 우리가 보고 읽는 정보의 대부분을 차지하는 핵심 데이터입니다.
우리가 매일 사용하는 카카오톡 메시지, 이 블로그의 글, 웹사이트의 주소(URL)까지 모든 것이 '문자열'로 이루어져 있습니다. 따라서 프로그래밍을 잘한다는 것은 곧 "텍스트 데이터를 내 마음대로 자르고, 붙이고, 가공하는 능력"이 뛰어나다는 뜻과 같습니다.
파이썬은 타 언어(C, Java)에 비해 문자열을 다루는 능력이 압도적으로 강력하고 직관적입니다. 이번 글에서는 파이썬 문자열 처리의 양대 산맥인 인덱싱(Indexing)과 슬라이싱(Slicing)에 대해 완벽하게 정리해 드리겠습니다. 이 글을 다 읽으시면 주민등록번호에서 성별을 추출하거나, 긴 문장에서 특정 단어만 뽑아내는 일을 식은 죽 먹기처럼 하실 수 있게 됩니다.

1. 문자열(String)이란 무엇인가?
문자열은 문자(Character)들의 나열(Sequence)이라는 뜻입니다. 파이썬에서는 데이터를 큰따옴표(")나 작은따옴표(')로 감싸서 문자열임을 표시합니다.
text1 = "Hello Python"
text2 = '12345' # 숫자에 따옴표를 붙이면 문자가 됩니다.
여기서 중요한 점은, 파이썬 입장에서 문자열은 단순히 한 덩어리의 데이터가 아니라, '순서가 있는 문자들의 집합'이라는 사실입니다. 순서가 있다는 것은 각 문자마다 고유한 번호가 매겨져 있다는 뜻이며, 우리는 이 번호를 이용해 문자열을 마음대로 조종할 수 있습니다.
2. 콕 집어내기: 인덱싱(Indexing)
인덱싱(Indexing)은 말 그대로 '무언가를 가리킨다(Index)'는 뜻입니다. 문자열 속에서 내가 원하는 특정 문자 하나를 콕 집어내고 싶을 때 사용합니다.
(1) 컴퓨터는 0부터 센다 (Zero-based Numbering)
프로그래밍을 처음 접할 때 가장 적응하기 힘든 규칙입니다. 우리는 첫 번째를 '1번'이라고 부르지만, 컴퓨터는 '0번'부터 숫자를 셉니다. 이를 인덱스(Index)라고 부릅니다.
word = "Python"
위 word 변수에서 각 글자의 주소는 다음과 같습니다.
- P : 0번
- y : 1번
- t : 2번
- h : 3번
- o : 4번
- n : 5번
따라서 'P'를 꺼내고 싶다면 대괄호 [] 안에 번호를 적어주면 됩니다.
print(word[0]) # 결과: P
print(word[3]) # 결과: h
(2) 파이썬만의 마법: 마이너스(-) 인덱싱
다른 언어에는 없는 파이썬만의 강력한 기능입니다. 만약 문자열이 엄청나게 길어서 끝 번호를 알기 어렵다면 어떻게 맨 마지막 글자를 가져올까요? 파이썬에서는 뒤에서부터 셀 때는 마이너스(-)를 사용합니다.
word [-1]: 뒤에서 첫 번째 (가장 마지막 글자 'n')word [-2]: 뒤에서 두 번째 ('o')
print(word[-1]) # 결과: n
이 기능 덕분에 문자열의 길이를 몰라도 마지막 글자를 쉽게 추출할 수 있습니다.
3. 싹둑 잘라내기: 슬라이싱(Slicing)
인덱싱이 문자 '하나'를 뽑는 것이라면, 슬라이싱은 '범위를 지정해서 통째로 잘라내는 것'입니다. 식빵을 슬라이스(Slice)해서 자르는 것을 상상하시면 됩니다.
(1) 슬라이싱 기본 문법
대괄호 안에 콜론(:)을 사용하여 범위를 지정합니다.
(2) ★가장 중요한 규칙: "끝 번호는 포함하지 않는다"
초보자가 가장 많이 틀리는 부분입니다. 파이썬의 슬라이싱 범위는 '시작 번호 이상, 끝 번호 미만'입니다. 즉, 끝 번호 바로 앞까지만 가져옵니다.
word = "Python"
print(word[0:2])
위 코드의 결과는 무엇일까요? 'P', 'y', 't'까지 나올 것 같지만, 실제로는 0번과 1번인 'Py'만 출력됩니다. 2번인 't'는 포함되지 않습니다.
Tip: word [0:2]는 "0번부터 시작해서 2개를 가져와라"라고 이해하면 헷갈리지 않습니다. (2 - 0 = 2개)
(3) 시작과 끝 생략하기
콜론 앞뒤의 숫자를 생략하면 "처음부터" 또는 "끝까지"라는 의미가 됩니다.
word [:3]: 처음(0)부터 3번 미만까지 (Pyth)word [3:]: 3번부터 끝까지 (hon)word [:]: 처음부터 끝까지 (복사할 때 자주 씀)
4. 고급 기술: 간격(Step) 설정하기
슬라이싱에는 숨겨진 세 번째 옵션이 있습니다. 바로 몇 칸씩 건너뛸지를 정하는 '간격(Step)'입니다.
number = "123456789"
print(number[::2]) # 처음부터 끝까지 2칸씩 점프 -> "13579" (홀수만 추출)
특급 비기: 문자열 뒤집기
간격에 -1을 넣으면 어떻게 될까요? 거꾸로 한 칸씩 간다는 뜻이 되어, 문자열이 완전히 뒤집힙니다.
print(number[::-1]) # 결과: "987654321"
이 코드는 알고리즘 테스트(코딩 테스트)에서도 자주 사용되는 꿀팁입니다.
5. 주의사항: 문자열은 수정할 수 없다 (Immutable)
마지막으로 조금 어려운 이야기를 해보겠습니다. 인덱싱으로 문자를 꺼낼 수는 있지만, 인덱싱으로 문자를 바꿀 수는 없습니다.
word = "Python"
word[0] = "J" # 'P'를 'J'로 바꾸고 싶다! -> 에러(Error) 발생!
위 코드를 실행하면 TypeError가 발생합니다. 파이썬에서 문자열은 한 번 생성되면 그 내용을 변경할 수 없는 '불변(Immutable) 객체'이기 때문입니다.
수정하고 싶다면 어떻게 해야 할까요? 기존 문자열을 고치는 게 아니라, 슬라이싱을 이용해 새로운 문자열을 조합해서 만들어야 합니다.
word = "Python"
new_word = "J" + word[1:] # "J" + "ython"
print(new_word) # 결과: "Jython"
6. 결론: 데이터를 다루는 칼, 슬라이싱
오늘은 파이썬 문자열 처리의 기초이자 핵심인 인덱싱과 슬라이싱에 대해 깊이 있게 알아보았습니다. 정리하자면 다음과 같습니다.
- 인덱싱: 0번부터 시작하며, -1은 맨 뒤를 의미한다.
- 슬라이싱:
[시작:끝]형태이며, 끝 번호는 포함되지 않는다. - 불변성: 문자열의 일부를 직접 수정할 수는 없다.
이 개념만 확실히 잡아도 여러분은 이미 데이터를 가공할 수 있는 훌륭한 도구를 손에 넣은 셈입니다. 다음 포스팅에서는 문자열 안에 변수를 예쁘게 집어넣는 기술, '문자열 포맷팅(Formatting)의 3가지 방법(f-string 등)'에 대해 자세히 소개하겠습니다. 이 기능까지 익히면 문자열 처리는 마스터했다고 보셔도 좋습니다.