파이썬/기본

[파이썬] 문자열

caramel-bottle 2023. 9. 1.

문자열

문자열은 작은 따옴표나 큰 따옴표로 둘러싸인 텍스트를 의미한다.

파이썬 문자열의 특징

  • 파이썬의 문자열은 유니코드(Unicode) 시퀀스로 구성되어있다.
  • 생성된 문자열 값은 메모리에 저장되고, 변수에 할당할 때는 해당 값의 참조, 즉 메모리 주소가 변수에 저장된다.
  • 메모리에 저장된 문자열 값은 불변한 특성을 가진다.
  • 동일한 문자열 리터럴은 여러 변수가 공유할 수 있다. 이를 통해 메모리 사용을 줄일 수 있다.
  • 문자열 연결이나 재할당 시 이전 문자열이 변경되는 것이 아니라 새로운 문자열 객체가 생성된다.

문자열의 사용

str1 = '오늘도 즐거운 파이썬 수업'
print(str1)
str2 = "오늘도 즐거운 파이썬 수업"
print(str2)
str3 = '''하하:
오늘도 즐거운 파이썬
수업 '''
print(str3)
str4 = """신기하네
내가 쓴 그대로
저장이 되네?
"""
print(str4)


is 연산자와 id()함수

a = 'Hello'
b = 'Hello'
print(id(a))
print(id(b))

print(a is b) # is 연산자는 주소를 비교

동일한 문자열을 여러 변수가 공유한다는 사실을 직접 확인해보았다.

id()함수는 객체의 고유한 메모리 주소를 반환한다.

따라서 같은 문자열을 참조한 변수 a와 b의 메모리주소는 같을 것이고, 확인 결과 같은 주소가 반환되었다.

 

is 연산자는 두 객체의 식별을 비교할 때 사용된다.

객체의 식별이란 메모리 내에서 객체가 저장된 위치를 의미한다.

True값이 반환되었다는 뜻은 두 객체가 같은 위치에 저장되어 있다는 뜻이다.


문자열 재할당

text = 'Hello'
print(id(text))

text = 'Python'
print(id(text))

변수에 문자열 메모리 주소값이 할당되었다. id()함수를 사용하여 그 값을 확인하고 같은 변수에 다른 문자열을 할당해보자.

마찬가지로 id()함수를 통해 메모리 주소값이 변경되었음을 확인하였다.

 

문자열은 불변한 데이터 타입이다. 같은 변수에 문자열을 재할당하게 되면 새로운 문자열 객체가 생성되고 변수는 새로운 문자열 객체를 참조하게 된다.


문자열 함수와 연산자

# len(): 문자열의 길이를 반환
text = 'Hello, Python!'
print(len(text))

# 문자열 합치기(+): 두 문자열을 합쳐 새로운 문자열을 생성
name = '김사과'
age = '20살'
msg = name + ', ' + age
print(msg)

# 문자열 반복하기(*): 문자열을 여러번 반복하여 새로운 문자열을 생성
apple = '🍍' * 10
print(apple)

# 문자열 인덱싱과 슬라이싱: 문자열 내부의 문자에 인덱스를 사용하여 접근하거나 슬라이스할 수 있음
str1 = "문자열 내부의 문자에 인덱스를 사용하여 접근하거나 슬라이스할 수 있음"
print(str1)
# 인덱싱
print(str1[0])
print(str1[1])
print(str1[12])
print(str1[-1])
print(str1[-2])

