클래스: 객체를 표현하기 위한 문법(프로그래밍으로 객체 만들때 사용)
객체: 특정한 개념이나 모양으로 존재하는 것
객체지향 프로그래밍: 복잡한 문제를 잘게 나누어 객체로 만들고, 객체를 조합해서 문제를 해결
파이썬에서 숫자, 문자, 리스트 등은 객체
클래스 생성
class 클래스이름:
def 메서드(self):
(들여쓰기) 코드
! 메서드의 첫 번째 매개변수는 반드시 self를 지정
클래스 사용
인스턴스 = 클래스()
메서드 호출
인스턴스.메서드()
빈 클래스
class Person:
pass
예
>>> class Person:
... def greeting(self):
... print('Hello')
...
>>> james = Person()
>>> james.greeting()
Hello
객체만 지칭할 때는 그냥 객체(object)
클래스와 연관지어서 말할 때는 인스턴스(instance)
! 메서드 안에서 메서드 호출 :
self.메서드()
self 없으면 클래스 바깥 함수 호출한다고 여김.
예
class Person:
def greeting(self):
print('Hello')
def hello(self):
self.greeting() # self.메서드() 형식으로 클래스 안의 메서드를 호출
james = Person()
james.hello() # Hello
속성만들기
class 클래스이름: def __ init __ (self): self.속성 = 값
예시
class Person:
def __init__(self):
self.hello = '안녕하세요.'
def greeting(self):
print(self.hello)
james = Person()
james.greeting() # 안녕하세요.
init 메서드는 james = Person()처럼 클래스에 ( )(괄호)를 붙여서 인스턴스를 만들 때 호출되는 특별한 메서드. init (initialize)이라는 이름 그대로 인스턴스(객체)를 초기화합니다.
앞뒤에 언더바 붙은 메서드: 파이썬이 자동으로 호출해주는 메서드 - 스페셜 메서드(special method) 또는 매직 메서드(magic method)
greeting 메서드에서는 print로 self.hello를 출력하도록
-> init 메서드에서 속성을 만들고 greeting 메서드에서 속성을 사용
속성은 init 메서드에서 만든다는 점과 self에 .(점)을 붙인 뒤 값을 할당한다는 점이 중요
self는 인스턴스 자기 자신을 의미
class 클래스이름: def __init__(self, 매개변수1, 매개변수2): self.속성1 = 매개변수1 self.속성2 = 매개변수2
예시
class Person:
def __init__(self, name, age, address):
self.hello = '안녕하세요.'
self.name = name
self.age = age
self.address = address
def greeting(self):
print('{0} 저는 {1}입니다.'.format(self.hello, self.name))
maria = Person('마리아', 20, '서울시 서초구 반포동')
maria.greeting() # 안녕하세요. 저는 마리아입니다.
print('이름:', maria.name) # 마리아
print('나이:', maria.age) # 20
print('주소:', maria.address) # 서울시 서초구 반포동
위 예시에서 속성들은 메서드에서 self로 접근할 수 있고, 인스턴스.속성 형식으로 클래스 바깥에서도 접근 가능.
비공개 속성(private attribute): 클래스 바깥에서는 접근할 수 없고 클래스 안에서만 사용 가능. 비공개 속성은 속성과 같이 이름이 (밑줄 두 개)로 시작(한쪽만)
class 클래스이름: def __init__(self, 매개변수) self.__속성 = 값
예: Person 클래스에 지갑 속성 __wallet 넣기
class Person:
def __init__(self, name, age, address, wallet):
self.name = name
self.age = age
self.address = address
self.__wallet = wallet # 변수 앞에 __를 붙여서 비공개 속성으로 만듦
maria = Person('마리아', 20, '서울시 서초구 반포동', 10000)
maria.__wallet -= 10000 # 클래스 바깥에서 비공개 속성에 접근하면 에러가 발생함
class Person:
def __init__(self, name, age, address, wallet):
self.name = name
self.age = age
self.address = address
self.__wallet = wallet # 변수 앞에 __를 붙여서 비공개 속성으로 만듦
def pay(self, amount):
self.__wallet -= amount # 비공개 속성은 클래스 안의 메서드에서만 접근할 수 있음
print('이제 {0}원 남았네요.'.format(self.__wallet))
maria = Person('마리아', 20, '서울시 서초구 반포동', 10000)
maria.pay(3000)
메서드도 언더바 두개로 이름이 시작하면 클래스 안에서만 호출 가능한 비공개 메서드.
표준 입력으로 게임 캐릭터 능력치(체력, 마나, AP)가 입력됩니다. 다음 소스 코드에서 애니(Annie) 클래스를 작성하여 티버(tibbers) 스킬의 피해량이 출력되게 만드세요. 티버의 피해량은 AP * 0.65 + 400이며 AP(Ability Power, 주문력)는 마법 능력치를 뜻합니다.
class Annie:
def __init__(self, health, mana, ability_power):
self.health = health
self.mana = mana
self.ability_power = ability_power
def tibbers(self):
print("티버: 피해량",self.ability_power * 0.65 + 400)
health, mana, ability_power = map(float, input().split())
x = Annie(health=health, mana=mana, ability_power=ability_power)
x.tibbers()