<class> => 객체지향 프로그래밍에서 중요한 개념이므로 꼭 알아둬야함 - 객체를 정의하기 위한 구조체 - 클래스는 객체의 상태를 나타내는 속성(attribute)와 객체의 행동을 나타내는 메소드(method)를 가짐 - 클래스의 속성 : 클래스 내부에 정의된 변수를 뜻하고 객체의 상태를 저장객체.속성 - 클래스의 메소드 : 클래스 내부에 정의된 함수를 뜻하고 객체의 행동을 정의함객체.메소드([매개변수,..] - 멤버변수 : 클래스 내에서 정의된 변수를 뜻하고 self.와 함께 사용! 클래스의 모든 인스턴스(객체)들이 공유하는 변수 - 클래스를 이용하여 생성된 객체 : 인스턴스
<__init__> 메소드 - 클래스의 생성자(constructor)로, 객체가 생성될 때 자동호출 - 클래스 객체를 초기화하는 역할 : 해당 인스턴스가 가질 속성들을 정의하고 초기값을 설정해줌 - __init__메소드의 첫 번째 인자로 항상 'self'를 받음. 이를 통해 인스턴스 속성에 접근하거나 수정 가능 *self는 객체 자신을 나타내는 참조 변수임 self를 사용하여 클래스의 속성에 접근하고 값을 할당할 수 있음 - 객체 생성 시 이 생성자의 전달값에 해당하는 갯수만큼의 값을 전달해줘야함
# 간단 개념
class클래스이름([상속할 클래스]):
def__init__(self[,매개변수, ...]):
# 속성 초기화
self.속성1=값1
self.속성2=값2
...
def메서드1(self[,매개변수, ...]):
# 메서드 구현
...
def메서드2(self[,매개변수, ...]):
# 메서드 구현
...
...
classPerson: #클래스 이름은 대문자로 시작해야한다.
def__init__(self,name,age):
self.name=name
self.age=age
defintroduce(self): #이 메소드는 self를 인자로 받음(객체 자기자신)
print(f"Hello, my name is{self.name}. I'm{self.age}years old.")
person1=Person("Alice",25)
person1.introduce() # Hello, my name is Alice. I'm 25 years old.
# wraith2에만 클래스 외부에서 직접 변수 정의했기 때문에 wraith1에 위의 조건문을 넣으면 에러가 발생함
classAttackUnit: # 공격 유닛
def__init__(self,name,hp,damage):
self.name=name
self.hp=hp
self.damage=damage
defattack(self,location): # 전달 받은 방향으로 공격, 공격방향을 전달받을 때마다 달라질 수 있어서 self.없이 사용
print("{0}:{1}방향으로 적군을 공격 합니다. [공격력{2}]".format(
self.name,location,self.damage))
defdamaged(self,damage): # damage 만큼 유닛 피해
print("{0}:{1}데미지를 입었습니다.".format(self.name,damage)) # 데미지 정보 출력
self.hp-=damage# 유닛의 체력에서 전달받은 damage 만큼 감소
print("{0}: 현재 체력은{1}입니다.".format(self.name,self.hp)) # 남은 체력 출력
ifself.hp<=0: # 남은 체력이 0 이하이면?
print("{0}: 파괴되었습니다.".format(self.name)) # 유닛 파괴 처리
firebat1=AttackUnit("파이어뱃",50,16) # 체력 50, 공격력 16
firebat1.attack("5시") # 5시 방향으로 공격 명령
# 공격 2번 받는다고 가정
firebat1.damaged(25) # 남은 체력 25
firebat1.damaged(25) # 남은 채력 0
<메소드> - 클래스 내부에 정의된 함수 - 클래스의 객체를 통해 메소드 호출되며 객체 내부에 저장된 데이터를 조작할 때 사용 - 객체의 데이터를 다루는 역할을 하고, 객체의 속성에 접근할 수 있는 'self'파라미터를 첫 번째 매개변수로 받음 - 객체 내 속성에 접근할 때 'self.속성이름' 으로 접근 -캡슐화, 추상화와 연관성 (1)캡슐화는 객체 내부 상태를 외부에서 직접 접근하지 못하게 보호하고, 메소드를 통해서만 접근하도록 하는 것 캡슐화는 클래스 내부 구조를 숨기고, 외부 사용자가 클래스의 속성을 손상시키는 일을 방지 (2)추상화는 객체들의 공통 속성과 동작을 추출해 하나의 개념으로 표현하는 과정. 객체를 간결하게 표현하고 객체 간의 관계를 명확하게 파악하여 코드의 가독성과 유지보수성을 높일 수 있다. 메소드는 추상화 과정에서 객체가 수행하는 특정 동작을 표현할 때 중요한 역할을 한다. 메소드를 사용하여 객체의 동작을 추상화하면, 객체외부에서는 동작 수행을 위해서 해당 메소드를 호출하기만 하면 되기 때문에 객체를 사용할 때 내부 구현 방식에 대한 복잡성을 숨길 수 있다
<상속(inheritance)> - 부모 클래스(기초 클래스)를 자식클래스(파생 클래스)가 물려받아 재사용하여 새로운 클래스를 만드는 것 - 자식 클래스는 부모 크래스의 속성과 메서드를 모두 상속받아 추가적인 속성,메소드 정의가능 -> 코드 재사용성 증가
classUnit:
def__init__(self,name,hp):
self.name=name# 멤버변수
self.hp=hp# 멤버변수
classAttackUnit(Unit): # 공격 유닛
def__init__(self,name,hp,damage):
Unit.__init__(self,name,hp)#부모 클래스의 생성자를 호출하여 부모 클래스의 멤버 변수를 초기화
self.damage=damage
defattack(self,location): # 전달 받은 방향으로 공격, 공격방향을 전달받을 때마다 달라질 수 있어서 self.없이 사용
print("{0}:{1}방향으로 적군을 공격 합니다. [공격력{2}]".format(
self.name,location,self.damage))
defdamaged(self,damage): # damage 만큼 유닛 피해
print("{0}:{1}데미지를 입었습니다.".format(self.name,damage)) # 데미지 정보 출력
self.hp-=damage# 유닛의 체력에서 전달받은 damage 만큼 감소
print("{0}: 현재 체력은{1}입니다.".format(self.name,self.hp)) # 남은 체력 출력
ifself.hp<=0: # 남은 체력이 0 이하이면?
print("{0}: 파괴되었습니다.".format(self.name)) # 유닛 파괴 처리
firebat1=AttackUnit("파이어뱃",50,16) # 체력 50, 공격력 16
firebat1.attack("5시") # 5시 방향으로 공격 명령
# 공격 2번 받는다고 가정
firebat1.damaged(25) # 남은 체력 25
firebat1.damaged(25) # 남은 채력 0
Unit클래스와 AttackUnit클래스의 중복되는 부분을 Unit에만 정의하고 AttackUnit클래스에서 상속받아 사용하게 하면 중복 코드 방지하며 변경이 필요할 때도 작업을 줄일 수 있다. Unit.__init__(self,name,hp) #부모 클래스의 생성자를 호출하여 부모 클래스의 멤버 변수를 초기화
위의 코드도 왜 self를 적었는 지 잘 알아두자
<다중상속(multiple inheritance)> - 둘 이상의 부모 클래스를 상속받는 것 - 파이썬에서 다중 상속은 쉼표(,)로 구분하여 상속받을 수 있다. - 부모 클래스들의 속성과 메소드를 모두 상속받음 -> 각 부모 클래스들의 속성,메소드끼리 충돌할 경우 어떤 것을 우선 사용할 지 지정해줘야함
classAttackUnit(Unit): # 공격 유닛
def__init__(self,name,hp,damage):
Unit.__init__(self,name,hp) # 부모클래스의 생성자 ㅎ호출
self.damage=damage ... 메소드 생략 ..
# 날 수 있는 기능을 가진 클래스
classFlyable:
def__init__(self,flying_speed):# 공중 이동 속도
self.flying_speed=flying_speed
deffly(self,name,location):# 유닛 이름, 이동 방향
print("{0}:{1}방향으로 날아갑니다. [속도{2}]"\
.format(name,location,self.flying_speed))
# 공중 공격 유닛, 다중 상속 받음
classFlyableAttackUnit(AttackUnit,Flyable):
def__init__(self,name,hp,damage,flying_speed):# 이름, 체력, 공격력, 공중 이동 속도