2. 기본 자료형과 연산 > 2-4. 문자 자료형

문자 자료형

해당 파트는 아래 영상 시청 후 교안을 정독해주세요.

문자 자료형 개념

문자열(string)이란 사람이 가장 많이 사용하는 형태의 자료형으로 문자, 단어 등으로 구성된 문자들의 집합을 의미합니다. 문자열은 모두 따옴표로 둘러싸여 있는데 이때 큰따옴표, 작은따옴표의 기능적 차이는 없습니다. 다만 시작과 끝은 항상 똑같은 기호로 해줘야 한다는 점만 유의하면 됩니다.

"코사다마와 공부하는 파이썬은 재밌어요."
'123'

# 문장 내에서 따옴표를 사용하는 경우
'친구가 "파이썬 공부는 재밌니?"라고 물어봤다.'
a = 'Hello World!'
type(a)

type(a)로 확인한 a의 자료형은 str으로 도출됩니다.

숫자형에서 자료형 변환을 했듯, 문자 자료형의 변환도 동일합니다. 아래 예시 코드를 따라 쳐보고 실행해보며 자료형 변환을 연습해보세요.

a = 123
type(a) 
str(a)
type(str(a))

문자형의 연산

문자형의 연산은 숫자형의 연산과 크게 다르지 않습니다. 다만, 문자형으로는 더하거나 곱하는 산술 연산을 사용합니다. (빼기와 나누기등의 산술 연산은 사용할 수 없음) 이때 주의할 점은 문자열의 더하기는 '문자열 + 문자열'로 사용하고 문자열의 곱하기는 '문자열 + 숫자열'로 사용한다는 점입니다. 아래 예시를 보면 이 뜻이 이해될거에요.

a = 'Hello'
b = 'World'
c = '!'
print(a + b + c)

이렇게 실행하면 어떤 결과가 나올까요? HelloWorld!라는 띄어쓰기를 하지 않고 출력될 것입니다. Hello와 World를 띄워서 출력하고 싶다면 a와 b사이에 ' '를 적어주어야 합니다. 처음 코드와 아래 코드의 출력값을 비교해보세요.

print(a + ' ' + b + c)

처음에 문자열의 곱하기는 '문자열 * 숫자열'로 사용해야 한다고 언급했죠? 즉, 곱한 숫자만큼 문자를 반복해서 출력하는 것을 의미합니다.

a = 'Hello'
print(a * 2)

출력결과는 HelloHello가 됩니다.

문자열의 곱하기는 자주 사용되진 않지만, 공백을 여러개 만들어주고 싶을 때는 유용하게 사용할 수 있습니다.

print(' ' * 100)

문자열 인덱싱

해당 파트는 본 영상시청 후 교안을 정독해주세요.

문자열은 0개 이상의 문자가 모인것으로, 문자열의 특정 위치의 문자를 알고 싶을 때 사용하는 것이 문자열 인덱싱(Indexing)입니다. 파이썬의 문자열은 0번 부터 시작 합니다.

a = '코사다마'
a[0] # 결과: '코'
a[1] # 결과: '사'
a[2] # 결과: '다'
a[3] # 결과: '마'

또한 인덱싱 번호는 -기호를 붙여 뒤에서부터 부여할 수도 있습니다. 0은 -를 붙여도 0이므로 가장 끝 문자는 -1이 됩니다.

a = '코사다마'
a[0] # 결과: '코'
a[-3] # 결과: '사'
a[-2] # 결과: '다'
a[-1] # 결과: '마'

문장도 단어와 마찬가지 입니다. 아래와 같은 문장이 있을 때, a[0]='코'가 됩니다. 인덱스 번호는 띄어쓰기와 기호(이 문장에서는 !)를 모두 포함합니다.

문자열-슬라이싱

그렇다면 이 문자열의 길이는 어떻게 알 수 있을까요? 물론 하나씩 세어줄 수 있지만, 긴 문장인 경우에도 모두 세기 어려울 수 있습니다. 이때는 len함수를 사용하면 됩니다.

