4. 데이터형
파이썬의 기본적인 데이터형은 다음과 같다.
종류 | 예약어 | 상세 | 예시 |
---|---|---|---|
정수 | int |
소수점이 없음 | 4 , 2 , 6 |
실수 | float |
소수점이 있음 | 3.14 , 2.71 |
문자열(String) | str |
문자열의 나열 | 'everimind4' |
부울(Boolean) | bool |
논리값을 저장 | True , False |
1. 숫자
숫자를 저장하기 위한 변수는 다른 언어들과 마찬가지로 2종류가 있다.
- 정수형 : 정수 값을 저장, 소수점이 없다.
- 실수형 : 실수 값을 저장, 소수점이 있고, 부동소수형이라고도 한다.
C와의 차이점 : 예약어로 변수의 데이터형을 지정할 필요 없이 그냥 값을 저장하면 자동으로 지정된다.
그리고 다음과 같은 규칙이 있다.
-
같은 데이터형끼리 계산하면 기본적으로 같은 데이터형이 된다.
-
정수끼리 나눗셈을 하면 실수형이 된다.
-
정수와 실수형을 서로 계산하면 결과는 실수형이 된다.
2. 문자열
C와의 차이점 : 문자(char)형 변수는 없고 문자열(string)만 있다.
문자열은 ' '
또는 " "
로 감싸서 만든다.
그 이유는, '
나 "
가 포함된 문자열을 저장하기 위해서이다.
C에서는
\'
또는\"
와 같이 해당 기호 앞에 백슬래시(\
)를 적어 주는 방식으로 정규표현식을 사용해 이와 같은 문제를 해결하였다.
Hi, my name is "Alan Choi".
위 문장을 저장하려면 어떻게 해야 할까? " "
를 사용하면 is
까지만 저장하라는 의미가 되어 버릴 것이다. 이런 경우를 방지하기 위해 ' '
와 " "
의 2가지 형태를 지원한다.
5. 형변환
데이터형은 서로 형변환이 가능하다.
특정한 경우 변환 시 에러가 발생하는 것을 제외하면, 기본적으로 모든 자료형 간의 상호 변환이 가능하다.
C와의 차이점 : C에서는 자체 문법으로 명시적(explicit) 혹은 묵시적(implicit) 방식으로 형변환을 했지만, 파이썬은 데이터형의 예약어를 이름으로 갖는 내장 함수를 사용해 형변환을 한다.
1. 정수로 변환
int(변환할 값)
함수를 사용해 값을 변환한다.
>>> int(4.26)
4
>>> int("-4")
-4
>>> int(True)
1
>>> int(False)
0
- 실수형은 소숫점 이하를 버린다.
True
는 1,False
는 0으로 변환된다.- 문자열은 읽는 것처럼 변환해 준다.
무슨 말이냐 하면, 2번째 줄의 코드 int("-4")
는 문자열을 정수로 변환한 것인데, 액면가(?) 그대로 인식해 사람이 읽는 것처럼 값으로 변환해 주는 것을 볼 수 있다.
그렇다면 이런 코드를 실행하면 어떻게 될까?
>>> int("Hello, python!")
다음과 같은 에러가 발생한다.
2. 실수로 변환
정수형과 마찬가지로, float(변환할 값)
함수를 사용해 값을 변환한다.
>>> float(7)
7.0
>>> float("-4.26")
-4.26
>>> float(True)
1.0
>>> float(False)
0.0
실수형과 크게 다르지 않은 결과를 보인다.
- 정수형은 소수점 이하를
.0
으로 저장한다. True
는 1.0,False
는 0.0으로 변환된다.- 문자열은 읽는 것처럼 변환해 준다.
그리고 (예상했겠지만) 다음과 같은 문자열 변환은 실수형과 마찬가지로 에러를 반환한다.
>>> float("Hello, python!")
3. 문자열로 변환
문자열로 변환하려면 str(변환할 값)
함수를 사용한다.
>>> str(4)
'4'
>>> str(-3.22)
'-3.22'
>>> str(True)
'True'
>>> str(False)
'False'
변환 결과가 전부 ' '
로 감싸진 문자열이다.
4. 부울형으로 변환
부울형으로 변환하려면 bool(변환할 값)
함수를 사용한다.
>>> bool(4)
True
>>> bool(-3.22)
True
>>> bool(0)
False
>>> bool(0.0)
False
>>> bool("Hello, python!")
True
>>> bool('')
False
- 0, 0.0, 빈 문자열은
False
가 된다. - 그 이외의 값은 전부
True
가 된다.
6. 리스트, 튜플, 딕셔너리
파이썬을 제대로 사용하려면 반드시 이해하고 있어야 하는 핵심적인 자료형들이다.
- 리스트
- 0개 이상의 요소가 나열(Sequence)된 자료형
- 요소의 추가 및 삭제, 덮어쓰기가 가능(mutable)하다.
- 요소를
[ ]
로 감싸서 만든다.
- 튜플
- 0개 이상의 요소가 나(Sequence)열된 자료형
- 한 번 만들어지고 나면 변경이 불가능하다(immutable).
- 요소를
( )
로 감싸서 만든다.
- 딕셔너리
- 키(Key)와 값(Value)의 쌍으로 이루어진 자료형
- 키(Key)는 인덱스(Index) 역할을 하며, 다른 키(Key)와 중복될 수 없다.
- 값(Value)은 키에 연결되며, 다른 값(Value)과 중복될 수 있다.
C와의 차이점
리스트와 튜플은 C의 ‘배열(Array)‘과 사용법이나 특징이 거의 동일하다. 리스트는 수정 가능한 배열, 튜플은 수정 불가능한 배열로 보아도 무방하다.
어차피 동일하다면, 값을 수정할 수 없는 튜플이 무슨 의미가 있는가? 라는 생각이 들 수도 있다.
그러나 리스트에 비해 메모리를 적게 소비하고, 데이터를 실수로라도 변경할 수 없다는 점 등에서 차이가 난다.
결국 적재적소에 잘 사용하는 것이 중요하다.
1. 리스트
리스트는 0개 이상의 요소를 ,
로 구분하여 [ ]
를 사용해 선언한다.
요소는 어떤 데이터형도 가능하다. 숫자, 문자, 부울뿐만 아니라 리스트, 튜플, 딕셔너리도 가능하다.
>>> Months = ["January", "February", ..., "December"]
>>> Friends = ["Alan", "Crystal", "Sally"]
>>> Coffees = ["Americano", "Espresso", "Latte", "Macchiato", "Einspanner"]
특정 값을 참조하려면 리스트명 뒤에 [번호]
를 붙이며, 값을 변경할 수도 있다.
번호는 0부터 시작한다.
>>> Months[2]
'March'
>>> Coffees[4]
'Einspanner'
>>> Friends
['Alan', 'Crystal', 'Sally']
append()
메소드를 사용해 리스트 맨 끝에 요소를 추가할 수 있다.
>>> Coffees.append("Cappuccino")
>>> Coffees
['Americano', 'Espresso', 'Latte', 'Macchiato', 'Einspanner', 'Cappucchino']
insert()
메소드를 사용해 지정한 위치에 요소를 추가할 수 있다.
>>> Friends.insert(2, "No-Face")
>>> Friends
['Alan', 'Crystal', 'No-Face', 'Sally']
del
명령어를 사용해 리스트의 요소를 삭제할 수도 있다.
>>> del Coffees[1]
>>> Coffees
['Americano', 'Latte', 'Macchiato', 'Einspanner', 'Cappucchino']
del
은 메소드가 아니라 파이썬 문법 내의 명령어이다. 따라서, Coffees.del(...)
과 같은 방식으로 사용할 수 없다. 자세한 부분은 추후 클래스 챕터에서 다룬다.
2. 튜플
튜플은 0개 이상의 요소를 ,
로 구분하여 선언한다. ( )
를 사용하지 않고도 선언 가능하지만, 튜플임을 명확히 나타내려면 ( )
로 감싸 선언하는 편이 명확하다.
보통 고정된 개수의 값을 포함하는 정보를 튜플에 묶어서 저장한다.
본 교재의 목표는 게임 제작이다. 게임에서는 2차원상의 위치정보(x좌표, y좌표)를 저장할 필요가 있다.
이와 같이 고정된 개수의 변수를 묶어서 저장하고 관리할 때는 튜플이 적합하다.
>>> position = (40, 26)
>>> position
(40, 26)
>>> position[0]
40
>>> position[1]
26
값을 변경할 수 없으므로 리스트의 append()
, insert()
, del
등은 사용할 수 없다.
튜플에는 독특한 사용법이 있다.
언팩(Unpack) : 하나의 튜플을 여러 변수에 대입하는 것
>>> position = (40, 26)
>>> position_x, position_y = position
>>> position_x
40
>>> position_y
26
position
이라는 이름의 튜플에 저장된 값이 position_x
와 position_y
에 나뉘어 저장된 것을 볼 수 있다.
이를 응용하면 다음 작업도 가능하다.
>>> x = 4
>>> y = 3
>>> (x, y) = (y, x)
>>> x
3
>>> y
4
이는 마치 튜플의 값이 바뀐 것처럼 보이지만, 사실은 다음과 같은 과정을 거치게 된다.
- (y, x)가 3, 4으로 언팩된다.
- 새로운 튜플 (x, y)가 선언되고, 3, 4으로 초기화된다.
- x = 3, y = 4라는 값을 출력한다.
상기한 대로, 튜플의 값은 변화시킬 수 없다. 하지만 이는 튜플에 저장된 값을 수정하는 것이 아니라, 새로 선언된 튜플을 초기화하는 값으로 기존 튜플의 언팩을 사용한 것이다!
3. 딕셔너리
말 그대로 사전처럼 쓸 수 있는 데이터 구조이다.
리스트와 튜플에서는 숫자로 특정 값을 찾을 수 있었지만, 딕셔너리에서는 ‘키(Key)‘로 ‘값(Value)‘을 찾을 수 있다.
선언 방법은 다음과 같다.
>>> Profile = {
"Name" = "Smith",
"Age" = 35,
"Sex" = "M",
"Height" = 176,
}
>>> Profile
{'Name': 'Smith', 'Age': 35, 'Sex': 'M', 'Height': 176}
>>> Profile["Name"]
'Smith'
>>> Profile["Age"] = 36
>>> Profile
{'Name': 'Smith', 'Age': 36, 'Sex': 'M', 'Height': 176}
{ }
로 감싸고, (Key) : (Value)
형태로 데이터를 작성한다. 키-값 쌍을 여러 개 저장하고 싶으면 ,
로 구분한다.
키와 값은 임의의 데이터형을 모두 사용할 수 있지만 일반적으로 키에는 문자열을 사용한다.
딕셔너리의 요소를 참조하고자 할 때는 리스트/튜플과는 다르게 []
내에 번호가 아닌 키 값을 지정한다.
지금까지의 내용을 정리하면 다음과 같다.
리스트 | 튜플 | 사전 | |
---|---|---|---|
선언법 | [ ] |
( ) |
{ } |
데이터 구조 | 나열(Sequence) | 나열(Sequence) | K-V 쌍 (Dictionary) |
참조 방식 | 변수명[번호] |
변수명[번호] |
변수명[키] |
특징 | 수정 가능함 | 수정 불가함 | 순서가 없음 |
4. 다차원 리스트(튜플)
앞서 한 번 언급한 적 있지만, 리스트나 튜플은 또 다른 리스트나 튜플을 원소로 가질 수도 있다.
C에서도 배열을 비슷한 방식으로 사용할 수 있다.
배열의 원소가 배열인 경우를 2차원 배열이라고 부른다.
또한, 튜플의 원소가 리스트이거나, 리스트의 원소가 튜플일 수도 있다.
이런 사용 방식에는 다음과 같은 특징이 따라오게 된다.
- 리스트의 원소가 튜플인 경우 해당 튜플이 쉽게 다른 것으로 대체될 수 있다.
- 튜플의 원소가 리스트인 경우 해당 리스트의 값을 수정할 수 있다.
각 자료형을 사용하는 이점이 흐려지는 느낌이 들기 때문에, 내 생각에는 이런 형태는 지양하는 편이 나을 듯 하다.
마지막으로 예시를 하나만 살펴보자.
학생 3명의 이름을 저장한 튜플, 학생 3명의 개인 성적을 저장한 튜플이 있다고 하자. 이 2개의 튜플을 요소로 갖는 또 다른 튜플을 다음과 같이 선언할 수 있다.
>>> name = ("Alan", "Crystal", "Sally")
>>> score = (85, 97, 90)
>>> data = (name, score)
>>> data
(('Alan', 'Crystal', 'Sally'), (85, 97, 90))
3번째 학생인 'Sally'
의 성적은 score[2]
로도 조회가 가능하지만, data[0][2]
로도 조회할 수 있다. data[0]
에 저장된 요소가 score
이기 때문이다!
위의 예시에서는 각각 튜플을 미리 선언한 후, 해당 튜플의 이름을 새로운 튜플의 요소로 넣었지만 전체를 직접 작성하는 것도 가능하다.
>>> data = (("Alan", "Crystal", "Sally"), (85, 97, 90))
>>> data
(('Alan', 'Crystal', 'Sally'), (85, 97, 90))
그리고 책에는 추가적인 예시로 틱택토 게임을 리스트의 리스트를 사용해 나타낼 수 있는 방법에 대해서도 소개하고 있었는데, 해당 부분은 생략하기로 한다.
원래 이번 글에 챕터의 모든 내용을 정리하려 했으나 생각보다 길어지는 관계로, 리스트 및 튜플에 관련된 함수들은 다음 포스팅에서 다루기로 한다.
(다음 글에서 계속됩니다.)