Class의 개념을 파이썬 처음 공부할 때, 간단하게 지나가고 그 뒤로 어렴풋이 아는 개념으로 사용해했었다. 현업에 나와보니 개념 하나하나 정확하게 아는게 너무너무 중요하다는 것을 깨닫고.. 확실한 코드를 짜기 위해선 확실하게 개념을 다시 공부해야겠다는 생각이 들어 그렇게 다시 class를 공부하게 되었다.
Class
- 클래스 : 객체를 만들기 위한 설계도
- 객체 : 설계도로 부터 만들어 낸 제품
#클래스를 사용하지 않을 때
champion1_name = "이즈리얼"
champion1_health = 700
champion1_attack = 90
print(f"{champion1_name} 님 소환사의 협곡에 오신것을 환영합니다.")
champion2_name = "리신"
champion2_health = 800
champion2_attack = 90
print(f"{champion2_name} 님 소환사의 협곡에 오신것을 환영합니다.")
def basic_attack(name, attack):
print(f"{name} 기본공격 {attack}")
basic_attack(champion1_name, champion1_attack)
basic_attack(champion2_name, champion2_attack)
#클래스를 사용할 때
class Champion:
def __init__(self, name, health, attack):
self.name = name
self.health = health
self.attack = attack
print(f"{name}님 소환사의 협곡에 오신것을 환영합니다.")
def basic_attack(self):
print(f"{self.name} 기본공격 {self.attack}")
ezreal = Champion("이즈리얼", 700, 90)
leesin = Champion("리신", 800, 90)
ezreal.basic_attack()
leesin.basic_attack()
Class 사용하는 이유?
- 만약 위 코드에서 야스오가 추가되면, 클래스가 없는 경우는 하나하나 다 복사해야함
- class를 사용하면 yeasuo = Champion("야스오", 800, 90) 만 추가하면 되기 때문에 편리
- 즉, 클래스를 사용하면, 속도와 코드양 가독성에서 효율적
Class 구성요소 ?
- 속성 : 특징(변수)
- 메서드 : 동작(함수)
class 클래스 이름:
def 메서드 이름(self):
명령블록
Class __inti__ self,
class Moster:
def __init(self, health, attack, speed): 인스턴스를 만들 때 가장 먼저 호출되는 메서드
self.health = health
self.attack = attack
self.speed = speed
def decrease_health(self, num):
self.health -= num
gobling = Moster(100,10,4) #인스턴스 생성
Class 상속?
- 자식 클래스들의 공통된 메서드 및 속성들을 부모클래스로 합쳐서 코드의 중복성을 피하기 위함
class Moster:
def __init(self, health, attack, speed):
self.health = health
self.attack = attack
self.speed = speed
def move(self):
print("지상에서 이동")
def Wolf(Moster):
pass # 정의만 하고 싶을 때 pass 사용
def Shark(Moster): # init 생성 가능 Moster와 Init 공유
def move(self): # 메서드 오버라이딩 : 메서드 재정의
print("헤엄치기")
import random
class Moster:
max_num = 1000
def __init(self, health, attack, speed):
self.health = health
self.attack = attack
self.speed = speed
Monster.max_num -= 1
def move(self):
print("지상에서 이동")
def Wolf(Moster):
pass # 정의만 하고 싶을 때 pass 사용
def Shark(Moster): # init 생성 가능 Moster와 Init 공유
def move(self): # 메서드 오버라이딩 : 메서드 재정의
print("헤엄치기")
class Dragon(Moster):
#생성자 오버라이딩
def __init__(self, name, health, attack):
super().__init__(name, health, attck) # 부모 클래스의 init 함수 불러와서 호출할 수 있음
self.skills = ("불","꼬리","날개")
def move(self):
print("날기")
def skill(self):
print(f"스킬 사용했다 {self.skills[random.randint(0,2)}")
dragon = Dragon("드래곤", 800,80)
dragon.move()
dragon.skill()
Class 변수
- 인스턴스들이 모두 공유하는 변수 (클래스 모두 공유하는 변수)
- 만약 위 코드에서 wolf, shark 인스턴스를 생성해주고, wolf.max_num , shark.max_num 을 하나씩 호출해서 프린트한다면, -1씩 감소해서 출력 됨
Class Underscore
_ : single underscore
- 내부적으로 사용하고, 외부에서 호출되선 안되는 변수 or 메서드
- 호출이 안되진 않음
__ : double underscore # 외부에서 접근할 수 없음
- class __name # private class
- def __name # private 메서드
- __name # private 변수
__underscore__ # 특별한 변수 또는 함수에 사용
- 자세한건 참고 :https://corikachu.github.io/articles/python/python-magic-method