Chapter02 자료형 (2-1 자료형과 문자열)

lasso·2021년 5월 4일
0

Chapter02 자료형

💡 학습 목표

  • 자료와 자료형의 의미에 대해 알아봅니다.
  • 문자열을 생성하는 방법과 숫자에 적용할 수 있는 연산자를 알아봅니다.
  • 숫자를 생성하는 방법과 숫자에 적용할 수 있는 연산자를 알아봅니다.
  • 변수를 선언하고 변수에 값을 할당하는 방법을 배웁니다.

2-1 자료형과 문자열

#자료형 #문자열 #이스케이프문자 #문자열연산자 #type() #len()

프로그래밍에서는 프로그램이 처리할 수 있는 모든 것을 '자료(data)'라고 부릅니다. 이번 절에서는 자료란 무엇인지와 자료를 처리하는 방법에 대한 개괄적인 이야기, 그리고 가장 일반적으로 쓰이는 문자열 자료형에 대해 알아보겠습니다.

시작하기 전에

프로그램은 기본적으로 '자료를 처리'하는 역할을 합니다. 프로그래밍에서는 프로그램이 처리할 수 있는 모든 것을 자료라고 부릅니다. 아래 예시를 통해 '자료'와 '자료를 처리하는 것'에 대한 의미를 파악해보겠습니다.

  • 카메라로 사진을 찍으면 사진이 자료이고, 이를 카메라에 저장하는 것이 처리입니다.
  • 카톡으로 친구에게 사진과 함께 "여기 어때?"라는 메시지를 보냈다면 사진과 메시지가 자료이고, 이를 친구에게 전송하는 것이 처리입니다.
  • 게임에서 경험치를 얻었다면 경험치가 자료이고, 경험치를 증가시키는 것이 처리입니다.

이처럼 우리가 일상에서 만나는 모든 것들은 자료가 될 수 있고, 프로그램은 이러한 자료를 처리하기 위한 모든 행위라고 생각할 수 있습니다.


자료형과 기본 자료형

파이썬 프로그램도 수많은 자료를 다룹니다. 개발자들이 쉽게 사용할 수 있도록 기능과 역할에 따라서 자료를 구분했습니다. 이렇게 구분된 종류를 자료형이라고 부릅니다. 가장 기본적인 자료형으로는 문자열, 숫자, 이 있습니다.

  • 문자열 (string) : 메일 제목, 메시지 내용 등 → 예) "안녕하세요", "Hello World"
  • 숫자 (number) : 물건의 가격, 학생의 성적 등 → 예) 52, 273, 103.32
  • 불 (boolean) : 친구의 로그인 상태 등 → 예) True, False

이러한 기본 자료형을 조합해서 새로운 자료형을 만들 수도 있습니다. 예를 들어 숫자를 세 개 조합하면 '2021.4.30'처럼 날짜를 표현하는 자료형이 만들어집니다.

☑️ 자료를 알아야 하는 이유

사람의 몸을 구성하는 기본 단위는 세포입니다. 세포가 모여 조직이 되고 조직이 모여 기관이 됩니다. 기관이 모여 기관계를 이루고 이러한 기관계가 보여 한 명의 사람이 만들어집니다. 세포가 모이고 모여 사람(객체)가 되는 것처럼 자료를 자료형에 맞게 모으고, 처리 과정을 거쳐 더 큰 자료형을 만들어 나가다 보면 거대한 프로그램이 만들어집니다. 그렇기 때문에 가장 기본적인 단위라고 할 수 있는 자료의 의미를 아는 것은 물론, 그 쓰임새를 확실하게 아는 것은 매우 중요합니다.

☑️ 자료형 확인하기

자료형(data type)이란 자료의 형식을 말합니다. 파이썬에서 자료의 형식을 확인할 떄는 type() 함수를 사용합니다. print() 함수와 마찬가지로 식별자 뒤에 괄호가 있으므로, 함수입니다. 함수의 괄호 내부에 자료를 넣으면 그 자료가 어떤 자료형을 가지고 있는지 확인할 수 있습니다.

아래 예제 살펴보기

