본문 바로가기

코딩/파이썬

문자열 다루기

1. 문자열이란?

파이썬에서 텍스트 데이터를 다루는 데 사용되는 중요한 데이터 타입,

작은 따옴표(')나 큰따옴표("), 세 개의 따옴표(''',''')로 둘러쌓인 텍스트로 표현된다.

str1 = '오늘도 즐거운 파이썬 수업'
print(str1)
str2 = "오늘도 즐거운 파이썬 수업"
print(str2)
str3 = '''김사과:
오늘 날씨 정말 좋군요
그렇죠?'''
print(str3)

 

파이썬의 문자열은 유니코드 문자의 시퀀스로 구성되며, 문자열 값은 메모리에 저장되고 해당 값은 불변(immutable)한 특성을 가진다. 파이썬은 문자열 리터럴의 공유 문자열 최적화와 같은 기술을 사용하여 문자열을 메모리 효율적으로 다루도록 설계되었다.

 

- 문자열 리터럴과 메모리 할당 : 문자열 리터럴은 메모리에 저장이 되고, 변수에 할당할 때는 해당 값의 참조가 변수에 저장된다.

- 공유 문자열(String Interning) : 작은 크기의 문자열 리터럴은 '공유 문자열'이라는 메모리 최적화 기술을 사용하는데, 동일한 문자열 값이 여러 변수에 할당되면, 파이썬은 메모리에 단일로 문자열을 저장하고 여러 변수가 해당 값을 참조하게 한다. 이로써 메모리 사용을 줄일 수 있다.

 

a = "Hello"
b = "Hello"

print(a is b) # 출력: True (동일한 문자열 객체를 참조)

 

is 연산자는 파이썬에서 두 객체의 식별(Identity)을 비교할 때 사용되는 연산자이다. 객체의 식별은 메모리 내에서 객체가 저장된 위치를 의미한. is 연산자는 두 객체가 동일한 메모리 위치에 저장되어 있는지를 판단한다.

 

- 문자열 연결과 재할당 : 문자열은 불변한 데이터 타입이므로 문자열 연결(+ 연산자)이나 문자열 재할당 시 새로운 문자열 객체가 생성된다. 이전 문자열은 변경되지 않는다.

a = "Hello"
b = a + ", python!" # 새로운 문자열 객체 생성

 

※ 문자열 재할당

파이썬에서 문자열은 불변(immutable)한 데이터 타입이므로 같은 변수에 문자열을 재할당하는 경우, 새로운 문자열 객체가 생성되고 변수는 새로운 문자열 객체를 참조하게 된다. 이전 문자열 객체는 변경되지 않는다.

 

변수 자체의 '메모리 주소'는 파이썬에서 직접 액세스할 방법이 없다. 이는 파이썬의 추상화 수준 때문이다.

파이썬은 메모리 관리를 추상화하여 개발자로 하여금 메모리 관리에 대한 걱정 없이 프로그래밍에 집중하게 해준다. 만약 C언어와 같은 저수준 언어를 사용하면 변수의 메모리 주소에 직접 액세스 할 수 있다. 파이썬에서는 이러한 저수준의 작업을 하기 위해 ctypes 모듈을 사용할 수 있다. 그러나 이는 일반적으로 권장되지 않으며, 대부분의 경우에는 필요하지 않다.

 

text = "Hello"
print(id(text)) # 이전 문자열 객체의 메모리 주소 출력

text = "Python" # 변수에 새로운 문자열 할당
print(id(text)) # 새로운 문자열 객체의 메모리 주소 출력

 

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

  가비지 컬렉션

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

 

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

 

2. 문자열 함수와 연산자

 

1. 문자열 길이 확인하기 (len()) : 문자열의 길이를 반환한다.

text = "Hello, Python!"
print(len(text))

 

2. 문자열 합치기 (+): 두 문자열을 합쳐 새로운 문자열을 생성한다.

name = "김사과"
age = "20살"
message = name + ", " + age
print(message)

 

3. 문자열 반복하기 (*) : 문자열을 여러 번 반복하여 새로운 문자열을 생성한다.

apple = "🍎" * 10
print(apple)

 

4. 문자열 인덱싱과 슬라이싱: 문자열 내부의 문자에 인덱스를 사용하여 접근하거나 슬라이스 할 수 있다.

str = '문자열 내부의 문자에 인덱스를 사용하여 접근하거나 슬라이스할 수 있습니다.'
print(str)
# 인덱싱
print(str[0])
print(str[1])
print(str[12])
print(str[-1])
print(str[-2])
str = '문자열 내부의 문자에 인덱스를 사용하여 접근하거나 슬라이스할 수 있습니다.'
print(str)
# 슬라이싱
print(str[0:6])
print(str[8:16])
print(str[:16])
print(str[8:])

 

3. 문자열 메서드

 

문자열 객체에 적용되는 함수로, 문자열을 조작하거나 변환하는 작업을 수행한다.

 

1. upper()와 lower() - 대소문자 변환

text = "Hello, Python!"
print(text.upper())
print(text.lower())

 

2. count() - 특정 문자열의 등장 횟수 확인

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

 

3. find() - 특정 부분 문자열의 첫 번째 등장 위치(인덱스) 확인

text = "Hello, Python!"
print(text.find('l'))
print(text.find('ll'))
print(text.find('z'))
print(text.rfind('l'))
print(text.find('o',5))

 

4. replace() - 문자열 대체

text = "Hello, Python!"
new_text = text.replace("Python", "World")

print(new_text)

 

5. strip() - 문자열 양쪽 공백 제거

text = "	Hello, Python!	"
print(text)
print(text.strip())

 

6. split() - 문자열 분리

text = '김사과 반하나 오렌지 이메론'
names = text.split() # 공백을 기준으로 분리
print(names)

text = '김사과,반하나,오렌지,이메론'
names = text.split(',') # ','을 기분으로 분리
print(names)

 

7. join() - 문자열 결합

text = 'Hello'
print('🙋‍♂️'.join(text))

 

8. startswith()와 endswith() - 접두사와 접미사 확인

text = "Hello, Python!"
starts_with_hello = text.startswith("Hello")
ends_with_world = text.endswith("World!")

print(starts_with_hello)
print(ends_with_world)

 

※ 문자열 함수 vs 문자열 메서드

 

1.문자열 함수

문자열 함수는 파이썬 내장 함수로, 문자열을 다루거나 처리하는 데 사용된다.

이러한 함수들은 문자열을 입력으로 받아 처리한 후 결과를 반환한다.

2. 문자열 메서드

문자열 메서드는 문자열 자체에 대해 호출되는 함수로, 문자열 내부에서 작동하는 동작을 수행한다.

문자열 객체에 점(.)을 찍고 메서드 이름을 호출하는 방식으로 사용된다.

'코딩 > 파이썬' 카테고리의 다른 글

파이썬 컬렉션 타입, 튜플  (0) 2024.03.13
파이썬 컬렉션 타입, 리스트  (0) 2024.03.13
파이썬의 출력  (0) 2024.03.12
파이썬 과제 (1). 컴퓨터 연산 문제  (0) 2024.03.12
마크다운(Markdown)  (0) 2024.03.11