파이썬 문자열 | 파이썬 독학 4-2

파이썬 문자열 개요

문자열(String)은 문자(Character)들의 배열(Array)이라고 말할 수 있습니다. 컴퓨터언어를 배울 때 문자열이 차지하는 중요도는 매우 높습니다.

결국은 컴퓨터의 소스코드도 문자열이고 사용자(User)가 보는 UI(User Interface)도 문자열이 주가 됩니다.

우리가 컴퓨터를 다룰 때 대부분의 경우 문자열에 의존하게 됩니다. 단지 컴퓨터는 우리 사람이 이해하는 것 처럼 문자열을 알아듣지 못할 뿐 입니다.

거기서 부터 문자열을 취급하는 어려움이 생기는 것 입니다. 문자열을 다루기 위해 왜 이런 짓을 해야하지? 너무 비효율적인거 아니야? 라는 생각이 든다면 자연스러운 것 입니다.

크게보면 프로그래머는 문자열을 이해하는 유저와 문자열을 해석하지 못하는 컴퓨터 사이에서 중계를 하는 일을 합니다.

초창기 프로그래머는 이 일을 모두 혼자서 감당해왔다면 지금은 상당히 분업이 이루어져 있습니다.

웹개발에서 서버를 담당하는 백엔드와 UI를 담당하는 프론트엔드가 나뉘어 진 것은 불과 몇년밖에 되지 않습니다. 백엔드는 주로 컴퓨터를 상대로 하고 프론트엔드는 주로 유저를 상대하는 일이지요.

웹의 초창기에는 한 사람이 컴퓨터와 유저 모두를 감당했습니다.

좀 어려운 이야기입니다. 저도 프로그래밍을 시작한 초창기에는 왜 문자열을 공부하는지 이해를 못했습니다. 아무도 그런 것은 가르쳐 주지 않죠. 단지 이것은 문자열 챕터니까 이 메소드를 이렇게 사용한다 정도 였습니다.

이렇게 보면 아이디어를 얻을 수 있을 것 입니다.

문자는 인간을 위한 것입니다. 컴퓨터는 0과 1의 논리로 작동합니다. 우리가 코딩할 때 0과1만 다루는 것은 아니지만 0과1이 사고하는 방식으로 프로그램을 작성합니다.

프로그래머는 인간과 컴퓨터의 중간에 그들이 서로 소통할 수 있는 세계를 창조합니다.

이번 포스트는 서론이 좀 길었습니다. 앞으로 문자열 챕터를 진행하면서 기계적인 학습이 아니라 문자열의 의미를 생각하며 실습을 하면 일취월장할 수 있을 것이라 생각합니다.

파이썬 문자열
파이썬 문자열

주요내용

1. 파이썬 문자열의 기본을 이해합니다.

2. 파이썬 문자열을 만들고 조작할 수 있습니다.

파이썬 문자열 만들기

파이썬 문자열은 리스트 처럼 시퀀스(Sequence)의 특징을 가지고 있습니다. 시퀀스는 순서가 있으니까 인덱스를 사용해서 각 요소에 접근할 수 있습니다.

예제로 알아보겠습니다.

myString = "python is fun!"
 
print(myString)
python is fun!

“python is fun” 이 문자열입니다. ” ” 따옴표를 사용해서 문자열의 처음과 끝을 표시합니다. ‘ ‘ 작은 따옴표를 사용해도 됩니다. 처음엔 헷갈리니까 하나로 통일해서 사용하는게 좋습니다.

C와 같은 프로그래밍언어에서는 ‘ ‘ 작은 따옴표는 문자 ” ” 큰 따옴표는 문자열로 구분하기 때문에 여러개의 언어를 배우다보면 좀 혼동스럽습니다.

다른 언어의 문법과 구분하여 ‘파이썬 문자열’, ‘C언어 문자열’ 을 사용하는 습관을 들이면 여러개의 언어를 배울 때 유용합니다.

“python is fun!” 을 분석해보면 공백문자 ” “도 있습니다. 공백 ” “은 사람 눈에 보이지 않지만 거기에 문자가 저장되어 있습니다.

이런 개념이 컴퓨터에는 있고 사람에는 없는 것 입니다. 디테일한 부분도 놓치지 않고 잘 잡아내도록 합니다.