>>> print(type("안녕하세요"))
<class 'str'>
>>> print(type(273))
<class 'int'>

"안녕하세요"라는 문자열을 괄호 안에 넣으니 <class 'str'>이, 숫자를 괄호 안에 넣으니 <class 'int'>가 출력됩니다. str이란 string을 짧게 표현한 것으로 문자열을 의미합니다. int는 integer를 짧게 표현한 것으로 정수를 나타냅니다.


문자열 만들기

프로그래밍 언어에서는 "Hello Python Programming...!" 처럼 나열된 것을 '문자열'이라고 부릅니다. 문자열은 영어로 string(스트링)이라고 부릅니다. 지금까지 따옴표로 둘러싸 입력한 모든 것을 문자열이라고 생각하면 됩니다.

"Hello", 'String', '안녕하세요', "Hello Python Programming"

☑️ 큰따옴표로 문자열 만들기

문자열은 문자들을 큰따옴표(")로 감싸서 만듭니다. 이전에 사용해 보았으므로, print() 함수를 이용해 간단하게 문자열을 만들고 출력하는 코드를 작성해보겠습니다.

>>> print("안녕하세요")
안녕하세요

☑️ 작은따옴표로 문자열 만들기

작은따옴표(')로도 문자열을 만들 수 있습니다. 앞서 예제에서 큰따옴표를 작은따옴표로 바꿔 입력해보겠습니다.

>>> print('안녕하세요')
안녕하세요

실행 결과를 보면 큰따옴표를 붙이나 작은 따옴표를 붙이나 마찬가지의 결과를 출력합니다.

☑️ 문자열 내부에 따옴표 넣기

왜 큰따옴표, 작은따옴표 두 가지 방법이나 지원할까요? 그리고 어떤 것을 사용해야 하는 걸까요? 아래 예제와 같이 큰따옴표를 포함한 문자열을 만든다고 가정해 보겠습니다.

"안녕하세요"라고 말했습니다.

앞서 배운 방법대로 큰따옴표를 사용해 문자열을 만든다면 다음과 같이 만들것입니다.

>>> print(""안녕하세요"라고 말했습니다")
SyntaxError : invalid syntax

이런 오류를 발생시킵니다.

파이썬 프로그래밍 언어는 ""안녕하세요"라고말했습니다"라는 문자열을 ① 아무 글자도 없는 문자열("")과 ② "라고 말했습니다"라는 문자열로 의미합니다. 파이썬 프로그래밍 언어는 자료(문자열)과 자료(문자열)를 단순하게 나열할 수 없습니다. 그래서 구문 오류가 발생하는 것입니다.

따옴표를 내부에 넣고 싶다면 큰따옴표와 작은따옴표를 같이 사용하면 됩니다.

>>> print('"안녕하세요"라고 말했습니다')
"안녕하세요"라고 말했습니다
>>> print("'배가 고픕니다'라고 생각했습니다")
'배가 고픕니다'라고 생각했습니다

☑️ 이스케이프 문자를 사용해 문자열 만들기

지금까지 다양한 방법으로 문자열을 만들어 보았는데, 문자열을 너무 여러 방식으로 만들어 복잡하다면 어떤 방법으로 문자열을 만들더라도 원하는 때에 큰따옴표와 작은따옴표를 쉽게 넣을 수 있는 이스케이프 문자(escape character) 가 있습니다. 역슬래시(\)기호와 함께 조합해서 사용하는 특수한 문자를 의미합니다. 참고로 \기호입니다.

다음과 같이 \와 함께 큰따옴표, 작은따옴표를 사용하면 이를 '문자열을 만드는 기호'가 아니라 '단순한 따옴표'로 인식합니다.

  • \" : 큰따옴표를 의미합니다.
  • \' : 작은따옴표를 의미합니다.

그렇기 때문에 이스케이프 문자를 사용하면 다음과 같이 큰따옴표 내부에 큰따옴표, 작은따옴표 내부에 작은따옴표를 넣을 수 있습니다.

>>> print("\"안녕하세요\"라고 말했습니다")
"안녕하세요"라고 말했습니다
>>> print('\'배가 고픕니다\'라고 생각했습니다')
'배가 고픕니다'라고 생각했습니다

이외에도 다양한 이스케이프 문자가 있습니다.

  • \n : 줄바꿈
  • \t : 텝
>>> print("안녕하세요\n안녕하세요")
안녕하세요
안녕하세요
>>> print("안녕하세요\t안녕하세요")
안녕하세요      안녕하세요

이를 활용해 다음과 같이 코드를 작성해 봅시다. 탭 이스케이스 문자(\t )는 글자들을 표 형식으로 출력할 때 많이 사용합니다.

👉 이스케이프 문자(\t )로 탭 사용하기

소스코드 string_operator.py

print("이름\t나이\t지역")
print("라쏘\t33\t강서구")
print("릿지\t30\t강서구")
print("엘라스틱넷\t31\t강서구")
이름	나이	지역
라쏘	33	강서구
릿지	30	강서구
엘라스틱넷	31	강서구

다음과 같은 이스케이프 문자도 있습니다.

  • \\ : 역슬래시(\)를 의미합니다.

코드를 실행하면 다음과 같이 출력합니다.

>>> print("\\ \\ \\ \\")
\ \ \ \

☑️ 여러 줄 문자열 만들기

이스케이프 문자 중에 \n을 사용하면 줄바꿈을 할 수 있습니다.

>>> print("동해물과 백두산이 마르고 닳도록﹨n하느님이 보우하사 우리나라 만세﹨n무궁화 삼천리 화려강산﹨n대한사람 대한으로 길이 보전하세")
동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려강산
대한사람 대한으로 길이 보전하세

위와 같이 한 줄에 긴 코드를 입력하면 읽기 힘들다. 파이썬은 여러 줄 문자열이라는 기능을 지원한다. 여러 줄 문자열은 큰따옴표 또는 작은 따옴표를 세 번 반복한 기호를 사용합니다. 아래 예시로 확인할 수 있습니다.

>>> print("""동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려강산
대한사람 대한으로 길이 보전하세""")
동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려강산
대한사람 대한으로 길이 보전하세

큰따옴표 또는 작은따옴표를 세 번 반복해 입력한 후 문자열을 입력하면 엔터를 누르는 곳마다 줄바꿈이 일어납니다.

☑️ 줄바꿈 없이 문자열 만들기

여러 문자열을 입력한 후 코드를 조금 더 쉽게 보려고 다음과 같이 작성하는 경우도 있습니다. 하지만 이렇게 코드를 작성하면 첫 번쨰 줄과 마지막 줄에 의도하지 않은 줄바꿈이 들어가게 됩니다.

>>> print("""
동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려강산
대한사람 대한으로 길이 보전하세
""")
  
동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려강산
대한사람 대한으로 길이 보전하세
 

만약 줄바꿈을 하지 않고 코드를 입력하고 싶다면 다음과 같이 \기호를 사용합니다. 파이썬에서는 '코드를 쉽게 보려고 줄바꿈한 것이지, 실질적인 줄바꿈이 아니다'라는 것을 나타낼 때. 줄 뒤에 \기호를 사용합니다.

>>> print("""\
동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려강산
대한사람 대한으로 길이 보전하세\
""")
동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려강산
대한사람 대한으로 길이 보전하세

문자열 연산자

수학시간에 배웠던 것처럼 숫자에는 더하기, 빼기, 곱하기, 나누기 연산자를 적용할 수 있습니다. 또한 집합에는 합집합, 교집합, 차집합 등의 연산자를 적용할 수 있습니다.

이런 연산자는 특정한 자료의 형태에 종속됩니다. '숫자'라는 자료에는 더하기, 빼기, 곱하기, 나누기라는 연산자를 적용할 수 있지만, 합집합, 교집합, 차집합이라는 연산자는 적용할 수 없습니다. 즉 각각의 자료는 사용할 수 있는 연산자가 정해져 있습니다.

프로그래밍 언어의 자료도 마찬가지입니다. 숫자에는 숫자만 적용할 수 있는 연산자가 있고, 문자열에는 문자열에만 적용할 수 있는 연산자가 있습니다.

☑️ 문자열 연결 연산자 : +

문자열에는 + 기호로 문자열 연결 연산을 적용할 수 있습니다.

"문자열" + "문자열"

+기호를 사용하므로 우리가 알고 있는 '더하기'라고 생각할 수 있는데, 파이썬의 경우에는 '숫자 더하기 연산자'와 '문자열 연결 연산자'를 같은 기호로 사용하지만 내부적으로 완전히 다른 수행을 하는 연산자입니다.

그럼 문자열 연결 연산자를 사용해봅시다. 문자열 연결 연산자는 두 문자열을 연결해서 새로운 문자열을 만들어 내는 것입니다. 단순한 연산자이므로 코드 한줄만 입력해 봐도 쉽게 이해할 수 있습니다.

>>> print("안녕" + "하세요")
안녕하세요
>>> print("안녕하세요" + "!")
안녕하세요!

이번에는 "안녕하세요1"을 출력하려는 의도로 다음과 같이 문자열과 숫자 사이에 문자열 연결 연산자 + 를 사용해 봤습니다. 어떤 결과가 나올까요?

>>> print("안녕하세요"+1)
TypeError: can only concatenate str (not "int") to str
다음과 같은 에러 메시지를 나타냈습니다.

따라서 문자열은 무조건 문자열끼리 + 기호를 사용해서 연결해야 하고, 숫자라 하더라도 문자열과 함께 + 연산하려면 큰따옴표를 붙여 문자열로 인식시켜야만 에러 없이 결과를 얻을 수 있습니다. 그리고 숫자를 더할 떄는 반드시 숫자와 숫자 사이에 + 기호를 사용해서 연산해야 합니다.

☑️ 문자열 반복 연산자 : *

문자열을 숫자와 * 연산자로 연결하면 문자열을 반복할 수 있습니다.
사용 방법은 아래와 같이 '문자열 * 숫자' 순으로 입력해도 되고,

>>> print("안녕하세요" * 3)
안녕하세요안녕하세요안녕하세요

'숫자 * 문자열'과 같이 순서를 바꿔서 입력해도 됩니다. 문자열 반복 연산자는 문자열을 숫자만큼 반복해서 출력합니다.

>>> print(3 * "안녕하세요")
안녕하세요안녕하세요안녕하세요

☑️ 문자 선택 연산자(인덱싱) : []

문자 선택 연산자는 문자열 내부의 문자 하나를 선택하는 연산자 입니다. 이때 대괄호 [] 안에는 선택할 문자의 위치를 지정하며, 이 숫자를 인덱스라고 부릅니다.

그런데, 프로그래밍 언어는 인데스 유형을 크게 두 가지로 구분해서 사용합니다. 하나는 숫자를 0부터 세는 제로 인덱스, 다른 하나는 숫자를 1부터 세는 원 인덱스로 구분합니다. 일단 결론부터 말하자면 파이썬은 '제로 인덱스' 유형을 사용하는 언어입니다. 즉 문자열의 위치를 셀 떄 무조건 0부터 세어 다음과 같이 첫 번쨰 글자가 0번째, 두 번째 글자가 1번째가 됩니다.

[0][1][2][3][4]

직접 코드를 입력해서 확인해 보겠습니다.

👉 문자 선택 연산자의 결과 출력하기

소스코드 string_operator01.py

print("문자 선택 연산자에 대해 알아볼까요?")
print("안녕하세요"[0])
print("안녕하세요"[1])
print("안녕하세요"[2])
print("안녕하세요"[3])
print("안녕하세요"[4])
문자 선택 연산자에 대해 알아볼까요?
안
녕
하
세
요

코드를 실행하면 0부터 시작하므로 0번째가 '안'이 되고 4번째가 '요'입니다.

그런데 갑자기 궁금해집니다. 문자를 거꾸로 출력하는 방법은 있을까요? 대괄호 안의 숫자를 음수로 입력하면 뒤에서부터 선택할 수 있습니다.

[-5][-4][-3][-2][-1]

직접 코드를 입력해서 확인해 보겠습니다.

👉 뒤에서부터 선택하기

소스코드 string_operator02.py

print("문자를 뒤에서부터 선택해 볼까요")
print("안녕하세요"[-1])
print("안녕하세요"[-2])
print("안녕하세요"[-3])
print("안녕하세요"[-4])
print("안녕하세요"[-5])
문자를 뒤에서부터 선택해 볼까요
요
세
하
녕
안

☑️ 문자열 범위 선택 연산자(슬라이싱) : [:]

문자열의 특정 범위를 선택할 때 사용하는 연산자도 있습니다. 즉 문자열에서 첫 번째 문자부터 세번째 문자까지 선택한다든가, 두 번째 문자부터 끝까지 선택한다든가 하는 것입니다. 범위는 대괄호 안에 위치를 콜론으로 구분해서 지정합니다.

>>> print("안녕하세요"[1:4]
녕하세

그런데 이 또한 프로그래밍 언어에 따라 두 가지 유형이 있습니다. 하나는 범위 지정 시 '마지막 숫자를 포함'이 있고, 다른 하나는 '마지막 숫자를 포함하지 않음'이 있습니다. 파이썬은 '마지막 숫자를 포함하지 않음'으로 적용합니다. 그래서 위와 같은 코드를 입력하면 1번째+2번째+3번째 글자까지만 추출되어 '녕하세'를 출력한 것입니다.

[0][1][2][3][4]

좀 더 확실하게 이해하기 위해 예제 몇 줄 더 실행해 보겠습니다.

>>> print("안녕하세요"[0:2])
안녕
>>> print("안녕하세요"[1:3])
녕하
>>>print("안녕하세요"[2:4])
하세

다시 강조하면 [0:2]라고 입력하면 뒤의 숫자 -1번째까지 선택되므로 [0:2]는 0~1번째 글자를 선택합니다.

또, 문자열 범위 선택 연산자는 대괄호 안에 넣는 숫자 둘 중 하나를 생략하여 다음과 같은 형태로도 사용할 수 있습니다. 뒤의 값을 생략할 떄는 자동으로 가장 최대 위치 (마지막 글자)까지, 앞의 값을 생략할 때는 가장 앞쪽의 위치(첫 번째 글자)까지 지정합니다.

[1:], [:3]

[1:]의 경우 뒤의 값을 생략했기 때문에 1번째 부터 끝의 문자까지 선택하고, [:3]의 경우는 앞의 값을 생략했기 때문에 0번째부터 뒤의 숫자 3번째 앞의 문자까지 선택합니다.

>>> print("안녕하세요[1:])
녕하세요
>>> print("안녕하세요[:3])
안녕하

지금까지 문자열에서 원하는 위치를 지정해 문자를 분리해 봤는데, []기호를 이용해 문자열의 특정 위치에 있는 문자를 참조하는 것을 인덱싱(indexing)이라 하고, [:] 기호를 이용해 문자열의 일부를 추출하는 것을 슬라이싱(slicing)이라 합니다.

그런데 한 가지 꼭 기억해 두어야 할 것은 문자열 선택 연산자로 슬라이스를 하더라도 원본은 변하지 않는다는 것입니다. 아래 예를 보겠습니다

>>> hello = "안녕하세요"   → ①
>>> print(hello[0:2])   → ②
안녕
>>> hello               → ③
'안녕하세요'

① "안녕하세요"라는 문자열을 hello라는 저장 공간(변수)에 저장합니다.
② hello에 있는 문자열 중 0, 1번째 문자열을 추출해 출력합니다.
③ hello를 입력해 hello라는 저장 공간(변수)에 들어 있는 값을 출력합니다. "안녕하세요"가 그대로 있습니다. 슬라이싱이라는 처리를 해도 원본은 그대로 남아 있는 것을 확인할 수 있습니다.

☑️ IndexError 예외

프로그래밍을 할 때 가장 많이 만나는 예외 중에 하나를 꼽으라면 바로 Index Error(index out of range) 예외입니다. 모든 프로그래밍 언어에서 살펴볼 수 있는 주요 예외 중의 하나입니다.

IndecError 예외는 리스트/문자열의 수를 넘는 요소/글자를 선택할 때 발생합니다. 아직 리스트를 배우지 않았으니 문자열을 대상으로 살펴보겠습니다.

다음 코드는 "안녕하세요"가 다섯 글자인데, 10번째 문자에 접근하고 있습니다. 즉 문자열에 없는 문자를 선택하고 있으므로, 인덱스가 범위를 넘었다고 해서 index out of range라는 오류를 발생합니다.

>>> print("안녕하세요"[10])
IndexError: string index out of range

이런 예외가 발생하면 리스트/문자열의 수를 넘는 부분을 선택했음을 알 수 있습니다.

☑️ 문자열의 길이 구하기 len()

문자열의 길이를 구할 때는 len() 함수를 사용합니다. 이전에 언급했던 것처럼 식별자 뒤에 괄호가 있으면 해당 식별자를 '함수'라고 부릅니다. len()도 식별자 뒤에 괄호가 있으므로 함수입니다.

그리고 괄호 내부에 문자열을 넣으면 '문자열에 들어있는 문자의 개수(=문자열의 길이)'를 세어 줍니다. 아래 코드의 경우 "안녕하세요"라는 문자열은 다섯 글자이므로 5를 출력합니다.

>>> print(len("안녕하세요"))
5

현재 코드를 보면 함수가 이중으로 사용되고 있습니다. 이렇게 함수가 여러 번 중첩되어 사용되면 괄호 안쪽부터 먼저 실행됩니다.

print(lend("안녕하세요")) -> print(5) -> 5

마무리

🔍 5가지 키워드 핵심 포인트

  • 자료의 형식을 자료형(data type)이라고 합니다.
  • 문자의 나열을 문자열이라고 하는데, 문자열은 큰따옴표 혹은 작은따옴표로 입력합니다.
  • 이스케이프 문자는 문자열 내부에서 특수한 기능을 수행하는 문자열을 말합니다.
  • 문자열 연산자에는 문자열 연결 연산자 + , 문자열 반복 연산자 * , 문자열 선택 연산자 [], 문자열 범위 선택 연산자 [:] 가 있습니다.
  • type()은 자료형을 확인하는 함수이며, len()은 문자열의 길이를 구하는 함수입니다.

🔍 확인문제

1. 다음은 문자열을 만드는 파이썬 구문입니다. 빈칸에 알맞은 기호를 넣어보세요.

구문의미
"글자"큰따옴표로 문자열 만들기
'글자'작은따옴표로 문자열 만들기
"""문자열 \t 문자열 \t 문자열"""여러 문자열 만들기

2. 이스케이프 문자의 의미를 보고 알맞은 기호 혹은 문자를 넣어보세요

이스케이프 문자의미
\"큰따옴표를 의미합니다
\'작은따옴표를 의미합니다
\n줄바꿈을 의미합니다
\t탭을 의미합니다
\\\을 의미합니다

3. 다음 프로그램의 실행 결과를 예측해 보세요.

>>> print("# 연습 문제")
>>> print("\\\\\\\\")  #이스케이프 문자 처리가 되어 \\가 한 세트로 \가 4개 출력됨
>>> print("_" * 8)
# 연습문제
\\\\
________

4. 다음 프로그램의 실행 결과를 예측해 보세요. 그런데 이 예제를 실행하면 오류가 발생합니다. 몇 행에서 어떤 오류가 발생할까요? 그리고 그 이유는 무엇인지 말해 보세요.

>>> print("안녕하세요[1])
>>> print("안녕하세요[2])
>>> print("안녕하세요[3])
>>> print("안녕하세요[4])
>>> print("안녕하세요[5])  #에러 발생! 안녕하세요는 0~4임
녕
하
세
요
IndexError: string index out of range

5. 다음 프로그램의 실행결과를 예측해 보세요.

>>> print("안녕하세요"[1:3])
>>> print("안녕하세요"[2:4])
>>> print("안녕하세요"[1:])
>>> print("안녕하세요"[:3])
녕하
하세
녕하세요
안녕하

윤성인, 『혼자 공부하는 파이썬』, 한빛미디어(2019), p46-62.

profile
라쏘, 릿지, 엘라스틱넷 중 라쏘를 담당하고 있습니다.

0개의 댓글

관련 채용 정보