[파이썬 일기] #7. 클래스로 나만의 자료형 만들기
Python 2009/07/12 00:18 |파이썬은 동적 객체 지향 언어입니다. 동적이라는 말의 의미는 이미 파이썬 일기의 초장에 정리해놨으니, 이번엔 객체 지향이라는 말의 의미를 알아봅시다. 객체, 지향, 이 두 단어는 따로 떼어 놓으면 전혀 어려운 뜻이 아닌데 붙여 놓으니까 무슨 말인지 하나도 이해가 안 갑니다.
이럴 때는 위키 피디아님에게 도움을 청하는 것도 하나의 방법입니다.
Object-oriented programming (OOP) is a programming paradigm that uses "objects" — data structures consisting of datafields and methods — and their interactions to design applications and computer programs. Programming techniques may include features such as information hiding, data abstraction, encapsulation, modularity, polymorphism, and inheritance. It was not commonly used in mainstream software application development until the early 1990s. Many modern programming languages now support OOP.
라는군요.
요약하자면, 객체 지향 프로그래밍은 프로그래밍을 할 때 "객체"를 중심으로 사고, 생각을 한다는 것입니다. 객체 지향 프로그래밍 이전의 프로그래머들은 명령을 중심으로 생각했었죠. 그나저나 여기에서 말하는 객체는 또 무슨 의미일까요? 그냥 단순하게 우리가 앞에서 살펴봤던 변수와 메쏘드를 함께 갖고 있는 "무엇"이라고 생각하면 됩니다. 앞에서 인용한 설명대로, 객체 내의 변수와 메쏘드는 긴밀하게 상호 동작합니다(그렇지 않으면 한 객체 안에 엮어놓을 이유가 없겠죠!).
인용구의 나머지 부분은 나중에 다시 한번 이야기하기로 하고, 이제는 클래스에 대해 이야기를 시작하겠습니다.
클래스와 객체의 관계는 자료형과 변수의 관계라고 생각하면 딱 맞습니다. 파이썬에서는 모든 것이 객체이므로 자료형이 클래스이고 클래스가 자료형이며, 변수가 객체고 객체가 변수라고 할 수 있습니다. 우리가 지금까지 만들어 왔던 객체들은 모두 파이썬에 내장되어 있는 클래스들을 이용한 것입니다. int, float, string, tuple, list 는 파이썬의 내장 클래스의 일부입니다. 이들은 다시 새로운 클래스를 만들 때 재료로 사용되곤 합니다.
파이썬의 클래스는 다음과 같이 class 키워드를 이용하여 선언합니다. 그리고 그 안에 클래스의 멤버들(변수, 메쏘드)를 선언하면 기본적인 클래스가 완성됩니다.
>>> class A : a = 0 b = 0 def printMembers(self) : print( self.a, self.b )
>>> obj = A() >>> obj.a = 3 >>> obj.b = 4 >>> obj.printMembers() 3 4
위 코드에서 중요한 건 class 키워드입니다. 우리는 위에서 A라는 클래스를 선언했고, A 클래스 변수 두 개(a와 b), 함수 하나(printMembers)를 정의했습니다. a와 b에 대해서는 특별히 볼 것이 없습니다. 클래스 안에서 선언되었다는 것 말고는 특별한 것이 없습니다. 하지만 printMembers()는 보통의 함수와 다른 것을 갖고 있습니다. 보이나요?
예, self 입니다. self 는 객체 자신을 가리키는 변수로써, self라는 이름은 파이썬에 키워드로 예약되어 있습니다. (즉, 우리는 self라는 변수를 임의로 만들어 쓸 수 없다는 뜻입니다. ) 파이썬은 클래스의 메쏘드로 하여금 반드시 self 매개 변수를 받는 꼴로 구현하도록 강요합니다. 대신 이 메쏘드를 실제로 호출할 때는 self 에 아무것도 대입하지 않아도 됩니다. 마치 self 매개 변수는 없는 것처럼 사용하면 됩니다.
self가 객체 자신을 가리킨다고 했는데, 그럼 self를 통하면 객체의 멤버와 메쏘드 모두에게 접근이 가능하겠죠? self 뒤에 마침표(.)를 찍고 변수 또는 메소드의 이름을 적어주면 됩니다. 다음과 같이 말입니다.
>>> obj = A() >>> obj.a = 3 >>> obj.b = 4 >>> obj.printMembers()
아, 중요한 것을 빼먹었네요. 위 코드에서 obj를 생성하기 위해 A()라는 함수를 호출해서 그 결과를 대입하는 부분이 있죠? 여기에서 A()를 생성자(Constructor)라고 합니다. 생성자는 클래스와 같은 이름을 가지며, 클래스를 만들어주는 역할을 하는 함수입니다. 생각해보니, 우리는 A() 생성자를 구현한 적이 없습니다. 하지만 우리는 호출을 했고, A() 생성자는 우리가 원하는 대로 객체를 만들어 반환했습니다. 이것은 기본 생성자(Default Constructor) 때문입니다. 우리가 생성자를 따로 만들지 않아도 파이썬에서 기본 생성자를 제공합니다.
클래스를 사용하다 보면 어떤 때는 객체를 생성할 때 일부 멤버 변수를 원하는 값으로 초기화하고 싶을 때가 있습니다. 이런 경우에는 생성자를 직접 구현하는 것이 좋은 답이 됩니다. 생성자를 호출할 때는 클래스의 이름 뒤에 ()만 붙이면 되지만, 구현할 때의 생성자는 __init__()라는 이름을 가집니다. __init__()을 구현하면, 우리는 클래스() 로 호출해서 사용하는 것이죠.
한편, __init__() 도 클래스의 메쏘드이기 때문에 self 매개 변수는 반드시 있어야 합니다. 추가적인 매개 변수는 self 뒤에 콤마(,)로 구분해서 열거하면 됩니다. 다음 코드의 NameCard 클래스를 보면 이해가 금방 갈 겁니다.
>>> class NameCard : name = "" cp_number = "" def __init__(self, name, cp_number) : self.name = name self.cp_number = cp_number >>> sean = NameCard( "Sean", "010-5555-7777" ) >>> sean.name 'Sean' >>> sean.cp_number '010-5555-7777'
자, 이렇게 해서 간단한 클래스를 만드는 데까지 공부를 했습니다. 본격적인 객체 지향 프로그래밍을 위해서는 상속이나 오버로딩, 오버라이딩에 대해 공부를 해야 하는데, 벌써 여기까지 오는 데도 상당한 시간이 걸렸습니다. 앞으로 지금처럼 일기 형식으로 글을 남길지는 고민입니다. 파이썬 일기는 온라인 문서만으로 공부했을 때 어느 정도 시간이 걸리는지, 얼마나 스트레스를 덜 받으면서 새 언어를 익힐 수 있는지를 보고자 하는 개인적인 실험이었습니다.
실험의 중간 결과를 말씀드리자면, 온라인 문서만으로는 제대로 공부하는 것은 어렵다는 판단이 섰습니다. 이런 식으로는 제 스스로 공부하는 데에도 어려움이 있고 의미 있는 문서를 남기고자 하는 취지도 살리질 못할 것 같습니다(그래서 #6 파이썬 일기부터는 일기 형식이 아닌 강좌 형식을 취했습니다.).
뭔가 더 좋은 방법을 찾아봐야겠습니다. 방법이... 있겠죠? ^^;
'Python' 카테고리의 다른 글
| [파이썬 일기] #7. 클래스로 나만의 자료형 만들기 (0) | 2009/07/12 |
|---|---|
| [파이썬 일기] #6. 함수로 코드 간추리기 (0) | 2009/06/25 |
| [파이썬 일기] #5.4. continue와 break (0) | 2009/06/09 |
| [파이썬 일기] #5.2. for문, #5.3 while 문 (0) | 2009/06/02 |
| [파이썬 일기] #5. 프로그램 흐름 제어하기 (0) | 2009/05/31 |
| 파이썬 공부 중간 점검. (0) | 2009/05/22 |

댓글을 달아 주세요