클래스(class)는 뭘까? 우리가 게임을 처음 시작할 때 일단 캐릭터를 생성해야 게임을 플레이할 수 있다. 근데 캐릭터를 생성할 때마다 일일이 캐릭터를 프로그래밍하진 않을 것이다. 거푸집 같은 틀만 있다면 필요할 때마다 손쉽게 캐릭터를 생성할 수 있을 것이다. 여기서 말하는 거푸집이 바로 "클래스"가 되시겠다. 아래의 코드를 살펴보자.
class Character : #클래스 선언
def __init__(self, name, job):
self.name = name
self.job = job
def check(self): #캐릭터 정보 입력 확인하는 메소드
print("닉네임 : {0}, 직업 : {1}".format(self.name, self.job))
a = Character('지존도둑', '도적') # a 캐릭터 생성(객체 a)
b = Character('최강검사', '전사') # b 캐릭터 생성(객체 b)
a.check() # a 캐릭터 정보 확인
b.check() # b 캐릭터 정보 확인

이렇게 Character 클래스를 선언한 후, 그곳에 캐릭터를 생성할 때 필요한 공통 함수와 변수를 만든다. 그리고 위 코드와 같이 "(객체 이름) = Charachter()" 와 같이 캐릭터를 거푸집으로 찍어내 주면 된다. 여기서 객체 a와 b는 고유한 성격을 가진다. 다시 말해, 하나의 클래스에서 만들어진 객체들은 서로에게 아무런 영향을 끼치지 못한다는 말이다.
위 코드로 설명하자면, "(a, b)객체"라는 것은 (Character)클래스라는 거푸집으로 찍어낸 "결과물"이고, (a, b)객체는(Character)클래스의 인스턴스"라고 말한다. 그리고 (Character)클래스 안에 있는 (check)함수같은 것들을 "메소드"라고 한다. a = Character('지존 도둑', '도적') 과 같이 거푸집(클래스)으로 캐릭터를 생성해서 a라는 객체에 넣은 것이고, 그 클래스는 check 함수(메소드)를 가지고 있으니까 a.check()와 같이 함수처럼 사용이 가능하다. 그리고 첫 번째 메소드의 첫 번째 인자 ' self '는 check 메소드를 호출한 객체 a와 b가 자동으로 전달된다. 객체를 호출하면 호출된 객체 자신이 전달되는 것이기 때문에 self라는 이름을 관례적으로 사용한다.
또한, 다른 메소드를 수행하기 전에 미리 name이나 job 같은 초깃값을 설정해야 한다면 생성자를 구현하는 것이 더 좋다. 여기서 __init__이라는 메소드가 생성자이다. 생성자는 클래스로 찍어냈을 때 무조건 처음으로 수행되고 이 생성자를 사용하면 정해진 기능을 수행한다. 다시 말해, 클래스를 생성하고 캐릭터를 찍어냈을 때 __init__메소드를 실행하면서 시작된다는 것이다.
더 나아가, 클래스의 "상속" 이란 것도 있다. 단어에서 느낌이 올 것이다. 만약 게임에서 이벤트 기간동안 같은 캐릭터 대비 얻는 경험치를 5배 증폭시켜주는 캐릭터를 생성한다고 해보자. 어차피 캐릭터의 큰 틀은 같은 것 아닌가? 닉네임도 생성해야 하고, 직업도 있을 것이다. 그러면 이미 만들어 놓은 저 클래스에 경험치 5배 옵션만 추가하면 참 편할 것 같은 생각이 든다. 이때 상속을 하면 된다. 그럼 상속은 어떻게 하냐? 매우 간단하다.
class Character :
def __init__(self, name, job):
self.name = name
self.job = job
def check(self):
print("닉네임 : {0}, 직업 : {1}".format(self.name, self.job))
#a = Character('지존도둑', '도적')
#b = Character('최강검사', '전사')
#a.check()
#b.check()
class HotCharacter(Character): #Character 클래스의 기능들을 상속받음
def exp(self, exp):
exp *= 5 #경험치 5배
print("기본 캐릭터 대비 얻은 경험치: %d" % exp)
c = HotCharacter('논스톱사냥', '마법사')
c.check()
c.exp(100)

class 클래스 이름(상속받으려고 하는 클래스) 처럼 쓰면 끝이다. 원래의 Character 클래스의 기능을 가져오고 싶은 것이니 괄호 안에 Character 클래스를 넣은 것이고 그 밑에다 추가하고 싶은 메소드를 입력한 것이다. 아까와 마찬가지로 c라는 캐릭터를 생성하고 check() 메소드를 호출해보면 Character 클래스에 있었던 메소드를 그대로 활용 가능하고 상속받은 클래스에서 exp() 메소드를 호출해보면 만일 경험치가 100인 몬스터를 처치했을 경우 c 캐릭터는 500만큼 얻은 것을 확인할 수 있다. 이처럼 상속받은 클래스의 기능을 모두 사용할 수 있다.
원래 있던 클래스에 있는 메소드를 동일한 이름으로 다시 작성해서 자식 클래스(상속받은 클래스)에서 변형이 가능한데 이것을 "메소드 오버라이딩" 이라고 한다. 다만, 여기서 주의할 점은 오버라이딩을 하면 부모 클래스(상속한 클래스)의 메소드보다 자식 클래스의 오버라이딩한 메소드가 우선 실행된다는 점이다.
파이썬 프로그래밍에 관한 글은 "이지스퍼블리싱"의 "Do it!, 점프 투 파이썬"이라는 책을 학습하고 정리한 것입니다.
'Programming Language > Python' 카테고리의 다른 글
파이썬 - (패키지) (0) | 2023.07.18 |
---|---|
파이썬 - (모듈) (0) | 2023.07.14 |
파이썬 - (사용자 입출력 ~ 파일 읽고 쓰기) (0) | 2023.07.11 |
파이썬 - (함수) (0) | 2023.07.10 |
파이썬 - (반복문 中 for 문) (0) | 2023.07.10 |