python

class 적응하기 2

코드모헨 2024. 1. 30. 18:24

자 지난번 Class 적응하기 1 에서 이어나가고자 한다. 

https://code-lib.tistory.com/8

 

class 적응하기 1

처음 프로그래밍을 시작한 학생에게 class는 왜 쓰는가에 대한 고민이 있을것이다. 초보가 혼자서 코드를 만들 땐 생각보다 class는 안쓰고 전부 하드 코딩과 함수로만 만드는 경향이 있다. 많은

code-lib.tistory.com

 


이전 글 요약

 

Class파이어뱃을 만들면 될까?

똑같이 class를 만들면 되지라고 생각할 것 이다.

그런데 마린이랑 파이어뱃의 차이가 뭘까?

위에서는 체력, 공격력, 방어력만 정의 했지만 실제에선 소형인지 중형인지 아니면 대형인지? 도트는 어떻게 되있는지, 목소리는? 생산될때 속도는? 전부 다르게 정의 할것이다.

하지만 움직이는것은 마린이랑 같다.

다른것도 할게 많은데 귀찮은 개발자가 또 움직임을 정의 할까?

 


 

 

우린 마린, 파이어벳같은 것들을 유닛(Unit)이라고 부른다.

 

아 그러면 유닛을 통해 공통된 부분을 만들고 그 공통된 부분을 각자 클래스에서 가져와서 써보면 어떨까?

 

마린과 파이어뱃의 공통점중 대표되는 1가지를 가져와 보자 바로 스팀팩 스킬이다!

class Unit:
    skill = "steam pack"


class Marine(Unit):
    marine_hp = 40
    marine_attack = 5
    marine_armor = 0


class Firebat(Unit):
    marine_hp = 40
    marine_attack = 16
    marine_armor = 0

m1 = Marine()
f1 = Firebat()
print(f"marine has a skill {m1.skill}")
print(f"firebat has a skill {f1.skill}")


#결과
marine has a skillsteam pack
firebat has a skill steam pack

 

멋지다. 우린 마린과 파이어벳에게 스킬 스팀팩을 각자 구현하지 않고 만들었다.

이것을 바로 상속(Inheritance) 이라고 부른다.

 

이 상속은 객체지향 언어의 핵심 중 하나이며 반드시 숙지해야한다!


 

 근데 막상 만들고 보니 뭔가 아쉽다.

마린이랑 파이어뱃이 생산되어도 아무말도 안한다.

마음이 아프다. 

 

이 친구들이 말을 할 수 있게 해보자

 

객체(여기선 마린)가 생산되면 저절로 대사를 하게끔 만들고 싶다

m2 = Marine()
print("You wanna piece of me, boy?")

 

일일이 이렇게 만드는건 미친짓이다. class를 조금도 이해하지 못했다.

그럼?

class Marine(Unit):
    marine_hp = 40
    marine_attack = 5
    marine_armor = 0
    print("You wanna piece of me, boy?")

이렇게 하면 어떨까?

m2 = Marine()
m3 = Marine()
m4 = Marine()

# 결과 
You wanna piece of me, boy?

응? 마린을 3마리나 만들었는데 한명만 말하고 뒤에 두명은 말을 안한다.

 

사실 저건 마린이 만들어질 때가 아니라 class Marine이 컴파일 될때 나온것이다.

그럼 우린 어떻게 instance가 생성될 때마다 말을 하게 할 수 있을까?

 

이건 생성자(Constructor)가 이 역할을 해준다!!

class Marine(Unit):
    marine_hp = 40
    marine_attack = 5
    marine_armor = 0

    def __init__(self):
        print("You wanna piece of me, boy?")
        
        
m2 = Marine()
m3 = Marine()
m4 = Marine()

#결과
You wanna piece of me, boy?
You wanna piece of me, boy?
You wanna piece of me, boy?

 

자 이제 마린들이 나올때 대사를 하며 나온다 여간 기합이 아니다!!!

생성자는 def __init__(self): 라는 매직매서드를 통해 class 내부에서 만들어 진다

생성자의 역할은 이 클래스를 통해 새로운 instance가 만들어질 때 작동한다! 

 

생성이 있으면 소멸도 있는법

 

소멸자(Destructor)

소멸자는 무슨 역할일까?

간단하다 인스턴스가 더 이상 쓸필요가 없어 가비지컬렉터 혹은 수동으로 인스턴스를 메모리에서 제거할때 자동으로 작동된다.

소멸자는 def __del__(self):라는 매직매서드를 통해 class내부에서 만들어진다.!!

생성자의 반대답다.

 

class Marine(Unit):
    marine_hp = 40
    marine_attack = 5
    marine_armor = 0

    def __init__(self):
        print("You wanna piece of me, boy?")

    def __del__(self):
        print("따흐아아ㅏㅇ")

m2 = Marine()
del m2

#결과
You wanna piece of me, boy?
따흐아아ㅏㅇ

자 del 명령을 통해 인스턴스를 삭제하니 저절로 소멸자가 실행되었다!

 

주의! 만약 파이참이나 vscode같은 python 코드를 바로 실행 할수있는 ide 혹은 텍스트 에디터에서 del을 사용하지 않아도 소멸자가 작동하는 것을 볼 수 있다. 이는 각 실행기가 코드를 전부 실행하면 저절로 가비지 컬렉터(GC, Garbage collector)가 작동하면서 인스턴스를 소멸시키기 때문이다!

 

자 우리는 이렇게 마린에게 스킬을 주고 또 생성될때 죽을때 소리가 나오게끔 만들었다.

 

하지만? 또 의문점이 든다.

스팀팩은 업그레이드가 필요한데? 스팀팩을 위해서는 아카데미가 필요한데?

 

이 문제는 다음글에서 알아보자

'python' 카테고리의 다른 글

[FastAPI] restapi를 위한 코드 순서  (0) 2024.09.26
poetry add 혹은 pipenv install 무한로딩  (0) 2024.05.08
class 적응하기 1  (0) 2024.01.30
Class method vs Static method in python  (2) 2024.01.03
동기(sync)&비동기(async)  (2) 2023.12.22