문자열 기본

 

파이썬에서 문자열(string)은 문자들의 집합으로, 텍스트 데이터를 다루기 위해 사용됩니다. 문자열은 파이썬에서 가장 많이 사용되는 데이터 타입 중 하나이며, 큰 따옴표(" ")나 작은 따옴표(' ')로 감싸서 생성할 수 있습니다.

 


작은 따옴표(' ')로 감싸서 문자열을 생성해보도록 합니다.

 

코드:

a = 'Hello Python'
print(a)

 

결과:

print("hello python")

 

변수 a는 작은 따옴표(' ') 로 감싼 'Hello Python'을 바인딩 하였고 그값을 출력하였습니다.


큰 따옴표(" ")로 감싸서 문자열을 출력해봅니다.

 

코드:

a = "Hello Python"
print(a)

 

답변:

Hello Python

 

큰 따옴표(" ")로 감싼 문자열 역시 잘 출력되었습니다.


type() 함수를 이용하여  변수의 타입을 확인해봅니다.

 

코드:

a = "Hello Python"
b = 'Hello Python'
print(type(a))
print(type(b))

 

 

결과:

<class 'str'>
<class 'str'>

 

작은 따옴표(' ')  또는 큰 따옴표(" ")로 감싼 데이터는 두개다 문자열 데이터로 str이 타입으로 지정되었습니다. str은 string의 약자로 문자열의 약자입니다.


앞서 print 에서 사용했던 작은 따옴표(' ')  또는 큰 따옴표(" ") 모두 문자열 데이터입니다.

 

코드:

print("hello python")

 

결과:

hello python

 

print에서 문자열을 바로 출력하여 사용하였습니다.

변수를 만들지 않고 바로 print를 이용하여 출력이 가능합니다.

 

아래의 코드로 문자열입니다. 

코드:

"hello python"

 

코드의 활용면에서 변수로 만든것도 아니고 출력을 한것도 아니지만 문자열 로 생성된 데이터 입니다.  코드의 가독성면이나 설명하기 편하도록 문자열을 생성 후 변수에 바인딩하여 진행하도록 하겠습니다.


작은 따옴표(' ')  또는 큰 따옴표(" ")로 나눈 이유로는 우리가 print부분에 다루었습니다.

큰 따옴표(" ") 를 포함한 문자열을 만들고 싶다면 밖을 작은 따옴표(' ') 로 감싼 문자열을 만들면 됩니다.

 

코드:

a = 'say "hello"'
print(a)

 

결과:

say "hello"

 

큰 따옴표(" ")를 출력하기 위해서 작은 따옴표(' ') 로 감싸 에러 없이 큰 따옴표가 잘 출력되었습니다.


반대로 작은 따옴표(' ')를 포함한 문자열을 만들고 싶다면 큰 따옴표(" ")로 감싼 문자열을 만듭니다.

 

코드:

a = "say 'goodbye'"
print(a)

 

 

결과:

say 'goodbye'

 

큰 따옴표(" ") 감싼 문자열로 작은 따옴표는 잘 출력되었습니다.


여러줄의 문자열을 표현하기 위해서 큰따옴표 3개(""" """) 감싸 여러줄의 문자열을 만들 수 있습니다.

 

코드:

a = """여러줄의
문자열
입니다"""
print(a)

 

결과:

여러줄의
문자열
입니다

 

큰따옴표 3개(""" """)로 감싸 여러줄의 문자열을 만들었습니다. 큰따옴표 3개(""" """) 는 a 변수에 대입하지 않았다면 주석으로도 사용가능합니다. a 변수에 바인딩되어 문자열로 생성되었습니다.


작은따옴표 3개(''' ''')로 감싼 데이터 역시 여러줄의 문자열을 만들 수 있습니다.

 

코드:

a = '''작은 따옴표 3개 역시
여러줄의
문자열
입니다'''
print(a)

 

 

결과:

작은 따옴표 3개 역시
여러줄의
문자열
입니다

 

