Class의 사전적 의미 중 "부류"라는 것이 있습니다. Python의 Class 개념으로 들어가기전에 실생활에서 볼 수 있는 예를 가지고 설명해보겠습니다.

Galaxy S10, iPhone XS는 Smartphone이라는 공통점을 가지고 있습니다.
그러나 Galaxy S10의 AP칩은 Exynos 9820이고
iPhone XS의 AP칩은 A12 Bionic입니다.

이렇듯, Galaxy S10, iPhone XS는 Smartphone이라는 것은 같지만 제조사, 하드웨어, OS 등등 다른 부분이 정말 많습니다.

이제 프로그래밍적인 언어로 치환해보겠습니다.

여기서 Smartphone은 Class
Galaxy S10, iPhone XS를 instance(Object)라고 합니다.
그리고 각 Object별로 각기 다른 AP칩, 제조사, OS 같은 것을 attribute라고 합니다.


1. Class definition

위에서 설명한 Smartphone으로 Class를 정의해보겠습니다.

class Smartphone:
    def __init__(self, maker, ap_chip, os):
        self.maker      = maker
        self.ap_chip    = ap_chip
        self.os         = os

먼저 __init__ 메소드의 이름을 자세히 보겠습니다.
init 이라는 단어의 앞 뒤에 밑줄 2개가 있습니다.
이렇게 앞뒤로 밑줄 2개가 있는 메소드들을 special methods라고 합니다.
그 중 __init__ 메소드는 class가 실체화 될때 사용되는 함수 입니다.


이제 위에서 정의한 class를 사용해 iphone_xs라는 Object를 instantiation(실체화)하겠습니다.

iphone_xs = Smartphone("Apple", "A12 Bionic", "iOS")

__init__ 메소드의 parameter는 총 4개인데, 클래스를 실체화 할때는 3개만 넘겨주었습니다.
self 파라미터를 빼먹었는데요, 이 self 파라미터는 도대체 무엇이길래 빼먹는걸까요?

class에서 "self" 는 class의 실체(instance)인 객체(object)를 가르킵니다!

그러므로 Smartphone class에서 "self" 는 Smartphone class의 객체인 iphone_xs를 가르킵니다.
그리고 클래스를 실체화 할때 파이썬이 해당 객체(self)를 자동으로 __init__ 함수에 넘겨줍니다.

자, 내용이 많은데 정리하자면:
__init__ 메소드는 클래스가 실체화 될때 자동으로 호출이 된다.
__init__ 메소드의 self 파라미터는 클래스가 실체화된 객체를 넘겨주어야 하며, 파이썬이 자동으로 넘겨준다.
__init__ 메소드의 self 파라미터는 항상 정의되어야 있어야 하며 맨 처음 파라미터로 정의 되어야 한다.

2. Class Method

클래스에서 __init__ 말고도 다른 method를 원하는 대로 추가할 수 있습니다.
attribute(속성)와 method는 명사와 동사와 같은 느낌입니다.
속성은 해당 객체의 이름 등 정해진 성질인 반면에 method는 move, eat 등 객체가 행할 수 있는 어떠한 action같은 느낌이라고 생각할 수 있습니다.

그럼 Smartphone이 할 수 있는 action은 무엇이 있을까요?
"벨소리 울리기"같은 것이 있습니다.

그럼 "벨소리 울리기"를 method로 추가해 보겠습니다.

class Smartphone:
    def __init__(self, maker, ap_chip, os):
        self.maker      = maker
        self.ap_chip    = ap_chip
        self.os         = os

    def ring(self):
        return "ring ring"

ring method에도 self parameter가 들어있습니다. 이렇듯 모든 method의 첫번째 parameter로 self가 들어가야 합니다.

이제 ring method를 사용해보겠습니다.

iphone_xs = Smartphone("Apple", "A12 Bionic", "iOS")
iphone_xs.ring()
>>> "ring ring"

이제 간략한 Database를 만들어보겠습니다.

class Database:
  def __init__(self, name, size):
    self.name = name
    self.size = size
    self.db_dict = {}

  def insert(self, field, value):
    if len(self.db_dict) >= self.size:
      print(f"{self.name}의 저장공간을 전부 사용했습니다.")
    else:
      self.db_dict[field] = value

  def select(self, field):
    if field in self.db_dict.keys():
      return self.db_dict[field]
    else:
      print("해당 field는 존재하지 않습니다.")
      return None

  def update(self, field, value):
    if field in self.db_dict.keys():
      self.db_dict[field] = value
    else:
      print("해당 field는 존재하지 않습니다.")

  def delete(self, field):
    if field in self.db_dict.keys():
      del self.db_dict[field]
      print(f"{field}를 삭제했습니다.")
    else:
      print("field가 존재하지 않습니다.")

이렇게 class를 이용해 간단하게 정보를 저장하고 삭제할 수 있는 Database도 만들 수 있습니다.