문자열(String)도 객체다.

우리는 일반적인 문자열(string)에 대한 정의를 따르기 보다는 파이썬에서 제시하는 정의를 따르기로 하자. 파이썬의 표준 문서에서 문자열은 아래와 같이 정의한다.

A string is a sequence of values that represent Unicode code points. [...]. Python doesn’t have a char type; instead, every code point in the string is represented as a string object with length 1., https://docs.python.org/3/reference/datamodel.html#the-standard-type-hierarchy

파이썬에서 문자열이란 유니코드의 코드 포인트를 표현하는 시퀸스(sequence)의 일종이다. 읽어볼수록 유니코드에 대한 내용이 눈에 띄고, 무엇보다 char 타입이 없다는 것에서 다시 한 번 놀랍다. 파이썬에서 char 타입이 없다는 점에서 알 수 있듯이 파이썬은 문자열을 사용해서 문자를 표현한다는 것을 알 수 있다. 따라서 문자열에서 하나의 문자를 표현하기 위해선 유니코드에 대한 이해가 필수적이라는 것도 직감적으로 확인할 수 있다.

이후 정의는 문자열에 저장된 유니코드 코드 포인트는 길이가 1인 문자열 객체로 표현(저장)된다는 것을 정의한다. 일단 이 정의를 이해하기 위해선 기본적으로 우리가 알아야 할 것이 몇 개 있는데 1) 유니코드, 2) 시퀸스, 3) char 에 대한 사전지식이다. 우리의 직감은 틀리지 않았다. 그리고 생각보다 문자열을 이해하기 위해선 많은 것을 알아야 한다는 점이다. 당산 이 모든 것을 알고 싶지만, 그럼에도 불구하고 몇가지 내용을 유추해보자.

일단은 파이썬에서 문자열은 객체다. 당연하게도 '상태(state)'와 '행위(behavior)'를 가져야(must) 한다. 그래서 문자열 객체는 '유니코드의 코드 포인트'를 '상태'로 가진다(혹은 가져야한다). 그런데 문자열 객체의 상태값은 순서를 가진다는 것도 확인할 수 있다. 왜냐하면, '유니코드의 코드 포인트'를 '순서가 있는 연속적(sequence)' 형태로 관리한다는 것에서 확인 할 수 있다. 정리하면 파이썬에서 문자열 객체는 "유니코드의 코드 포인트를 순차적으로 관리"하는 객체다.

상태가 행위를 결정한다.

어려운 이야기를 제외하고, 문자열 객체는 순서가 있는 코드 포인트를 관리한다. 따라서 '순서'가 있다는 점에서 확인할 수 있듯이, 문자열은 '순서'를 생성, 출력, 변경하는 기능을 제공해야 한다. 예를 들어 아래와 같은 간단한 예제가 있다고 가정하자.

python_string = 'Hello, World'

이때 python_string 변수는 Hello, World라는 문자열 객체를 참조한다. 이때, 홑따옴표(')를 사용해서 감싸면 해당 부분이 '문자열 객체'로 생성된다. 따라서 python_string이 가리키는 문자열은 H/e/l/l/o/,/*/W/o/r/l/d 순서의 유니코드의 코드 포인트가 저장될 것이다. print() 함수를 사용해서 python_string을 출력하면 해당 객체에 저장된 순서대로 유니코드 코드 포인트가 출력될 것이다.

문제는 문자열을 변경하는 방법이다. 여러분도 충분히 상상할 수 있듯이 'H'를 'h'로 변경하는 방법은 첫번째 유니코드의 코드 포인트를 'H'에 해당하는 유니코드의 코드 포인트 대신에(instead of) 'h'에 해당하는 유니코드의 코드 포인트로 변경하는 것이다. 우리가 '첫번째'로 지칭할 수 있는 근본적인 이유는 문자열이 '순서'를 가지고 있다는 점 때문이다.

하지만, 생각대로 되지 않는다.

문자열의 첫글자를 변경해보자. 하지만 생각대로 되지 않는다. 첫번째 위치를 지칭하는 [0]을 사용해서 h로 변경하고자 했으나 TypeError: 'str' object does not support item assignment 에러가 발생한다. 오류 메시지에서 'object'는 문자열('Hello, World')이고, 'item'은 할당하려고 한 문자('h')다.

>>> python_string = 'Hello, World'
>>> python_string[0] = 'h'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>>

모든 객체는 특성이 있다.

생각처럼 작동하지 않는다. 객체가 가진 상태를 손쉽게 변경할 수 있을꺼라 생각했지만, 쉽게 진행되지 않는다. 그리고 객체의 '행위'라는 것이 생각보다 많은 제약사항이 존재한다. 하나의 객체를 이해하기 위해선 '상태'와 '행위'에 대한 좀 더 정밀한 분류가 필요하다.

문자열에 '순서'가 있다는 것은, 순서가 없는것도 있을 것이다. 변경되지 않는 객체가 있다면, 변경되는 객체도 있을 것이다. 그렇다면 이러한 특징은 파이썬에서 어떻게 구성되는 것일까? 문자열 객체에 순서가 있다면, 내가 만든 객체도 순서를 강제할 수 있을까? 아니면, 순서가 있는 것도 '객체'일까?

문자열을 이루고 있는 몇가지 중요한 구성 사항을 알아보자.