시작부터 쉽지 않은 내용이었다....
뭔가 이해하는 듯 하면서도 뭔가 두리뭉실했던 내용들...
스타크레프트 라는 희대의 강의를 들으면서도..
응?? 이게 이렇게 된다고?? 어?? 뭐가 이렇게 된거지??
라는 생각이 자꾸 들게 만들던....
그래서 아직까지 명확하지 않다....
내가 이해한 내용을 기준으로 작성해보겠다......그래서 조금 틀릴 수도 있다 ㅋㅋ
실제 7일차의 내용은 class와 class 내의 함수들,
해당 코딩을 어떻게하면 좀 더 유연하게, 확장성 있게 사용 할 수 있는가가 주된 내용이다.
스타크레프트를 기준으로 강의를 해주신 부분에 대해 가장 좋았던 부분은
나도코딩님이 만드는 과정이나 방법에 대해서는 몰랐지만,
최종적인 결과 값에 대해 내가 알고 있다는 것이었고
그래서 이런 코드를 왜 사용하는지 좀 더 실질적으로 다가왔다.
7일차는 내용이 길어질 것 같아서 분할 해서 올리도록 하겠다.
: [나도코딩] 님 - 붕어빵 틀을 통해 똑같이 찍어낼 수 있는 형태
: 같은 성질(Methods-매서드)을 가진 객체를 생성하는 방법
-> Methods-매서드 : Class 내 정의된 함수의 모음 정도로 이해했다.
마린(공격 유닛, 군인, 총을 쏠 수 있음), 체력(hp) = 40, 공격력(damage)=5 인 유닛을 만드는 방법
마린 생산 방법 1.
name = "마린" # 유닛의 이름
hp = 40 # 유닛의 체력
damage = 5 # 유닛의 공격력
print("{0} 유닛이 생성되었습니다." .format(name))
print("체력 {0}, 공격력 {1}\n" .format(hp, damage))
''' 결과 값
마린 유닛이 생성되었습니다.
체력 40, 공격력 5
'''
앞에서 배운 것 처럼, 우리는 변수를 선언하고 해당 유닛을 생성 할 수 있었다.
이와 같은 방법으로 시즈탱크 및 다른 유닛들도 생성할 수 있다.
탱크 생산 방법 1.
tank_name = "탱크" # 유닛의 이름
tank_hp = 150 # 유닛의 체력
tank_damage = 35 # 유닛의 공격력
print("{0} 유닛이 생성되었습니다." .format(tank_name))
print("체력 {0}, 공격력 {1}\n" .format(tank_hp, tank_damage))
''' 결과 값
탱크 유닛이 생성되었습니다.
체력 150, 공격력 35
'''
생산한 유닛들로 공격을 할 수 있는데, 공격에 대한 함수를 정의하면
name = "마린" # 유닛의 이름
tank_name = "탱크" # 유닛의 이름
def attack(name, location, damage):
print("{0} : {1} 방향으로 적군을 공격합니다. [공격력 {2}]" .format(name, location, damage))
attack(name, "1시", damage)
attack(tank_name, "1시", tank_damage)
'''결과 값
마린 : 1시 방향으로 적군을 공격합니다. [공격력 5]
탱크 : 1시 방향으로 적군을 공격합니다. [공격력 35]
'''
위와 같이 텍스트 형태의 결과를 만들어 낼 수 있다.
하지만 게임을 진행하며 유닛을 생산하는 수와 종류는 점점 증가하고 해당 방법으로 코딩을 작성하기에는 번거로움이 있다.(물론 생산은 가능하다.)
이러한 경우, 좀 더 효율적으로 생산하기 위해 class를 사용하며, 나도코딩 님의 표현으로 붕어빵틀을 통해 같은 붕어 빵을 쉽게 만들 수 있다.
클래스를 통해 여러개의 동일한 객체를 쉽게 생성할 수 있는데, 여기서 클래스를 통해 만들어지는 것을 객체( 또는 instance )라고 한다. 객체와 instance 간의 차이가 있는지 알아내지 못했으나, 강의를 들으며 동일하게 생각하여도 크게 문제되지 않았다.
유닛(마린, 탱크 등) class 를 통한 생성방법 2 / 대량 생산 가능
## class (클래스) 사용방법
class Unit: # 대소문자 구분하여 사용? 업무 노하우?
def __init__(self, name, hp, damage):
self.name = name
self.hp = hp
self.damage =damage
print("{0} 유닛이 생성되었습니다." .format(self.name))
print("체력 {0}, 공격력 {1}\n" .format(self.hp, self.damage))
marine1 = Unit("마린", 40, 5)
marine2 = Unit("마린", 40, 5)
tank = Unit("탱크", 150, 35)
''' 결과 값
마린 유닛이 생성되었습니다.
체력 40, 공격력 5
마린 유닛이 생성되었습니다.
체력 40, 공격력 5
탱크 유닛이 생성되었습니다.
체력 150, 공격력 35
'''
- 먼저 class 이름을 먼저 정의한다.(실습 간 나도코딩님은 class 이름의 첫글자만 대문자를 사용한다. class 나 함수 등 에서 대소문자를 구분하는데, 노하우에 의한 표기 방법인 것 같다. 실제 객체 생성 시, 예제 class 명칭과 다르게 소문자를 사용하게 되면(class 명칭 : Unit / 호출된 class 명칭 : unit) 오류가 발생한다.
* marine1 = unit("마린", 40, 5) [ NameError: name 'unit' is not defined ]
- class 선언 후, 필요로 하는 함수들을 구성하며, __init__ 과 필요로 하는 파라미터 값들을 정의하는데, __init__ 로 작성된 함수는 함수 이름이 아닌 class 이름으로 호출 시 동작한다. 호출시 생략 가능
* Unit("마린", 40, 5) 을 호출 시 동작하는 Unit Class 의 함수는 def __init__(self, name, hp, damage) 이다.
- class 내의 함수(매서드)에는 항상 가장 먼저 self 를 넣어주어야 한다.
- 아래와 같이 marine3을 다시 추가 할 때, 선언된 변수의 갯수가 다르면 생성되지 않는다. 단, 함수에서 기본값이 설정 되어 있을 경우는 정상적으로 생성되었다.
marine3 = Unit("마린")
marine3 = Unit("마린", 40)
# 등 __init 함수에 정의된 self를 제외한 객체 수만큼의
# 파라미터가 전달되어야 정상적으로 생성됨.
marine3 = Unit("마린") # class 생성 시 , 기본 값을 부여할 경우에는 기본값 적용됨
# ex) def __init__(self, name, hp=40, damage=5):
# 멤버 변수
: class 내의 self. * 형태로 표기되는 변수들을 가르키며, 초기화 작업으로 받아들이면 될 것 같다.
추가로 레이스를 생산하게 되면
# 레이스 : 공중 유닛, 비행기, 클로킹(상대방에게 보이지 않음)
wraith1 = Unit("레이스", 80, 5)
print("유닛 이름 : {0}, 공격력 : {1}".format(wraith1.name, wraith1.damage))
해당 유닛 외 상대방의 유닛(클로킹 업그레이드가 된 레이스)를 가져온다고 가정하면,
wraith2 = Unit("빼앗은 레이스", 80, 5)
wraith2.clocking = True # 해당 형태로 외부에서 class 에 없는 clocking 이라는 변수를 추가로 할당 가능함.
으로 동일하게 생산이 가능하다.
여기서 가장 중요한 부분은 wraith2.clocking = True 부분으로 class 에 정의 되지 않았지만 외부에서 추가로 정의 가능하며, 해당 내용은 class(붕어빵 틀)을 통해 만들어진 항목이 아니므로, wraith1 과 2는 결과 값이 차이가 난다.
print(wraith1.clocking)
# 결과 값 : Error / AttributeError: 'Unit' object has no attribute 'clocking'
print(wraith2.clocking)
# 결과 값 : True
class Unit:
def __init__(self, name, hp, damage):
self.name = name
self.hp = hp
self.damage =damage
print("{0} 유닛이 생성되었습니다." .format(self.name))
print("체력 {0}, 공격력 {1}\n" .format(self.hp, self.damage))
wraith2 = Unit("빼앗은 레이스", 80, 5)
wraith2.clocking = True # 해당 형태로 외부에서 class 에 없는 clocking 이라는 변수를 추가로 할당 가능함.
if wraith2.clocking == True:
print ("{0} 는 현재 클로킹 상태입니다." .format(wraith2.name, wraith2.damage))
# 결과 값 : 빼앗은 레이스 는 현재 클로킹 상태입니다.
여기까지의 실제 코딩
class Unit: # 대소문자 구분함
def __init__(self, name, hp, damage):
self.name = name
self.hp = hp
self.damage =damage
print("{0} 유닛이 생성되었습니다." .format(self.name))
print("체력 {0}, 공격력 {1}\n" .format(self.hp, self.damage))
marine1 = Unit("마린", 40, 5)
marine2 = Unit("마린", 40, 5)
tank = Unit("탱크", 150, 35)
wraith1 = Unit("레이스", 80, 5)
print("유닛 이름 : {0}, 공격력 : {1}".format(wraith1.name, wraith1.damage))
wraith2 = Unit("빼앗은 레이스", 80, 5)
wraith2.clocking = True
if wraith2.clocking == True:
print ("{0} 는 현재 클로킹 상태입니다." .format(wraith2.name, wraith2.damage))
유튜버 '나도코딩' 님의 영상을 보며 공부 및 노트 작성합니다.
함께 공부해 나가실 분은
[Python 파이썬 독학 7-3일차] (0) | 2020.09.30 |
---|---|
[Python 파이썬 독학 7-2일차] (0) | 2020.09.28 |
[Python 파이썬 독학 자가 점검] (0) | 2020.09.26 |
[Python 파이썬 독학 6일차] (0) | 2020.09.25 |
[Python 파이썬 독학 5일차] (0) | 2020.09.23 |
댓글 영역