print(str1)
# 슬라이싱
print(str1[0:6]) # 0부터 6전까지 ( 5까지 )
print(str1[8:16])
print(str1[:16])
print(str1[8:])
print(str1[:len(str1)//2])
print(str1[:])

문자열 인덱싱과 슬라이싱은 유용하게 사용되기 때문에 잘 숙지하는 것이 좋다.


문자열 메서드

파이썬에서 메서드는 특정 객체에 속한 함수로, 객체의 상태를 조작하거나 해당 객체와 관련된 작업을 수행한다. 함수는 독립적으로 호출되는 일반적인 코드 블록으로, 특정 객체에 속하지 않고 실행된다.

 

메서드의 종류는 정말 많기 때문에 굳이 외울 필요는 없다. 언제 어디서 어떤 메소드가 필요할지 때에 따라 구분할 수 있는 능력을 위함이 메서드 공부의 목적이다.

upper(), lower()

text = 'Hello, Python!'
print(text.upper())
print('Hello, Python!'.upper())

print(text.lower())
print('Hello, Python!'.lower())

upper(): 문자열에 속해있는 알파벳을 대문자로 바꾼다.

lower(): 문자열에 속해있는 알파벳을 소문자로 바꾼다.


count()

text = 'Hello, Python!'
print(text.count('l'))
print(text.count('ll'))

count(sub, (start), (end)): sub에는 문자열이 입력되어야 한다. 위 코드와 같이 특정 문자열을 매개변수로 사용하고, text 문자열에 특정 문자열이 포함된 개수를 반환한다.

탐색을 시작할 위치 ( start )와 끝낼 위치 ( end )를 정할 수 있다.


find()

print(text.find('l'))
print(text.find('ll'))
print(text.find('z')) # 찾는 문자열이 없으면 '-1' 반환
print(text.rfind('l')) # 오른쪽부터 찾아간다.
print(text.find('o', 5)) # index 5번 이후부터 찾아라.

find(sub, (start), (end)): "text 문자열" 안에 "sub 문자열"에 해당하는 문자열이 존재하는 index를 반환한다.

찾으려는 "sub 문자열" 이 없다면 '-1'을 반환한다. 같은 문자열이 둘 이상 존재한다면 가장 왼쪽( 작은 ) index를 반환한다.

 

rfind(sub, (start), (end)): "text 문자열" 안에 "sub 문자열"에 해당하는 문자열이 존재하는 index를 반환한다.

찾으려는 "sub 문자열" 이 없다면 '-1'을 반환한다. 같은 문자열이 둘 이상 존재한다면 가장 오른쪽( 큰 ) index를 반환한다.

 

두 메소드 모두 탐색을 시작할 위치 ( start )와 끝낼 위치 ( end )를 정할 수 있다.


replace()

print(text.replace('Python', 'World')) # 앞에 문자열을 찾아서 뒤에 문자열로 바꿔라
print(text)

text2 = text.replace('Python', 'World')
print(text)
print(text2)


strip()

text = '     Hello, Pyhon!     '
print(text)
print(text.strip())


split()

text = '김사과 반하나 오렌지 이메론'
names = text.split(' ')
print(names, id(names))
print(type(names))


text = '김사과, 반하나, 오렌지, 이메론'
names = text.split(', ')
print(names, id(names))


join()

text = 'Hello'
print('😅'.join(text))

startswith(), endswith()
text = 'Hello Python'
starts_with_hello = text.startswith('Hello')
print(starts_with_hello)

ends_with_world = text.endswith('World')
print(ends_with_world)​

문자열에 관련된 메서드만 해도 이렇게나 많다. 하지만 이건 일부이고 문자열 메서드 혹은 그 외의 많은 메서드들을 확인하기 위해선 검색이 필수적이다. 아래 링크를 통해 확인할 수 있다.

 

* 메서드 검색

https://docs.python.org/3/library/index.html

 

The Python Standard Library

While The Python Language Reference describes the exact syntax and semantics of the Python language, this library reference manual describes the standard library that is distributed with Python. It...

docs.python.org

* 메서드의 매개변수 표기 읽는법

예시)

대괄호:

'str.find(sub[, start[, end]])'

대괄호 안에 있는 인자는 생략이 가능하다.

 

*, **:

'str.format(*args, **kwargs)'

*: 함수나 메서드 내부에서 여러개의 위치 기반 인수를 튜플로 묶어서 처리할 수 있다.

인수의 개수가 가변적인 경우 사용한다.

 

**: 함수나 메서드 내부에서 여러개의 키워드 인수를 딕셔너리로 묶어서 처리할 수 있다.

함수에 다양한 이름의 인수를 전달하는 경우 사용한다.


 

* 가비지 컬렉션

파이썬은 메모리 관리를 위해 참조 카운팅(reference counting) 메커니즘을 사용합니다. 이 메커니즘은 객체가 얼마나 많은 변수에 의해 참조되고 있는지를 추적합니다. 객체의 참조 카운트가 0이 되면 해당 객체는 더 이상 사용되지 않으며, 가비지 컬렉션(garbage collection)에 의해 메모리에서 해제됩니다.

따라서 이전 문자열 객체에 더 이상 어떠한 변수도 참조하지 않을 때, 해당 문자열 객체는 참조 카운트가 0이 되며 가비지 컬렉션의 대상이 됩니다. 가비지 컬렉션은 주기적으로 실행되며 더 이상 사용되지 않는 객체를 메모리에서 해제하여 자동으로 메모리를 관리합니다.

 

* 가비지 컬렉션의 경우 정확하게 언제 실행되는지 알 수 없기 때문에 메모리 활용 측면해서 항상 고려해야한다.

* 문자열 재할당이 잦아지면 메모리 효율이 좋지 않다. 되도록 새로운 변수와 문자열을 선언하도록 하자.

 

* in-place 연산

데이터를 수정하고 직접 저장하는 연산.

 

numbers = [3, 1, 2]
numbers.sort()
numbers = [1, 2, 2, 3, 4, 4]
numbers = list(set(numbers))

 

'파이썬 > 기본' 카테고리의 다른 글

[파이썬] 컬렉션 타입, 리스트2  (0) 2023.09.04
[파이썬] 컬렉션 타입, 리스트1  (0) 2023.09.04
[파이썬] 변수  (0) 2023.09.01
[파이썬] print()  (0) 2023.08.31
[파이썬] 구글 코랩(Google Colab)  (0) 2023.08.31

댓글