b = '코사다마와 함께하는 즐거운 파이썬 공부!'
len(b)

len(b)의 결과는 22 입니다. 정리하면, 문자열의 시작은 0이므로 a[0]='코', a[1]='사', a[2]='다' … a[20]='부', a[21]='!'가 되고 문자열의 길이는 마지막 인덱스 번호에서 +1 한 (0부터 시작했으므로) 22이 되는 것입니다!

문자열 슬라이싱

해당 파트는 본 영상 시청 후 교안을 정독해주세요.

문자열 슬라이싱(Slicing)은 문자열 인덱스를 이용해 문자열의 일부를 가져오는 것(복사)을 의미합니다. 슬라이싱은 굉장히 사용할 일이 많은데

슬라이싱의 기본 형태는 a[start : end : step] 입니다.

  • start: 시작 위치. 시작점을 지정하지 않으면 처음부터 선택함.
  • end: 마지막 위치. 끝점을 지정하지 않으면 마지막까지 선택함. end는 포함하지 않음!
  • step: 몇개씩 끊어서 가져올지와 방향을 정하는데, 옵션이기 때문에 생략하기도 함. (리스트 슬라이싱에서 주로 사용함. 뒤에서 배웁니다!)

슬라이싱은 인덱스와 마찬가지로 0번 부터 시작하고, -부호를 붙여 끝에서 부터 선택할 수도 있습니다. 아래 여러가지 예시 코드들을 따라 쳐보며 슬라이싱을 이해해보세요.

a = '코딩을 사랑하는 다람쥐와 마요네즈'
a[1:4] #결과: a문자열의 1번부터 3번까지
a[:5] #결과: a문자열의 0번부터 4번까지
a[3:] #결과: a문자열의 3번부터 끝까지
a[:] #결과: a문자열 전체 다
a[-5:-1] #결과: a문자열의 -5번부터 -2까지
# 다음 문장에서 '생년월일'와 '태어난 곳'을 슬라이싱을 이용해서 가져오세요.
a = '고다람은 2020-01-13에 코사다마에서 태어났습니다.'
생년월일 = a[5:15] #결과: 2020-01-13
태어난곳 = a[17:21] #결과 : 코사다마

문자열 포메팅

a = '오늘은 1월 15일 입니다.'
b = '오늘은 1월 19일 입니다.'

a와 b 문장은 다른 부분은 모두 동일하고 날짜 부분인 15, 19만 차이가 있습니다.

이때 사용할 수 있는 방법이 문자열 포매팅입니다. 문자열 포매팅이란 문자열을 형식화된 문자열로 표현하는 방법으로, 즉, 문자열 중간 중간에 특정 변수의 값을 넣어주기 위해서 사용한다고 이해하면 됩니다. 문자열 포매팅 방법은 여러가지가 있는데 그 중 가장 많이 사용되는 두 가지 방법에 대해서 하나씩 알아보도록 하겠습니다.

우선 첫 번째 소개할 방법은 %와 문자열 포맷 코드를 사용하는 방법입니다. (이때의 %는 나눈 몫을 구하는 것과 다른 기호입니다.) 사용 방법은 다음 예시 문장과 같습니다.

'오늘은 1월 %d일 입니다.'%15

이 문장에서는 정수를 넣어주었으므로 %d를 사용했는데, 넣어주고자 하는 값의 자료형에 따라 포맷 코드는 다르게 사용해야 합니다. 자료형에 따른 문자열 포맷 코드는 아래 표를 참고하세요. 1개 이상의 변수를 넣어 주고 싶을 때는 %뒤에 넣어 줄 값들을 괄호로 묶어주면 됩니다.

'%s의 키는 %dcm 이고 혈액형은 %s형 입니다.'%('고다람', 170, 'B')
문자열 포맷 코드설명
%s문자열
%c문자 1개
%d정수
%f실수
%o8진수
%x16진수
%%문자% (기호%를 사용하고 싶을 때)

