Back
Featured image of post 데이터형과 데이터 구조 (2)

데이터형과 데이터 구조 (2)

기본 자료형, 리스트, 튜플, 딕셔너리

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. 리스트, 튜플, 딕셔너리

파이썬을 제대로 사용하려면 반드시 이해하고 있어야 하는 핵심적인 자료형들이다.

  1. 리스트
    • 0개 이상의 요소가 나열(Sequence)된 자료형
    • 요소의 추가 및 삭제, 덮어쓰기가 가능(mutable)하다.
    • 요소를 [ ]로 감싸서 만든다.
  2. 튜플
    • 0개 이상의 요소가 나(Sequence)열된 자료형
    • 한 번 만들어지고 나면 변경이 불가능하다(immutable).
    • 요소를 ( )로 감싸서 만든다.
  3. 딕셔너리
    • 키(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_xposition_y에 나뉘어 저장된 것을 볼 수 있다.

이를 응용하면 다음 작업도 가능하다.

>>> x = 4
>>> y = 3
>>> (x, y) = (y, x)
>>> x
3
>>> y
4

이는 마치 튜플의 값이 바뀐 것처럼 보이지만, 사실은 다음과 같은 과정을 거치게 된다.

  1. (y, x)가 3, 4으로 언팩된다.
  2. 새로운 튜플 (x, y)가 선언되고, 3, 4으로 초기화된다.
  3. 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))

그리고 책에는 추가적인 예시로 틱택토 게임을 리스트의 리스트를 사용해 나타낼 수 있는 방법에 대해서도 소개하고 있었는데, 해당 부분은 생략하기로 한다.

원래 이번 글에 챕터의 모든 내용을 정리하려 했으나 생각보다 길어지는 관계로, 리스트 및 튜플에 관련된 함수들은 다음 포스팅에서 다루기로 한다.

(다음 글에서 계속됩니다.)

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus