본문 바로가기

Programming/Python Tutorials

[PYTHON 3] Tutorials 27. Classes and Objects - 클래스, 객체


이번 시간에는 요즘 사용하는 프로그래밍 언어의 중심인 클래스와 객체에 대해 알아보고자 합니다. 현재 시장에서 사용하는 대부분의 언어가 객체 지향 프로그램(OOP: Objects Oriented program)이라고 해도 과언이 아닙니다. 물론 전부라고는 할 수 없으나 많은 언어에서 객체화를 지향하는 이유는 그만한 장점을 지니고 있기 떄문입니다. 앞서 다룬 함수 파트에서, 함수를 사용하는 이유 중 하나가 재사용성을 높이기 위해서라고 했습니다. 객체도 마찬가지입니다. 함수 + 함수 + 함수 를 하나의 클래스로 묶어놓고 이를 별개의 객체로 불러와 사용하면 코드를 수십, 수백, 수천 번 재사용할 수 있기 때문입니다. 잘 이해가 잘 안되신다면 아래의 코드를 예로 설명을 드리면 조금이나마 이해하는데 도움이 되리라 봅니다. 시작하겠습니다. 

흔히 클래스는 비슷한 기능을 하는 함수들을 모아 두었다고 생각하시면 됩니다. 가령, 사람이 있는데, 한 사람을 클래스라고 한다면, 이 사람은 팔이 있고, 다리가 있고, 움직이며, 호흡하며 등등.. 일련의 작동, 움직임이 모두 함수(메쏘드)라 할 수 있습니다. 이렇게 일련의 일들을 할 수 있는 함수들을 한데 묶어둔 것이 클래스(사람)입니다. 아래 예제를 볼까요.

클래스를 정의할 때 특징은,

1. 함수에서는 앞에 'def' 로 정의를 한 반면, 클래스는 'class' 로 정의를 합니다.

2. 클래스명의 첫 글자는 영문 대문자 이어야 한다는 점입니다.

'Enemy'라고 하는 클래스를 정의하였습니다.  RPG 게임을 한다고 할 때 적을 공격하여 죽여(!)야 할 경우가 생깁니다. 이를 가정하여 간략하게 진행해 보겠습니다.

이 'Enemy' 클래스는 초기 생명이 3개를 가지고 있습니다.

'Enemy' 클래스의 한 가지 능력은 적을 공격할 수 있는 'attack'입니다. 그래서 'attack' 함수를 정의해 줍니다. 여기서 'self'라는 값이 등장하는데, 다른 프로그래밍 언어와는 조금 다르게, 파이썬에서 함수내의 값에 접근을 할 때에는 self를 사용합니다. 예를 보시면 조금 이해하실 수 있을 겁니다. 

공격을 하였으니, 피해를 입었다는 단순 문구를 출력하였습니다. 그리고 죽었을테니(!!!) 생명력을 1 만큰 차감합니다. 이 때 class Enemy 내부 변수인 life에 접근을 하여 life 의 값을 대체해야 하므로 self.life 로 사용을 해야 합니다. 

이번에는 생명력이 얼마나 남아 있는지 확인하는 함수를 작성해 보도록 하겠습니다.

만약 class Enemy 안의 변수 life 값이 0 보다 작으면 완전히 죽었다는 문구를 출력해줍니다. 여기에서 조금 주의해야 할 부분이 있는데, self.life == 0 으로 하지 않고 self.life <= 0 으로 해주었다는 점입니다. 이는 만약 생명력이 1 남았는데, 게임 도중 큰 공격 가령 -2와 같은 공격을 받게 될 경우를 상정한다면 -1(음수)이 되어 조건이 성립 안 될 수 있습니다. 그래서 게임 제작자들은 조금 주의를 하여야 하는 부분 중 하나입니다.

생명력을 체크 해 봤는데 아직 0 이하가 아니라면 몇개의 생명력이 남아 있다는 문구를 출력해줍니다.

이제 클래스 정의를 간략하게나마 마쳤다면, 사용을 해봐야겠죠. 클래스를 사용하기 위해서는 Objects 라고 하는 객체를 생성해 주어야 합니다. 무슨 말이냐면, 클래스에 접속해서 클래스가 가지고 있는 능력을 고스란히 내려 받는다는 의미입니다. 쉽게말하면 접근 권한을 설정해 준다 정도 되겠네요. 여기에서는 enemy_1 이라고 하는 객체를 생성하였고, Enemy 클래스에 접근할 수 있게 해 주었습니다.

클래스에 접근할 수 있는 객체를 만들었으니, 이 객체가 능력을 발휘하도록 해야겠죠. 그래서 클래스의 능력(함수) 중 하나인 attack() 을 하게 하였습니다. enemy_1.attack()

그리고는 생명력이 얼마나 남아 있는지 확인하는 enemy_1.checkLife() 를 실행하였습니다.

위의 코드를 확인해 봐야겠죠. 아래와 같이 한번의 공격과 잔여 생명력 확인 결과 창이 출력이 되었습니다.

이번에는 2번의 공격과 생명력을 확인 해 보았습니다. 아래와 같이 결과가 나오네요.

그리고 객체는 서로 독립적입니다. 어떤 게임을 하는데 서로 다른 사용자들이 접속을 해서 게임을 할 것입니다. 그러나 게임내 캐릭터는 중복 될 수 있습니다. 한 캐릭터를 여러명이 사용할 수 있다는 의미죠. 여기서 한 캐릭터는 클래스가 될 것이며, 서로 다른 사용자들은 객체가 되는 것입니다. 한 클래스를 서로 다른 객체들이 접속해서 동일한 능력을 사용할 수 있다는 의미입니다. 그렇지만 객체(사용자)들 간에는 서로 독립적인 존재가 됩니다.

아래 그림과 같이 Enemy()클래스를 서로 다른 enemy_1, enemy_2, enemy_3 객체가 접속했다고 하겠습니다. 그리고 서로 다른 능력(함수)을 발휘하고 조회하고 하였습니다. 여기서 결과는 아래와 같이 각 객체마다 별개로 존재하게 됩니다.

동시접속으로 수십, 수백, 수천, 수만의 사람들이 한 게임을 한다면 모두 동일한 캐릭터를 운용할 수 있습니다. 어떻게 그럴 수 있을 까요? 네.. 바로 클래스에 접근한 객체를 활용하였기 때문입니다. 이 정도로 코드 재활용 측면에서 객체 지향 언어는 막강한 힘을 가지고 있다고 볼 수 있습니다. 이러한 이유로 현대의 거의 모든 언어들이 객체 지향 언어라고 불리는 이유이기도 합니다. 프로그램에서 클래스, 객체를 이해하셨다면 거의 8부 능선은 넘었다고 봐도 무방하다고 개인적으로 생각합니다. 그 이후는 어떻게 실용적인 목적에 부합하는 코드를 작성하느냐에 달렸다고 봅니다. 수고 하셨습니다.