%s 는 문자열이 아닌 숫자열도 포매팅이 됩니다. 하지만 가능하면 읽기 편하게 각 자료형에 맞는 포맷 코드를 사용하는 것이 좋습니다!

추가로, 실수에서 소수점을 표기하는 방법에 대해 알아보겠습니다. 표기 방법은 '%총자리수.자릿수f' % 숫자이고 반올림한 값을 출력합니다. 이때, 총 자리수에 아무것도 표기하지 않으면 정수 부분은 모두 출력하고,총자리수에는 소수점(.)도 포함된다는 것을 주의하세요!

'%.2f'%2.3 # 결과: '2.30'
'%0.2f'%2.3 # 결과: 2.30
'%.2f'%2.34567 # 결과: '2.35 (반올림)
'%6.1f'%232.34567 # 결과: ' 232.3' (정수 앞에 한 자리 남음)

✔️(꼭 알아야 하진 않지만 알면 좋은~) 문자열 정렬, 공백 포매팅
문자열을 깔끔하게, 정해진 양식에 맞춰서 출력하고 싶을 때 사용하는 방법입니다. 예를 들어, 길이가 다른 두 문자열을 동일한 위치에서 끝나도록 만들고 싶을 때 사용할 수 있습니다. 아래 예시 코드를 직접 쳐서 출력 결과를 보고 차이를 확인해보세요.

print('%s'%'car')
print('%s'%'apple')
print('%10s'%'car')
print('%10s'%'apple')
print('%-10s'%'car')
print('%-10s'%'apple')

%10s의 의미는 '10칸을 확보하고 오른쪽에서 부터 문자를 넣어준다'는 것입니다. 숫자 앞에 +를 붙이면 오른쪽 부터 넣어주고 -를 붙이면 왼쪽부터 넣어줍니다.

한 가지 아쉬운 점은, 한국어는 문자열 정렬 포매팅이 깔끔하게 맞지 않는다는 점입니다. 한글은 폭이 영문 문자의 2배라는 점을 기본 문자열 포매팅이 고려하지 않고, 한글자는 무조건 한칸으로 생각하기 때문에 발생하는 문제라고 합니다. 참고자료

두 번째 방법은 format 함수를 사용하는 것입니다. format 함수를 사용할 때에는 문자열 포맷코드를 사용하지 않고 0 부터 순서대로 숫자를 중괄호{} 기호안에 넣어서 표시합니다. 다음 예시를 보며 format 함수를 이해해보세요.

'오늘은 {0}월 {1}일 입니다.'.format(1, 15)
'{0}의 키는 {1}cm 이고 혈액형은 {2}형 입니다.'.format('고다람', 170, 'B')

혹은 중괄호 안에 변수명을 직접 지정하여 사용할 수도 있습니다.

'오늘은 {month}월 {date}일 입니다.'.format(month=1, date=15)

문자열 포매팅은 앞으로 사용할 일이 아주 많습니다. 꼭! 잘 기억해두었다가 유용하게 사용하길 바랍니다.

문자열 관련 함수

앞서 인덱싱에서 소개했던 len 함수 기억나시나요? 문자열은 아주 많이 사용되는 자료형이기 때문에 관련 함수도 굉장히 많습니다. 이번 스터디에서는 그 중에서도 많이 사용되는 문자열 함수만 골라서 공부해보겠습니다. 양을 추렸음에도 적은양은 아니지만, 함수를 많이 알면 알수록 더 빠르고 효율적인 코드를 작성할 수 있다는 점! 기억하면서 암기해주세요.😊