myString = "Python String"
 
for i in range(len(myString)):
    print(myString[i], end=' ')
 
print()
 
for i in range(-1, -len(myString)-1, -1):
    print(myString[i], end=' ')
P y t h o n   S t r i n g 
g n i r t S   n o h t y P 

위의 코드는 인덱스를 사용하는 예제입니다. for문을 사용해서 약간 복잡해보이죠?

이보다 가독성 좋은 코드가 있습니다만, 인덱스의 개념을 보여주기 위한 예제로 작성했습니다.

앞으로 시퀀스의 인덱스를 사용할 때는 for문을 많이 사용할 것 입니다. 시퀀스의 전체를 스캔하려면 for 문이 편하고 또 파이썬 for 문의 여러가지 사용법을 익힐 수 있기 때문입니다.

for i in range(횟수-1): 의 형식을 사용했습니다. len 은 요소들의 갯수를 구합니다. Python String 을 구할 때는 가운데 공백도 1이 카운트 된다는 점에 주의합니다.

len으로 인덱스의 크기를 파악하는 일은 중요합니다. 왜냐하면 시퀀스의 대표적 에러인 index out of range 에 걸리기 때문입니다.

쉽게말해 myString의 인덱스 크기는 13인데 이 범위를 넘어가는 인덱스를 사용하면 에러가 발생합니다. 존재하지 않는 인덱스를 사용한다고 하니 당연히 안되는 것입니다.

간단한 에러지만 문자열은 각자의 길이가 다르기 때문에 의외로 걸리기 쉬운 에러입니다.

인덱스가 13이라면 실제로는 0부터 12까지 사용할 수 있습니다. 또한 -1부터 -13까지도 사용할 수 있습니다. 예제에서는 -1에서 시작해서 인덱스를 마이너스로 계속 내립니다. 즉 역순으로 가져옵니다.

언뜻 헷갈리지만 파이썬 문자열 인덱스에서 -1 은 len(문자열)-1 과 같습니다. 즉 인덱스의 끝을 계산할 필요 없이 -1 로 바로 사용할 수 있다는 장점이 있습니다.

슬라이스

문자열 슬라이스는 말 그대로 문자열을 자르는 방법입니다.

>>> newStr = "apple juice"
>>> newStr[0:3]
'app'
>>> newStr[1:3]
'pp'
>>> newStr[:3]
'app'
>>> newStr[:-1]
'apple juic'
>>> newStr[:]
'apple juice'

슬라이스는 테크닉이라서 인터프리터에서 직접 따라해보는게 좋습니다. 반복작업을 통해서 손에 익게 됩니다.

문자열 연산

>>> myFruit = "orange"
>>> myFavorite ="juice"
>>> myFruit + myFavorite
'orangejuice'
>>> myFruit
'orange'
>>> myFruit * 3
'orangeorangeorange'

문자열 연산에서 +는 문자열을 합치는 연산을 합니다. 사실 문자열은 불변(immutable)의 특성을 갖기 때문에 합친다는 표현이 정확하지는 않지만 적어도 우리가 볼 때는 합쳐진 것으로 보입니다.

이전 학습에서 리스트는 시퀀스이며 가변(mutable)인 자료형이라 했습니다. 반면 문자열은 불변(immutable) 입니다. 좀 어렵게 들립니다만 쉽게말해 문자열 연산을 통해 만들어진 새로운 문자열은 기존의 문자열의 메모리를 조작하는게 아니라 새로운 메모리 영역에 생성된다는 말입니다.

기존의 문자열이 변경되지 않는 것은 인덱스에 새로운 값을 대입하려 시도해보면 알 수 있습니다.

>>> myStr = "mango"
>>> myStr[0]
'm'
>>> myStr[0] = 'G'
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    myStr[0] = 'G'
TypeError: 'str' object does not support item assignment
>>> 

기존의 문자열 인덱스 0에 새로운 값을 대입하려고 했을 때 오류가 납니다. ‘str’ – 문자열 객체는 아이템 할당을 지원하지 않습니다는 에러문입니다. 즉 이 타입(type)의 변수는 한번 값이 정해지면 바꿀 수 없는 불변이라는 뜻 입니다.

