파이썬과 객체
이 글의 작성자는 C/C++ 프로그래밍을 하던 사람이다. 이 글은 Python을 복습하며 작성하는 글이니, 부족한 부분이 있으면 얼마든지 피드백을 주시기 바란다.
프로그램에 필요한 것
우리는 Python을 이용하여 프로그램을 만들려고 한다. 그러면 프로그램에 필요한 요소는 무엇이 있을까?
계산기 프로그램을 만든다고 한다고 생각해보자. 무엇이 필요할까? 한 번 간단한 수식을 놓고 생각해보자.
2 + 3
2
와 3
처럼 계산에 필요한 숫자들이 필요하고,
2
와 3
에 대한 +
계산을 수행하는 방법이 필요하다.
숫자만 있어도 안되고, 방법만 있어도 안된다.
숫자와 계산하는 방법 둘 다 필요하다.
위의 내용을 계산기에 국한시키지 않고 뭔가 있어보이는 말로 표현하자면, 프로그램은 데이터(Data)와 알고리즘(Algorithm)이 필요하다.
계산기 예시에서 데이터는 숫자이며, 알고리즘은 덧셈 연산이다.
모든 프로그램은 위와 같이 데이터를 입력받고, 해당 데이터를 연산하는 과정을 한 번 혹은 수없이 많이 반복하며 결과를 도출해낸다.
객체(Object) : 데이터를 표현하는 방법
그렇다면 Python은 데이터를 어떻게 표현을 할까?
파이썬 시작하기에서 소개한 특징 중 다음과 같은 특징이 있었다.
객체지향(Object-Oriented) 언어이다
Python은 모든 데이터를 객체(Object)로 표현한다. 다른 객체지향 언어를 다뤄본 사람이라면 익숙하게 들리겠지만, 객체지향 언어를 다뤄본 적이 없거나, 프로그래밍 자체가 처음인 사람이라면 “그래서 객체가 뭔데?” 라는 생각이 들 것이다.
Python Glossary 페이지(용어 해설집)에서 object (객체)에 대해 찾아보자.
상태 (어트리뷰트나 값) 를 갖고 동작 (메서드) 이 정의된 모든 데이터. 또한, 모든 뉴스타일 클래스 의 최종적인 베이스 클래스입니다.
위의 설명을 읽고 이해한 사람도 있을 수 있으나, 이해하지 못한 사람도 있을 수 있다. 지금 당장 위의 문구가 이해가 가지 않아도 상관없다. 억지로 이해할 때 까지 머리를 싸매며 끙끙 앓지 말고, 아무튼 무언가를 나타내는 물건정도로 기억하고 넘어가자. 위의 문구를 이해하기 위해 멈춰있는 것은 시간낭비다.
그렇다면 위의 계산기 예시에서 사용된 데이터는 무엇이 있었는가?
피연산자인 정수 2
와 3
이 있었다. 그리고 이 둘은 객체이다.
2
는 2를 표현하는 정수형 객체이고,
3
은 3을 표현하는 정수형 객체이다.
위에서 보여준 형태로 숫자 3을 객체로 표현한다면 다음과 같이 표현할 수 있을 것이다.
객체의 구성 요소
위의 객체 그림을 조금 더 뜯어보자. 객체를 구성하는 것들은 무엇일까?
3
객체 그림을 살펴보면, 세 가지 요소가 보일 것이다.
- 정수라고 쓰여져 있는 라벨(?)
- 3 이라고 쓰여진 값
- 오른쪽 아래에 쓰여진 시리얼 넘버(?) 같은 것
정수라고 쓰여져 있는 라벨은 타입(Type)이라고 부른다.
객체가 있긴 한데, 이 객체가 어떤 형식의 데이터를 표현하고 있는지
알려주는 역할을 하는 것이 타입이다.
위의 예시에서는 정수 라벨이 붙어 있으므로, 이 객체는
정수를 표현하는 객체라는 사실을 알 수 있다.
Python에서는 정수형 객체의 타입을 int로 표현한다. 기본적인 타입들에 대해서는 다음에 알아보자.
3이라고 쓰여져 있는 값은 말 그대로 값(Value)이라고 부른다.
값은 사전적인 의미 그대로의 값(하나의 글자나 식이 취하는 수)을 의미한다.
위의 예시에서는 3이라고 적혀 있으므로, 이 정수형 객체는
3이라는 정수를 표현하고 있다는 것을 알 수 있다.
마지막으로 시리얼 넘버 같은 것은 아이덴티티(identity)라고 부른다. 이게 뭐냐면, 우리 흔히 ID라고 부르는 것이 Identity의 약어이다. 아이덴티티는 객체의 주민등록번호 역할을 수행한다. 따라서 각 객체마다 고유한 값을 지니게 된다.
다른 언어를 공부한 사람들이라면 이해할 수도 있는 이야기인데, 특정 환경에서는 메모리 주소를 객체의 id로 사용하기도 한다.
객체의 특징
그러면 이번에는 객체의 특징을 간단하게 알아보자.
- 타입을 바꿀 수 없다
객체의 타입은 한 번 정하면 바꿀 수 없다. 한 번 정수형 객체로 태어났으면, 끝까지 정수형 객체로 살아야 한다. 이러한 타입의 특징을 강타입(Strong Typing) 이라고 부른다.
반대로는 약타입(Weak Typing)이 있다.
- 가변성(Mutability)가 존재한다
가변성은 객체의 값 수정 가능 여부를 의미한다. 만약 객체의 값을 수정할 수 있으면 가변(mutable)이고, 객체의 값을 수정할 수 없으면 불변(immutable)이다.
- 객체를 내 손으로 없앨 수는 없다
Python에서는 이미 생성된 객체를 직접적으로 없애는 기능은 없다.
만약 C/C++이라면, malloc()이나 new등으로 생성한 메모리를 free()나 delete로 해제할 수 있었지만, Python에서는 그런 게 없다.
그러면 “한 번 생성한 객체는 영원히 사라지지 않는거냐?” 라고 물어보면 그건 또 아니다. 이는 Python에서 특정 객체가 더 이상 필요하지 않다고 판단하면 Python이 알이서 제거해준다.
이러한 동작을 가비지 컬렉션(Garbage Collection)이라고 부른다.
그러면 가비지 컬렉션은 어떻게 이루어지는 것일까? 다음 포스트에서 변수(Variable)에 대해 익히면서 알아보자.
Comments