작은따옴표 3개(''' ''')로 감싼 데이터 역시 여러줄의 문자열 데이터 입니다. 작은따옴표 3개(''' ''')  와  큰따옴표 3개(""" """) 로 여러줄의 문자열을 표현하는 방식이 2개나 있는 이유로는 큰따옴표 3개(""")를 문자열에 포함하고 싶다면 작은따옴표 3개(''' ''')로 감싸고 작은따옴표 3개(''')를 문자열에 포함하고 싶다면 큰따옴표 3개(""" """)로 감싸기 위함입니다.


문자열과 숫자형은 생성시에 차이점이 있습니다. 문자열 데이터는 큰 따옴표(" "),작은 따옴표(' ') , 큰따옴표 3개(""" """) , 작은따옴표 3개(''' ''') 로 감싸야합니다.

 

코드:

a = '1'
b = "3.14"
c = 'hello'
d = 1
e = 3.14

print(a,type(a))
print(b,type(b))
print(c,type(c))
print(d,type(d))
print(e,type(e))

 

 

결과:

1 <class 'str'>
3.14 <class 'str'>
hello <class 'str'>
1 <class 'int'>
3.14 <class 'float'>

 

'1'은 문자열(str) 데이터이며, 1은 정수형(int) 데이터입니다. 마찬가지로 "3.14"는 큰따옴표로 감싼 문자열(str) 데이터이고, 3.14는 소수점형(float) 데이터입니다.

이처럼 출력되는 결과가 동일해 보일 수 있지만, 문자열 데이터와 숫자형 데이터는 완전히 다른 데이터 형식입니다.

특히 코드가 길어지거나 라이브러리를 통해 데이터를 받을 때, 제공되는 데이터가 어떤 형식인지 명확하지 않을 수 있습니다. 예를 들어, 1이 출력되었을 때, 그것이 숫자형 1인지 문자열 1인지 모를 수 있습니다. 이러한 경우, type() 함수 등을 사용하여 데이터 타입을 확인하고 사용하는 경우가 많습니다.


이스케이프 시퀀스

 

"이스케이프(escape)"는 "탈출"이라는 의미로, 파이썬의 문자열에서 "이스케이프 시퀀스"는 특별한 문자를 표현하기 위해 사용됩니다. 이스케이프 시퀀스는 백슬래시(\)로 시작하며, 그 뒤에 특정 문자가 따라와서 특정 기능을 수행하거나 특정 문자를 나타내도록 합니다.

\를 키보드에서 찾을려면 [엔터] 버튼 위에 원화표시 [ ₩ |] 키를 입력하면 됩니다. [ ₩ |] 키를 입력하면 프로그램의 개발환경에서는 \(역슬래쉬)로 주로 입력되고 한글등 문서프로그램에서는 ₩(원화) 표시로 입력됩니다.

 

아래의 코드를 작성하여 이스케이프 시퀀스를 확인해봅니다.

 

코드:

a = "hello\npython"
print(a)

 

 

결과:

hello
python

 

hello가 출력되고 줄바꿈이 된다음 python이 출력되었습니다 이는 \n 이 틀벽한 기능을 가지는 이스케이프 시퀀스로 동작하였습니다. 문자열에서 \n을 만나면 줄바꿈을 합니다. 

 

\t 를 만나면 [탭] 의 기능을 합니다.

 

코드:

a = "hello\tpython"
print(a)

 

결과:

hello	python

 

문자열에서 \t를 만나 [탭]으로 여러칸 띄어쓰기 되었습니다.

 

\를 그대로 표현하기 위해서 \\를 이용하여 \를 2번 사용하여 그대로 표현할 수 있습니다.

 

코드:

a = "hello\\python"
print(a)

 

결과:

hello\python

 

\\를 두번 입력하여 \를 그대로 표현하였습니다.

 

 

큰 따옴표(" ")로 감싼 문자열에서 " 를 표현하기 위해서는 \"를 사용합니다.

 

코드:

a = "hello\"python\""
print(a)

 

결과:

hello"python"

 

큰 따옴표(" ")로 감싼 문자열에서 \"를 이용하여 큰따옴표를 그대로 표현하였습니다. \' 를 이용하여 작은 따옴표로 감싼 문자열에서 작은따옴표(')또한 표현 가능합니다.

 

아래는 이스케이프 스퀀스로 동작하는 표 입니다.

이스케이프 시퀀스 설명
\\ 백슬래시(\) 자체로 표시
\' 작은 따옴표(')
\" 큰 따옴표(")
\n 줄바꿈
\t 탭 간격
\r 캐리지 리턴

파이썬을 이용하여 파일이나 폴더를 액세스하는 경우가 많습니다. 파일이나 폴더를 액세스한다는 가정하에 폴더에 접근해보겠습니다.

 

코드:

path = "C:\new"
print(path)

 

결과:

C:
ewfile

 

윈도우에서 파일의 경로를 이동하는 \ 역슬래쉬는 파이썬의 문자열 이스케이스와 동일합니다. 폴더의 이름이 new폴더로 C드라이브에 존재합니다. 파일을 액세스 하기 위해 파일의 경로를 입력하였는데 \n을 만나 이스케이프 시퀀스로 동작하여 줄바꿈이 되었습니다. 이럴경우 정상적으로 파일이나 폴더의 경로를 불러오지 못합니다.

 

hello 폴더를 액세스 해보도록 합니다.

 

코드:

path = "C:\hello"
print(path)

 

결과:

C:\hello

 

C드라이브의 hello 폴더는 \h가 이스케이프 시퀀스로 동자하지 않기때문에 정상적으로 표시되었습니다. 파이썬에서 파일이나 폴더를 액세스 하기위해서 n이나 t로 시작하는 폴더를 만들지 않으면 됩니다. 하지만 이런 프로그램은 절대 만들면 안됩니다. 프로그램을 만들어 배포한다고 하면은 사용자는 어떤 이름으로도 만들 수 있기때문에 잠재적인 오류가 발생할 수 있는 프로그램입니다.

 

몇가지 방법으로 이스케이프 시퀀스로 동작하지 않도록 할 수 있습니다.

 

\\를 두번 입력하여 \ 그대로 표시하도록 합니다.

 

코드:

path = "C:\\new"
print(path)

 

결과:

C:\new

 

\\를 사용하여 \를 그대로 보여줘 폴더의 경로를 잘 액세스 하였습니다.

 

문자열 앞에 r을 붙여 문자열 그대로 출력되도록 할 수 있습니다.

 

코드:

path = r"C:\new"
print(path)

 

결과:

C:\new

 

파이썬에서 r 리터럴은 "raw string"을 나타내는 데 사용됩니다. "raw string"은 문자열 내의 이스케이프 시퀀스(예: \n, \t 등)를 처리하지 않고, 있는 그대로의 문자열로 취급합니다. 파일 또는 폴더의 경로를 처리할때 매우 편리합니다.


문자열의 연산

 

문자열의 연산에 대해서 알아봅니다.

 

문자열을 + 덧샘 연산을 이용해 문자열을 더할 수 있습니다.

 

코드:

a = "hello"
b = "python"
print(a+b)

 

결과:

hellopython

 

문자열의 덧샘은 문자열을 이어붙인 형태 입니다.

 

변수의 생성시에도 덧샘연산을 이용하여 생성이 가능합니다.

 

코드:

a = "hello" + 'python'
print(a)

 

결과:

hellopython

 

결과 역시 동일합니다.

 

문자열 변수를 생성할때는 덧샘 기호를 생략해도 됩니다.

 

코드:

a = "hello""python"'123'
print(a)

 

결과:

hellopython123

 

문자열의 생성시에는 +덧샘을 생략하여 생성이 가능하며 문자열을 이어붙인 형태로 출력됩니다.


문자열 변수를 이용하여 덧샘을 생략하면 안됩니다. 아래의 코드는 잘못된 코드 입니다.

 

코드:

a = "hello"
b = "python"
print(ab)

 

결과:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[12], line 3
      1 a = "hello"
      2 b = "python"
----> 3 print(ab)

NameError: name 'ab' is not defined

 

에러가 발생합니다. 에러의 원인으로는 ab 라는 이름이 정의되지 않아서 발생하는 오류로 ab는 변수로 선언되지 않아서 발생하는 오류 입니다.


문자열은  (*)곱셈 연산이 가능합니다.

 

코드:

a = "hello"
print(a*3)

 

결과:

hellohellohello

 

문자열의 곱셈 연산은 문자열을 곱한 횟수만큼 이어붙인 형태가 됩니다.

 

아래와 같은 코드형태는 터미널에 값을 출력할때 다른 값들과 구분하기 위하여 자주 사용하는 방법입니다.

 

코드:

print("="*50)
print("값출력1")
print("="*50)

print("-"*50)
print("값출력2")
print("-"*50)

 

결과:

==================================================
값출력1
==================================================
--------------------------------------------------
값출력2
--------------------------------------------------

 

문자열의 곱셈연산을 이용하여 =과 -을 손쉽게 여러번 출력하였습니다. 위와 같은 형태의 방식을 사용하면 터미널에 다른 값들과 분리되어 내가 원하는 값만 출력하여 보기가 편합니다.


문자열의 (/)나누기 연산은 허용하지 않습니다. 아래의 코드를 에러가 발생합니다.

 

코드:

a = "hello"
print(a/2)

 

결과:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[17], line 2
      1 a = "hello"
----> 2 print(a/2)

TypeError: unsupported operand type(s) for /: 'str' and 'int'

 

발생하는 에러의 원인으로는 서로다른 타입을 /(나누기)로 했을때 연산할 수 없다는 에러로 문자열은 나눌 수 없습니다.


문자열의 빼기 연산또한 허용하지 않습니다. 아래의 코드는 에러가 발생합니다.

 

코드:

a = "hello"
b = "python"
print(a-b)

 

결과:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[18], line 3
      1 a = "hello"
      2 b = "python"
----> 3 print(a-b)

TypeError: unsupported operand type(s) for -: 'str' and 'str'

 

문자열과 문자열은 뺄수가 없다는 에러메시지가 출력되었습니다. 문자열의 뺴기 연산은 동작하지 않습니다.


len() 함수를 이용하여 문자열의 길이를 구할 수 있습니다.

 

코드:

a = "hello"
print(len(a))

 

결과:

5

 

len()함수안에 길이를 구하고싶은 문자열 또는 변수를 넣으면 길이를 반환합니다. 

hello 문자열의 길이인 5를 반환하였습니다.


공백도 문자열 입니다. 

 

코드:

a = "hello python"
print(len(a))

 

결과:

12

 

hello python 에서 띄어쓰기 된 공백도 포함한 12를 반환하였습니다. 공백도 문자열로 포함하여 계산됩니다. 

공백은 없는게 아닌 공백의 값이 포함되어 있는 문자열 입니다.


문자열의 형변환

 

int() 함수를 이용하여 문자열을 정수형으로 변환이 가능합니다.

 

코드:

a = '1'
b = int(a)
print(b,type(b))

 

결과:

1 <class 'int'>

 

문자열 '1'은 int() 함수를 이용하여 숫자형 1로 형변환이 이루어졌습니다. type()함수로 변수의 타입을 출력하면 int형으로 형변환 되었습니다. 


float() 함수를 이용하여 문자열을 소수점형으로 변환이 가능합니다.

 

코드:

a = '3.14'
b = float(a)
print(b,type(b))

 

결과:

3.14 <class 'float'>

 

소수점 문자열이 float() 함수를 이용하여 소수점형인 float으로 형 변환이 되었습니다.


문자열을 정수 또는 소수점형으로 변환할때 주의사항으로는 문자열에 숫자가 아닌 문자가 포함되면 형 변환시 에러가 발생합니다. 정수 또는 소수점만으로 이루어진 문자열만으로 형변환을 해야합니다.

아래의 코드는 에러가 발생합니다.

 

코드:

a = 'hello'
b = int(a)
print(b,type(b))

 

결과:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[7], line 2
      1 a = 'hello'
----> 2 b = int(a)
      3 print(b,type(b))

ValueError: invalid literal for int() with base 10: 'hello'

 

hello를 숫자로 변환시에 불가능하여 에러가 발생하였습니다. 문자가 하나라도 포함이 되었다면 숫자 또는 소수점형으로 형변환이 불가능합니다.


int 정수형 을  str() 함수를 이용하여 문자열로 형변환을 하는 방법에 대해서 알아봅니다.

 

코드:

a = 10
b = str(a)
print(b,type(b))

 

결과:

10 <class 'str'>

 

str()함수를 이용하여 숫자 10을 문자열 10으로 형변환 하였습니다. 어떠한 숫자도 문자열로 형변환이 되기때문에 숫자를 문자로 형변환 할때는 특별하게 주의할 사항이 없습니다.


소수점형 float을 str()함수를 이용하여 문자열로 형변환을 하는 방법에 대해서 알아봅니다.

 

코드:

a = 3.14
b = str(a)
print(b,type(b))

 

 

결과:

3.14 <class 'str'>

 

str()함수를 이용하여 소수점 3.14를 문자열로 형변환 하였습니다.


다른타입끼리 연산을 할경우 원하는 타입으로 변환 후 연산을 합니다.

 

코드:

a = 10
b = '10'
c = a + int(b)
print(c,type(c))

 

결과:

20 <class 'int'>

 

숫자 10을 저장한 a 변수와 문자열 '10'을 저장한 b 변수가 있습니다.  b를 정수형으로 변환 후 덧샘연산을 하여 결과 값인 20이 출력되었습니다. 결과 값 역시 int 형입니다. 숫자형 int + 문자열형 str 은 연산이 되지 않기때문에 하나의 형은 동일한 형으로 타입을 변환하였습니다.


숫자를 문자열로 변환하여 연산도 가능합니다.

 

코드:

a = 10
b = '10'
c = str(a) + b
print(c,type(c))

 

결과:

1010 <class 'str'>

 

숫자 10을 문자열로 형변환 후 문자열 '10' 과 문자열 '10'을 더한 '1010'이 출력되었습니다. 형 또한 str로 문자열 형입니다.

다른 타입끼리 연산을 할때는 원하는 형으로 변환 후 연산합니다.


문자열의 인덱싱

 

문자열의 인덱싱은 문자열 내 각 문자에 번호(인덱스)를 매겨서 특정 위치의 문자를 쉽게 찾는 방법입니다. 파이썬의 인덱스는  0부터 시작하며, 이를 이용해 원하는 위치의 문자를 빠르게 추출할 수 있습니다.

 

코드:

a = "hello python"
print(a[0])
print(a[6])

 

결과:

h
p

 

"hello python" 문자열의 인덱싱 방법은 문자열 또는 문자열변수에 []대괄호 를 붙이고 인덱싱 하고자 하는 위치의 번호를 붙여 줍니다. 번호는 왼쪽에서 오른쪽 방향 -> 으로 0부터 값이 커지며 늘어납니다.

 

a[0]은 0번째 문자를 인덱싱하여 h를 출력하였고, a[6]은 6번째 문자를 인덱싱한 p가 출력되었습니다.

 

아래 그림을 보면 0 부터 시작하여 -> 으로 갈수록 값이 1씩 커지며 인덱싱이 가능합니다.

 

 


공백부분을 인덱싱해보도록 합니다.

코드:

a = "hello python"
print(a[5])

 

결과:

아무값도 나오지 않는것 처럼 보입니다.

 

공백을 인덱싱하였을경우 공백의 값이 인덱싱되어 출력되기때문에 아무값도 보이지 않습니다. 공백이 출력된 것입니다.


 

값의 범위를 벗어난 값을 인덱싱할경우 에러가 발생합니다.

 

코드:

a = "hello python"
print(a[12])

 

결과:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Cell In[4], line 2
      1 a = "hello python"
----> 2 print(a[12])

IndexError: string index out of range

 

값의 범위를 벗어났다는 에러가 발생합니다. 파이썬은 에러가 발생할경우 그자리에서 파이썬 코드가 종료됩니다.


왼쪽에서 오른쪽으로 -> 인덱싱을 하였습니다. 오른쪽에서 왼쪽으로 <- 인덱싱하는 방법에 대해서 알아봅니다.

 

코드:

a = "hello python"
print(a[-1])
print(a[-6])

 

결과:

n
p

 

결과 a[-1]은 n이, a[-6]은 p가 출력되었습니다. 오른쪽에서 왼쪽으로 <- 인덱싱을 할경우 음수 값을 넣어주면 됩니다. 음수값으로 인덱싱할경우 -1 부터 시작합니다.

 

아래 표에서 확인 하듯이 -1은 n을, -6은 p를 인덱싱하였습니다. 음수의 인덱싱 역시 -12보다 작은값 -13부터는 인덱스 값이 존재하지 않기때문에 a[-13]은 에러가 발생합니다. 

 

 

-인덱싱의 경우 마지막에 들어온 값을 찾거나 문자열의 길이가 길어질때 마지막 요소부터 빠르게 접근할 수 있어 자주 사용합니다.


문자열의 슬라이싱

 

문자열에서 원하는 부분 만큼 가져올 수 있는 슬라이싱이 있습니다. 슬라이싱은 자르다의 의미로 문자열에서 원하는 문자열 만큼 자를 수 있습니다.

 

코드:

a = "hello python"
print(a[0:7])

 

결과:

hello p

 

슬라이싱은 문자열 또는 문자열 변수에 [시작:끝-1] 까지 여러 문자열을 잘라 낼 수 있습니다. 중요한점은 시작은 시작인덱스 번지부터 시작하지만 끝은 끝-1 까지 입니다.

 

아래 그림에서 확인해보면 [0:7]의 의미는 0부터 시작하여 7-1 까지의 값을 슬라이싱 한다는 의미입니다.


슬라이싱의 경우 앞의 시작 값의 생략이 가능합니다.

 

코드:

a = "hello python"
print(a[:7])

 

결과:

hello p

 

앞의 값을 생략할경우 처음 위치에서부터 시작합니다. [:7] 은 [0:7]과 동일합니다.


"hello python"에서 python 부분만 슬라이싱 해봅니다.

 

코드:

a = "hello python"
print(a[6:12])

 

결과:

python

 

6부터 시작하여 12-1 까지 슬라이싱 하여 python 부분만 잘라내업니다.

 

 


슬라이싱의 경우 끝의 값도 생략이 가능합니다.

 

코드:

a = "hello python"
print(a[6:])

 

결과:

python

 

끝 값을 생략시 마지막 값까지 자동으로 입력됩니다.


음수 인덱스 번호를 입력하여 슬라이싱도 가능합니다.

 

코드:

a = "hello python"
print(a[-6:])

 

결과:

python

 

시작위치를 -6부터 끝까지 슬라이싱 하였습니다. -로 값을 넣었다고 해서 <- 방향으로 슬라이싱 되지 않습니다. 위치만 음수로 지정한 것으로 슬라이싱은 -> 방향으로 진행됩니다.


 

문자열의 모든 부분을 슬라이싱 할 수있습니다.

 

코드:

a = "hello python"
print(a[:])

 

결과:

hello python

 

슬라이싱의 시작과 끝값을 모두 생략하여 모든 문자열을 슬라이싱 하였습니다


3번째 값을 추가하여 슬라이싱의 간격을 추가할 수 있습니다. [시작:끝:간격] 으로 간격을 생략할경우 1이 되어 -> 방향으로 값을 슬라이싱 합니다. 간격의 값을 수정하여 원하는 간격으로 슬라이싱 할 수 있습니다.

 

코드:

a = "123456789"
print(a[::2])

 

결과:

13579

 

[::2] 는 슬라이싱의 3번째 값을 추가하였습니다. [시작:끝:간격] 으로 시작과 끝 값을 입력하지 않아 모든 값을 선택 하였습니다. 간격은 2로 입력하여 슬라이싱의 2칸마다 슬라이싱하여 자른 값이 출력되었습니다. 간격을 3으로 할경우 3칸마다 4로 할경우 4칸마다 슬라이싱합니다. 숫자가 저장된 문자열에서 홀수만 출력하였습니다. 


짝수만 출력하기 위해서는 시작위치를 2가 저장된 1의 위치에서 부터 시작하면 됩니다.

 

코드:

a = "123456789"
print(a[1::2])

 

결과:

2468

 

시작번지를 1번지로로 지정하여 숫자 2부터 2칸씩 띄어 홀수만 출력하였습니다.


문자열을 역순으로 뒤집을 수도 있습니다.

 

코드:

a = "123456789"
print(a[::-1])

 

결과:

987654321

 

마지막 간격의 값을  -1로 하면 문자열을 역순으로 뒤집어 슬라이싱 하였습니다. -2로 할경우 역순으로 2칸씩 띄어 슬라이싱하고 -3으로 할경우 역순으로 3칸씩 띄어 슬라이싱 합니다.


문자열의 불변성

파이썬의 문자열은 불변성이라는 특징을 가지고 있습니다. 한번 생성된 문자열은 변경할 수 없습니다. 

아래의 코드를 이용하여 확인해봅니다.

 

코드:

a = "hello python"
a[0] = 'H'

 

결과:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[58], line 2
      1 a = "hello python"
----> 2 a[0] = 'H'

TypeError: 'str' object does not support item assignment

 

"hello python"을 저장하고있는 a변수의 0번째 위치인 소문자 h를 대문자로 변경하고 싶어 a[0] = 'H'를 이용하여 대문자 H로 변경하는 코드를 넣었습니다. 문자열은 변경할 수 없다는 에러가 발생합니다.

 

파이썬에서는 문자열이 한번 생성이 되고나면 변경할 수 없습니다. 그럼 "hello python"에서 소문자 h를 대문자 H로 어떻게 하면 변경이 가능할까요? 변경은 불가능하지만 H로 변한 값이 나오도록 할 수 있습니다.

 

코드:

a = "hello python"
print(a)
a = "Hello python"
print(a)

 

결과:

hello python
Hello python

 

문자열을 변경하는게 아닌 새로운 문자열을 만들고 다시 바인딩합니다.

 

대문자 H로된 Hello python을 다시 바인딩하였습니다. 컴퓨터의 새로운 메모리 공간에 Hello python 문자열이 생성되고 그 주소 값을 a가 바인딩하였습니다. 소문자 h로 시작하는 hello python은 아무도 바인딩 하지 않아 메모리상에 쓰레기로 남은 상태 입니다. 파이썬에서는 가비지 컬렉터가 동작하여 쓰레기 값은 자동으로 메모리에서 해제하여 비워둡니다. 문자열은 변경 불가능하기 때문에 새로운 문자열을 생성후 다시 바인딩합니다.

 

 

 


슬라이싱과 문자열의 연산을 활용하여 소문자 h를 대문자로 변경 할 수 있습니다.

 

코드:

a = "hello python"
a = 'H' + a[1:]
print(a)

 

결과:

hello python
Hello python

 

슬라이싱과 문자열의 연산을 통해 소문자 h를 대문자 H로 변경하였습니다. 이 역시 Hello python의 문자열이 새로운 메모리 공간에 저장되고 소문자 hello python은 바인딩이 해제되어 메모리 공간에서 삭제됩니다.

 


새로운 변수를 이용하여 문자열을 변경하여 사용해보도록 합니다.

 

코드:

a = "hello python"
b = 'H' + a[1:]
print(b)

 

결과:

Hello python

 

문자열을 만들어 b변수에 바인딩하고 그 값을 출력하였습니다. 대문자로 변경된 Hello python이 출력되었습니다.

 

이경우 a는 여전이 "hello python"을 바인딩하고 b는 새로운 문자열인 "Hello python"을 바인딩하였습니다.


 

+ Recent posts