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

+ Recent posts