class FourCal:

    def __init__(self, first, second):	#생성자
      self.first = first
      self.second = second
      
    def add(self):
      result = self.first + self.second
      return result
    
>>> a = Fourcal(3, 4)
>>> a.first			# 3
>>> a.second		# 4
>>> a.add()		# 7

● 클래스 변수와 인스턴스 변수

class Account:
    num_accounts = 0		# 클래스 변수

    def __init__(self, name):		# 생성자
      self.name = name		# 인스턴스 변수
      Account.num_accounts += 1
      
    def __del__(self):			# 소멸자
      Account.num_accounts -= 1
    
>>> kim = Account('SamKim')
>>> lee = Account('CoLee')
>>> kim.name		# SamKim
>>> lee.name		# CoLee

>>> Account.new_accounts		# 2
>>> del kim
>>> Account.new_accounts		# 1

● 클래스 메서드와 인스턴스 메서드

class SelfTest:

    def function1():			# 클래스 메서드
        print('class method called!!')
        
    def function2(self):		# 인스턴스 메서드
        print('instance method called!!')
        
>>> self_test = SelfTest()
>>> self_test.function1()		# X
>>> SelfTest.function1()		# O (클래스 메서드)
>>> self_test.function2()		# O (인스턴스 메서드)
            
>>> SelfTest.function2(self_test)

→ 메서드의 첫 매개변수에 각 인스턴스를 나타내는 self가 있으면 인스턴스 메서드, 없으면 클래스 메서드

class SelfTest:

    @classmethod
    def function1(cls):		# 클래스 메서드
        print('class method called!!')

→ decorator를 사용하여 클래스 메서드를 만드는게 일반적

→ 첫 매개변수로self와 마찬가지로 cls를 주며 각 클래스를 나타냄

매직 메서드(스페셜 메서드)

●__init__: 생성자

●__del__: 소멸자

●__dict__: 객체의 속성값 출력

class UserInfo():
    def __init__(self, name):
        self.name = name

>>> user1 = UserInfo('minsu')
>>> print(user1.__dict__)		# {'name' : 'minsu'}

cf) dir(객체) : 파이썬이 내장한 속성까지 볼수있음 (속성만 보여주고 값은 보여주지 않음)

● __doc__ : 클래스 주석(설명) 출력 

class UserInfo():
    """
    class comment
    """
>>> user1 = UserInfo()
>>> print(user1.__doc__)		# class comment

● __str__ : 문자열 출력 (=toString() in Java)