차후 학습할 것 이지만 파이썬의 모든 것은 객체(object)로 이루어져 있습니다. object 라는 단어가 나오는 것에 지금은 너무 신경쓸 필요는 없습니다.

중요한 것은 문자열은 불변(immutable) 이다는 것 입니다. 초기에 개념들을 확실히 익혀둬야 나중으로 갈수록 학습이 수월합니다.

대부분 교재에서 후반부에 가면 콜렉션 객체 immutable / mutable 이런 식으로만 설명하게 됩니다.

파이썬 문자열을 리스트로 변경

문자열과 리스트는 비슷하기도 하고 차이가 나는 부분도 있습니다.

불변인 문자열을 가변인 리스트로 변경해서 요소를 수정하면 어떨까요?

답변은 가능합니다.

>>> name = "Janny"
>>> nameL = list(name)
>>> nameL[:2] = "Pe"
>>> nameL
['P', 'e', 'n', 'n', 'y']
>>> name = ''.join(nameL)
>>> name
'Penny'

문자열을 list( ) 함수로 변환하면 그대로 리스트로 변합니다. 이대로 봐도 인덱스가 같다는 것을 알 수 있습니다.

슬라이스 연산으로 범위를 지정하여 리스트의 요소를 변경 후 join 메소드로 다시 문자열에 할당합니다.

과정이 복잡합니다. 사실 이 방법이 문자열을 사용하는 가장 효율적인 방법이라고 할 수는 없습니다. 이렇게 보면 문자열 연산으로 새로운 객체를 생성하는 방식은 나름의 효율성이 있습니다.

문자열을 리스트로 변경하는 방식은 함수만 두번 호출합니다. 일반적으로 함수호출은 메모리에 새로운 문자열 객체를 할당하는 것 보다 많은 자원을 소모합니다.

이 과정은 초급과정이므로 너무 복잡한 이야기는 웬만하면 생략하려고 합니다만 앞서 이야기한 것 처럼 문자열은 프로그래밍에 있어서 매우 중요한 부분이기 때문에 이런 고민도 향후 할 수 있다는 정도로 알아두면 좋겠습니다.

위의 예제는 영문뿐 아니라 한글로도 작동합니다. 파이썬은 유니코드를 사용하기 때문입니다. byearray와 유니코드를 사용하면 더 복잡한 컨트롤도 가능하지만 여기서는 이 정도 까지만 설명하겠습니다.

요약

파이썬 문자열에 대해 설명하면서 다른 챕터들과는 다르게 약간은 좀 깊은 접근을 해봤습니다.

우리가 컴퓨터를 사용한다는 것은 컴퓨터의 스크린을 통하여 문자를 읽고 이에 대한 반응을 하는 것에서 시작합니다. 보통의 컴퓨터 사용자(User)들이 0과1 을 보면서 업무를 처리하지는 않습니다.

파이썬에서 0과 1을 볼일은 좀체 없겠지만 이 안에서 돌아가고 있는 일들을 더 잘 이해하기 위해서 컴퓨터의 구조에 대하여 관심을 가질 필요가 있습니다.

컴퓨터 안에서 일어나는 이런 일들에 크게 관심이 없거나 하면 코딩을 못하는건가요? 라고 물으면 그렇지는 않습니다. 컴퓨터의 0과1 처리방식 보다 중요한 일도 세상에는 많습니다.

예를 들어 컴퓨터 주식트레이딩 프로그램을 하려면 컴퓨터 내부의 지식보다 주식시장에 대한 인사이트가 더 중요할 것 입니다.

단지 공학적으로 더 좋은 프로그래머가 되기 위해서는 사물을 깊게 볼 필요가 있다는 말입니다.

앞으로도 종종 중요하다고 생각되는 포인트가 있으면 조금 더 설명을 붙이겠습니다. 설명을 읽고 이해하는 일도 중요하지만 그보다 중요한 것은 자신의 실력을 높이는 것은 연습이라는 것을 잊지 마시길 바랍니다.

외부참조링크

파이썬 코딩 1-3 | 파이썬의 자료형 | 숫자,문자열 연산자

파이썬 문자열 사용법 정리 | Python String

내장형 str — Python 3.9.1 문서

Leave a Comment