클래스란 객체를 표현하기 위한 문법이다.
게임 케릭터를 예로 들면 전사, 궁수, 마법사 클래스가 있을것이다.
여기서 전사 클래스의 체력, 마나, 공격력, 주문력을 담당하는 설정은 클래스의 속성(attribute)이고,
전사 클래스가 하는 행위;(베기, 찌르기)는 메서드(method)라고 한다.
이렇게 프로그래밍 하는 방법을 객체지향(object oriented) 프로그래밍이라고 한다.
클래스 이름을 짓는 방법은 대문자로 시작하고,
메서드의 첫 매개변수는 self로 지정해야한다.
class 클래스이름:
def 메서드(self):
코드
클래스는 특정 개념만 표현할 뿐 사용하려면 인스턴스를 생성해야 한다.
인스턴스 = 클래스()
이러한 형태는 int, list, dict 등도 동일한데 이들도 클래스이다.
>>> a = int(10)
>>> a
10
>>> b = list(range(10))
>>> b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> c = dict(x=10, y=20)
>>> c
{'x': 10, 'y': 20}
둘 다 같은 것인데 상황에 따라 다르다.
상황은 object만 부르냐 혹은 클래스와 연관지어 부르냐에 따라 다르다.
a = list(range(10))
b = list(range(20))
위의 리스트에서 a, b는 객체다. 그리고 list 클래스의 인스턴스다.
class 클래스이름:
def __init__(self):
self.속성 = 값
__init__
method 안에 self.속성
에 값을 할당한다.
__init__
method는 인스턴스를 만들 때 자동으로 호출된다.
예시를 통해 __init__
메서드와 self
를 잘 봐보자
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) # 서울시 서초구 반포동
maria
가 Person
클래스의 객체로 지정과 동시에 속성값을 같이 보낸다. 이 때 __init__
메서드가 호출되어 maria를 구성한다.
self
는maria
가 들어간다.
후에 maria.greeting()
을 통해 maria
를 구성하는 Person
클래스에서 greeting
메서드를 호출한다.
__slots__
특정 속성만 허용하고 다른 속성을 제한하고 싶을 때 사용한다.
>>> class Person:
... __slots__ = ['name', 'age'] # name, age만 허용(다른 속성은 생성 제한)
...
>>> maria = Person()
>>> maria.name = '마리아' # 허용된 속성
>>> maria.age = 20 # 허용된 속성
>>> maria.address = '서울시 서초구 반포동' # 허용되지 않은 속성은 추가할 때 에러가 발생함
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
maria.address = '서울시 서초구 반포동'
AttributeError: 'Person' object has no attribute 'address'
리스트나 딕셔너리 언패킹처럼 가능하다.
class Person:
def __init__(self, *args):
self.name = args[0]
self.age = args[1]
self.address = args[2]
maria = Person(*['마리아', 20, '서울시 서초구 반포동'])
class Person:
def __init__(self, **kwargs): # 키워드 인수
self.name = kwargs['name']
self.age = kwargs['age']
self.address = kwargs['address']
maria1 = Person(name='마리아', age=20, address='서울시 서초구 반포동')
maria2 = Person(**{'name': '마리아', 'age': 20, 'address': '서울시 서초구 반포동'})
비공개로 속성을 만들면 클래스 안에서만 사용할 수 있고 바깥에서는 접근할 수 없다.
class 클래스이름:
def __init__(self, 매개변수)
self.__속성 = 값
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 # 클래스 바깥에서 비공개 속성에 접근하면 에러가 발생함
__wallet
이름 앞에 언더바2개 넣으므로써 비공개 속성으로 만든다.
같은 Person
클래스 안에서만 사용이 가능하다.
클래스의 속성 뿐만 아니라 메서드도 비공개가 가능하다.
class Person:
def __greeting(self):
print('Hello')
def hello(self):
self.__greeting() # 클래스 안에서는 비공개 메서드를 호출할 수 있음
james = Person()
james.__greeting() # 에러: 클래스 바깥에서는 비공개 메서드를 호출할 수 없음