1. 객체(object)
파이썬에서 모든 것은 객체(object)로 구현됩니다. 여기서 모든 것이란 숫자(정수, 부동소수점 등), 문자열, 튜플, 리스트, 셋, 딕셔너리, 불(bool) 등을 포함한 데이터, 심지어는 더 큰 자료구조, 함수, 프로그램 등을 말합니다.
그렇다면 객체란 무엇일까요? 객체는 추상적인 개념이라 이해하고 받아들이기가 상당히 어렵습니다. 일단 객체를 데이터 조각을 담고 있는 아주 투명한 플라스틱 박스라고 생각합시다. 객체는 자료형(타입, data type)이라는 정체성을 가지며 자료형에 따라
1. 해당 데이터를 가지고 무엇을 할 수 있는지
2. 플라스틱 박스 안에 있는 데이터를 바꿀 수 있는지
가 결정되기도 합니다.
잠깐 다른 얘기로 넘어가봅시다. 여러분 ‘사과’를 머릿속으로 떠올려보세요. 다들 생각하셨나요? 실제로 해볼 수는 없겠지만 떠올린 사과를 제가 떠올린 사과와 비교해볼 수 있다면, 아마 저와 똑같은 모양과 크기, 특징을 가진 사과를 떠올리신 분은 없을 겁니다. 어떤 분은 빨간 사과, 어떤 분은 풋사과, 어떤 분은 크기가 큰 사과, 또 어떤 분은 크기가 작은 사과를 떠올립니다. 물론 그렇다고 해서 다른 사람이 떠올린 사과가 사과가 아닌 것은 아닙니다. 특징은 제각각일지라도 우리는 모두 그것이 사과라는 것을 자연스럽게 알고 있습니다.
인간은 귀납적으로 학습하는 동물입니다. ‘사과’라는게 정확히 어떤 건지 명확하게 정의를 내릴 수 있는 사람은 없습니다. 그저 어렸을 적부터 그림책이나 부모님과 시장에서 과일을 살 때 ‘이게 사과다’라는 것을 익히고, 먹어보면서 경험하고 하면서 사람들 사이에서 ‘사과’라고 부르는 게 무엇인지를 자연스럽게 학습하게 됩니다. 우리는 무엇을 '사과'라고 할 수 있는지 정확히 또는 엄밀하게 정의를 내릴 수는 없지만 지금 눈앞에 보이는 사물이 사과인지 아닌지는 판별할 수 있습니다. 즉, 우리는 ‘사과’라는 ‘객체’가 무엇인지 엄밀하게 정의내리진 못하지만 이 ‘객체’가 어떠한 특징을 담고 있는지를 안다는 것입니다. 나무에서 열리는 과일이고, 색이 빨갛기도 하고 녹색이기도 하고, 크기는 대충 어느 정도에 원형을 띠고 있고 등등.
파이썬도 마찬가지입니다. 단지, 파이썬에서 ‘객체’는 파이썬 스스로가 학습과 경험을 통해서 정립되는 것이 아니라 인간이 만들어 놓은 개념 내에서만 적용되는 개념일 뿐입니다. 파이썬에 내장되어 있는 가장 단순한 객체로는 우선 ‘정수’가 있습니다. 1, 10, -23, 1678, -20090 등의 숫자를 보면 모두 우리가 ‘정수’라고 대답을 할 수 있듯이 파이썬도 이들이 ‘정수’라는 자료형이라는 것을 알고 있습니다. 이러한 정수는 ‘크기’라는 특징이 있고 정수 사이에 가능한 ‘연산’이라는 행위가 있습니다. 파이썬에서 이런 정수들을 사용할 때는 각 정수가 ‘객체’로서 구현이 되고 이 객체는 ‘정수’이라는 자료형으로 분류되며 이 정수 ‘객체’를 가지고 프로그램 내에서 할 수 있는 것이 제한됩니다.
다시 사과로 돌아와서 플라스틱 박스에 사과를 담는다고 생각해봅시다. 대신 각 박스에는 사과를 하나만 담을 수 있습니다. 박스는 '사과'라는 추상적 개념에 해당되기 때문입니다.
앞에서 얘기했듯 우리는 크기가 좀 달라도, 색이 빨간색일 수도 또 녹색일 수도 있지만 어쨌든 모두 '사과'라는 개념 범주 안에 있는 사물이라고 생각을 합니다. 플라스틱 박스에 사과를 담는 과정은 우선 박스에 '사과' 라는 일종의 자료형을 부여하는 것과 같습니다. 물론 '사과'라는 라벨링이 붙은 박스에 담긴 사과는 위와 같이 박스마다 제각각일 수 있습니다. 크기가 큰 사과, 작은 사과, 빨간 사과, 덜 익은 사과 등등 모두 다른 형태의 사과가 담길 수는 있지만 어쨌든 박스에는 '사과'라고 표시가 되어 있습니다. 이렇게 타입이 정해진 사과 박스들로 할 수 있는 것은 한정되어 있습니다. 갈아서 잼을 만든다든지, 즙을 만든다든지 등을 할 수는 있지만 이 사과 박스들로 두부를 만든다던지, 삼겹살을 만든다던지는 할 수 없는 것입니다.
프로그래밍으로 돌아와서, 가장 간단한 자료형인 정수를 생각해봅시다. 사용자가 프로그래밍 환경에서 정수를 입력하거나 사용할 때는 '정수'라는 데이터 타입이 부여됩니다. 물론 사용자마다 다른 정수를 사용할 수 있습니다만 우리는 1, 4, -12, 100, -256 등이 '정수'라는 범위에 속한다는 것은 알고 있습니다.
담겨있는 숫자는 모두 다르지만 이들이 모두 '정수'입니다. 프로그램 상에서 정수가 어떠한 형태로든 구현될 때 '정수'라는 자료형에 속하게 되며 '정수'로 가능한 것만 할 수 있게 됩니다. 이 정수들로 덧셈, 뺄셈, 곱셈과 같은 연산을 할 수 있겠지만 인덱싱을 한다든지, 슬라이싱을 한다든지(시퀀스 데이터 타입에서 다룰 내용입니다. 모르겠으면 그냥 넘어가면 됩니다.) 등은 할 수 없습니다.
자료형은 또한 객체가 포함하고 있는 자료의 값이 바뀔 수 있는지 없는지를 결정합니다. 바뀔 수 있다면 가변(mutable) 객체라 하며 바뀔 수 없다면 불변(immutable) 객체라 합니다. 이후에 다룰 파이썬에 내장되어 있는 기본 자료형 중, 리스트와 딕셔너리가 가변 객체이며 문자열, 튜플, 셋 등은 불변 객체입니다. 파이썬은 strongly typed language 중 하나로 객체가 포함하고 있는 변할 수도(가변 객체의 경우) 있지만 객체의 자료형은 변하지 않습니다.
2. 변수(variable)
프로그래밍 언어는 우리가 변수(variable)를 정의할 수 있도록 해줍니다. 변수란, 우리가 프로그램 내에서 사용을 위해 정의한 컴퓨터 메모리 내의 값(value)를 지칭하는 이름을 말합니다. 파이썬에서 변수에 어떤 값을 할당할 때는 기호 =를 이용합니다. 다음의 두 줄짜리 파이썬 코드는 7이라는 정수값을 ‘a’라는 이름을 가진 변수에 할당하고 현재 변수 a에 할당된 숫자를 출력하는 프로그램입니다.
a = 7 print(a) |
결과)
7 |
파이썬 변수에 대해서 꼭 집고 넘어가야하는 것은 변수란 그저 이름에 불과하다는 것입니다. 어떤 값에 변수를 할당하는 행위는 값을 포함하고 있는 객체에 이름을 붙인 것일 뿐, 값 그 자체를 복사하지는 않습니다. 아래의 코드는 값 7을 담고 있는 객체에 a라는 이름의 변수를 할당한 뒤 이를 다시 8에 할당하여 변수 a를 출력하는 프로그램입니다.
a = 7 a = 8 print(a) |
결과)
8 |
위의 그림과 같이 어떤 값에 변수를 할당한다는 것은 그 값이 담겨 있는 객체에 이름을 붙이는 것일 뿐입니다. 따라서 같은 이름을 가진 변수가 다른 값에 할당된다는 것은 기존에 붙어 있던 이름표를 떼어내서 새로운 값을 담고 있는 객체에 붙이는 것과 같습니다. 때문에 해당 변수가 담고 있는 값을 출력(print)하게 되면 새롭게 할당된 값이 출력되는 것입니다.
파이썬에서 어떤 변수에 할당된 값을 담고 있는 객체, 또는 그 값 자체의 자료형이 궁금할 때는 type()이라는 명령어를 사용하면 됩니다.
a = 7 b = a print(type(a)) print(type(b)) print(type(58)) print(type(99.9)) print(type('abc')) |
결과)
<class 'int'> <class 'int'> <class 'int'> <class 'float'> <class 'str'> |
클래스(class)란 객체(object)에 대한 정의로, 조금 이후의 글에서 다루겠습니다. 파이썬에서 클래스와 자료형(type)은 비슷한 의미를 가집니다. ‘int’는 정수를, ‘float’은 부동소수점을, ‘str’은 문자열을 의미합니다.
3. 파이썬 변수명(variable name)
변수 이름으로 사용할 수 있는 것은 다음과 같습니다.
- 소문자 (a-z)
- 대문자 (A-Z)
- 숫자 (0-9)
- underscore (_)
이때 변수명은 숫자로 시작할 수 없습니다. 또한 파이썬은 underscore로 시작하는 변수명을 조금 특별한 방식으로 다룹니다. (이는 이후의 글에서 다루겠습니다.) 아래의 예들은 유효한 변수명입니다.
a
a1
a_b_c___95
_abc
_1a
아래의 예들은 유효하지 않은 변수명입니다.
1
1a
1_
아래의 단어들은 파이썬에 이미 내장되어 있는 단어(reserved word)로 변수 이름으로 사용하면 안됩니다.
False None True nonlocal
is and or in
class return continue for lambda try def while del global with as elif if yield assert
else import break except raise
finally
from
pass
위의 단어들은 파이썬 문법을 규정하는 것들로 앞으로 다룰 파이썬 문법에서 계속해서 쓰일 것입니다.
'Python-기본 > Python-데이터 타입 및 자료 구조' 카테고리의 다른 글
Python-컬렉션 데이터 타입(1. 셋) (0) | 2021.01.05 |
---|---|
Python-3. 시퀀스 데이터 타입(3. 리스트) (0) | 2021.01.04 |
Python-3. 시퀀스 데이터 타입(2. 튜플) (0) | 2020.12.30 |
Python-3. 시퀀스 데이터 타입(1. 문자열) (0) | 2020.12.20 |
Python-2. 숫자 데이터 타입 다루기 (0) | 2020.12.14 |