# 예시 문장
a = ' Studying Python is fun! '
문자열 함수설명예시
count특정 문자가 몇 개 들어 있는지a.count('s') → 2
find특정 문자가 있는 인덱스 확인하기a.find('S') → 1
index특정 문자가 있는 인덱스 확인하기a.index('S') → 1
len문자열 개수len(a) → 25
upper전체를 대문자로 바꾸기 (영어)a.upper() → ' STUDYING PYTHON IS FUN! '
lower전체를 소문자로 바꾸기 (영어)a.lower() → ' stydying python is fun! '
lstrip왼쪽 공백 제거a.lstrip() → 'Studying Python is fun! '
rstrip오른쪽 공백 제거a.rstrip() → ' Studying Python is fun!'
strip양쪽 공백 제거a.strip() → 'Studying Python is fun!'
replace특정 문자를 다른 문자로 바꾸기a.replace('Python', 'Grammer') → 'Studying Grammer is fun!'
split특정 문자(공백 등 사용자 지정)을 기준으로 나눠라a.split(' ') → ['', 'Studying', 'Python', 'is', 'fun!', '']
join문자열 사이에 특정 문자를 삽입하여 합치기",".join(a) → ' ,S,t,u,d,y,i,n,g, ,P,y,t,h,o,n, ,i,s, ,f,u,n,!, '

우선, count 함수는 특정 문자가 해당 문자열에 몇 개 있는지 확인할 때 사용하는 함수입니다. 예시 코드에서 's'의 개수를 찾을 때, 출력값은 1이 나오는 것으로 보아, count는 대문자 'S'와 소문자 's'를 다른 문자로 파악한다는 것을 알 수 있습니다.

find함수와 index함수는 모두 해당 문자열에서 특정 문자가 있는 인덱스 번호를 확인할 때 사용하는 함수입니다. 두 함수의 차이는 문자열에 없는 새로운 문자를 찾고자 했을 때, find는 -1을 출력하는 반면, index는 에러가 발생한다는 것 입니다.

앞서 모든 함수는 대문자와 소문자를 다른 문자로 구분하고 있습니다. 대문자, 소문자 구분 없이 특정 문자를 선택하고 싶다면 upper혹은 lower 함수를 사용하여 모두 대문자, 모두 소문자로 맞춰준 뒤 사용하면 됩니다.

split함수는 해당 문자열을 사용자가 원하는 문자 혹은 공백 등을 기준으로 나눠주는 역할을 합니다. 예시 코드에서는 공백 (따옴표 사이 띄어쓰기)을 기준으로 나눠주었습니다. split함수는 결과를 대괄호([ ]) 안에 콤마로 구분하는 형태로 도출하는데, 이러한 형식을 '리스트'(List)라고 합니다. 리스트와 관련해서는 이후에 더 자세히 배워보도록 하겠습니다.

join함수는 사실 문자열에서는 사용할 일은 많지 많고 조금 전 언급한 '리스트' 자료형에서 많이 사용됩니다. 즉, split와 정반대의 역할을 한다고 생각하면 되는데요, 예를 들어

a = ' Studying Python is fun! '
b = a.split(' ')

위와 같은 코드를 실행하면 ``와 같은 결과가 도출되는데, 쪼개진 문자들을 다시 합치고 싶을 때 ''.join(b)처럼 사용하면 됩니다. 이때 join앞의 따옴표 안에 원하는 구분자(문자, 기호, 띄어쓰기 등)를 넣어주면 됩니다.

''.join(b) # 결과: 'StudyingPythonisfun!'
' '.join(b) # 결과: ' Studying Python is fun! '

✔️ 이스케이프 코드

이스케이프 코드는 출력물을 보기 좋게 정렬하기 위한 용도로 사용됩니다. 이스케이프 코드에는 여러가지 종류가 있지만, 가장 많이 사용되는 아래 예시만 알아두세요! (원화 표시와 백슬래시는 같은 역할을 합니다!)

  • \n : 문자열 줄바꿈
  • \t : 문자열 탭 간격
  • \ : 백슬래시 (혹은 원화표시) 그대로 출력
print('Hello\nWorld!')
> 출력결과
> Hello
> World
print('Hello\tWorld!')
> 출력결과
> Hello   World!
print('Hello\\World!')
> 출력결과
> Hello\World!
마지막으로 업데이트 된 날짜:
2022년 9월 24일