1. 클래스와 객체
클래스는 객체의 속성과 동작을 정의합니다.
그렇다면 클래스란 무엇이고, 객체란 무엇일가요?
붕어빵으로 예를 들면 클래스는 붕어빵을 만들어 낼 수 있는 틀이고 객체는 틀로 만들어진 붕어빵을 의미합니다.
틀에서 만들어진 붕어빵들의 모양이 조금씩 다르듯(옆구리 터진 붕어빵, 조금 탄 붕어빵 등...) 클래스로 만든 각각의 개체는 개체마다 고유한 성격을 가지고 있습니다. 즉 동일한 클래스에서 만든 객체들은 서로간 영향을 주지 않습니다.
또한 클래스로 만든 객체를 인스턴스라고도 합니다.
class Sports:
pass
football = Sports():
baseball = Sports():
객체와 인스턴스의 차이??
football = Sports()에서 football은 객체이고, Sports의 인스턴스입니다.
쉽게 설명하자면 인스턴스는 어떠한 클래스의 객체인지 위주로 설명할때 쓰입니다.
그래서 football은 인스턴스가 아닌 객체이며, 이 football은 클래스 Sports의 인스턴스 입니다.
2. __init__ 메서드
__init__ 메서드는 python에서 사용하는 메서드로 초기화(initialize) 메서드라고도 합니다.
이는 인스턴스 생성과 동시에 자동으로 호출되어 그 객체의 성질을 정해주는 역할을 합니다.
이때 첫번째 인자는 항상 self 여야 합니다.
class Car:
def __init__(self, brand, year):
self.brand = brand
self.year = year
# 인스턴스화
a = Car("BMW", 1)
b = Car("Benz", 1)
print('a = ' , a.__dict__)
print('b = ' , b.__dict__)
print('{} is {} years and {} is {} years'.format(a.brand, a.year, b.brand, b.year))
>> result
a = {'brand': 'BMW', 'year': 1}
b = {'brand': 'Benz', 'year': 1}
BMW is 1 years and Benz is 1 years
위의 코드를 쉽게 풀어보겠습니다.
1. Car 라는 class의 붕어빵 틀을 만든다.
2. 사용자는 생성자를 이용해 brand와 year 순으로 인자를 넣어서 인스턴스(붕어빵)를 찍어낸다.
3. self
두 개의 메서드가 정의된 selfTest 클래스를 만든 후 인스턴스를 생성해 보겠습니다.
인스턴스 메서드를 호출할 때 아무것도 전달하지 않아도 에러가 발생하지 않는 이유는 첫 번째 인자인 self에 대한 값은 python이 자동으로 넘겨주기 때문입니다.
class selfTest:
def func1():
print('func1 called')
def func2(self):
print('func2 called')
# 인스턴스 생성
f = selfTest()
# func2 호출
f.func2()
>> result
func2 called
func1() 처럼 아무런 인자가 없는 경우 func1을 호출하면 아래와 같이 에러가 발생하는 것을 볼수 있습니다.
에러의 내용을 보면 func1()은 인자가 없지만 하나를 받았다 라는 것을 알 수 있는데, 이는 메서드의 첫 번째 인자로 항상 인스턴스가 전달되기 때문입니다.
class selfTest:
def func1():
print('func1 called')
def func2(self):
print('func2 called')
# 인스턴스 생성
f = selfTest()
# func1 호출
f.func1()
>> result
TypeError: func1() takes 0 positional arguments but 1 was given
4. __del__ 메서드
__del__ 메서드는 객체를 삭제할때 사용하는 메서드로 소멸자라고도 합니다.
우선 생성자를 이용하여 객체를 만들어 보겠습니다.
class Warehouse:
stock_num = 0
def __init__(self, name):
self.name = name
Warehouse.stock_num += 1 #name이 추가되면 stock_num을 1씩 ㅡㅇ가
def __del__(self):
Warehouse.stock_num -= 1
user1 = Warehouse('Bag')
user2 = Warehouse('Hat')
print(Warehouse.stock_num)
>> result
2
위의 예제를 통해 stock_num 이 2로 증가된 것을 확인할 수 있습니다.
추가된 객체를 자세히 살펴보겠습니다.
print(user1.name)
print(user2.name)
print(user1.__dict__)
print(user2.__dict__)
>> result
Bag
Hat
{'name': 'Bag'}
{'name': 'Hat'}
생성된 객체를 del 문을 사용하여 삭제해 보겠습니다.
# user1 삭제
del user1
print(Warehouse.stock_num)
print(user2.name)
print(user2.__dict__)
print(Warehouse.__dict__)
>> result
1
Hat
{'name': 'Hat'}
After {'__module__': '__main__', 'stock_num': 1, '__init__': <function Warehouse.__init__ at 0x0079C588>, '__del__': <function Warehouse.__del__ at 0x0079C5D0>, '__dict__': <attribute '__dict__' of 'Warehouse' objects>, '__weakref__': <attribute '__weakref__' of 'Warehouse' objects>, '__doc__': None}
예제에서 알 수 있듯이 user1이 삭제되어 stock_num이 1로 감소한 것을 확인할 수 있습니다.
5. 예제
class school:
student = 'middle'
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
return '{} is {} years old'.format(self.name, self.age)
def speak(self, sound):
return "{} says {}!".format(self.name, sound)
# 인스턴스 생성
c = school('jay', 15)
d = school('jason', 14)
# 메쏘드 호출
print(c.info())
print(d.info())
print(c.speak('Hello'))
print(d.speak('Hi'))
>> result
jay is 15 years old
jason is 14 years old
jay says Hello!
jason says Hi!
'Language > Python' 카테고리의 다른 글
19. python - package (0) | 2019.12.27 |
---|---|
18. python - module (0) | 2019.12.26 |
16. python - input() (0) | 2019.12.21 |
15. python - 함수 (0) | 2019.12.20 |
14. python 반복문 - while (0) | 2019.12.19 |