정보처리기사 준비하면서 코딩문제 풀기 위해 파이썬 클래스 개념에 대해 정리한 글로 파이썬 비중이 많은 편은 아니지만 파이썬을 사용해 본 적이 있어 정리할 겸 썼다.

1. 파이썬에서 클래스와 객체
누군가 이 글을 볼수도 있으니 설명하자면 클래스는 설계도로 붕어빵 틀이라고 많이들 비유한다.
객체(=인스턴스)는 설계도로 만든 실제 물건을 뜻하며 예를 들어 붕어빵틀에 팥을 넣으면 팥붕어빵 슈를 넣으면 슈붕어빵이 되는 것처럼 인스턴스에 인자값에 무엇을 넣느냐에 따라 설계도에 맞춰 어떻게 될지 달라지기도 한다. (객체, 인스턴스 동일한 표현)
class Dog:
def __init__(self, name): #생성자
self.name = name
def say(self): #메서드
print(f"나는 {self.name}")
d1 = Dog("초코")
d2 = Dog("바둑이")
d1.say() # 나는 초코
d2.say() # 나는 바둑이
자바에서는 클래스의 이름과 동일한 게 생성자였는데 파이썬에서는 __init__이 생성자가 되는 거고 보통 멤버변수는 생성자안에서 정의하여 쓴다. d1.say()를 호출하면 self는 d1이 되고, d2.say()를 호출하면 self는 d2가 됩니다.
Java의 this랑 같은 건데, 차이점은 파이썬은 메서드 파라미터에 꼭 적어야 된다.
2.파이썬에서 상속
# 부모 클래스
class Animal:
def __init__(self):
print('강아지')
def speak(self):
return "..."
# 자식 클래스 - 괄호 안에 부모를 넣으면 끝
class Dog(Animal): #부모 Animail클래스 자식Dog의 상속
def __init__(self, name):
super().__init__() #super().__init__()을 써야 부모 생성자를 호출
self.name = name
print(self.name)
def speak(self): # 부모의 speak을 덮어씀 (오버라이딩)
return "멍멍!"
d = Dog("초코")
상속을 할때 따로 자바처럼 extends를 사용하지 않는다. 자식클래스의 파라미터에다가 부모클래스를 적으면 상속이 된다.
파이썬 상속에서 가장 중요한 게 있다면 자바와 다르게 자식클래스의 생성자를 실행하기 전에 부모 클래스의 생성자를 가서 실행할 필요가 없다.(부모 생성자를 자동 호출 되는 게 아님) super().__init__() 을 명시해야만 부모 클래스의 생성자를 실행하러 가게 된다. 파이썬에서 오버로딩은 덮어써져서 마지막 거만 남게 되어 파이썬에서는 오버로딩을 사용하지 않는다고 하며 상속관계의 클래스에서 오버라이딩 된 메서드를 호출하는 건 자바와 동일하다.
3. 클래스의 변수 차이
class Food:
count = 0 # 클래스 변수 - 모든 인스턴스가 공유 java의 static같은느낌
def __init__(self, name):
self.name = name
print(self.name)
Food.count += 1
f1 = Food("치킨") # count = 1
f2 = Food("피자") # count = 2
f3 = Food("햄버거") # count = 3
print(f1.count) # 3
print(f2.count) # 3
print(f3.count) # 3
self.name은 인스턴스 변수였다면 클래스 변수라는 게 있다. 생성자 밖에 변수를 지정하면 모든 인스턴스가 공유하게 되어 값이 계속 유지하게 된다. 자바에서 static과 같은 느낌이라고 보면 된다.
4. 특수 메서드(special method)란?
여기까지 정보처리기사에 나올지는 모르겠지만 개인적으로 파이썬을 좋아하는 편이라 공부할 겸 더 정리하자면
특수 메서드라고도 하며 찾아보니 매직 메서드 (magic method) 또는 던더 메서드 (dunder method)라고도 하는 것 같습니다.
class Dog:
def __init__(self, name): # 객체 만들 때 자동
self.name = name
def __str__(self): # print() 할 때 자동
return self.name
def __len__(self): # len() 할 때 자동
return len(self.name)
def __eq__(self, other): # == 비교할 때 자동
return self.name == other.name
d = Dog("초코")
print(d) # __str__ → 초코
print(len(d)) # __len__ → 2
print(d == Dog("초코")) # __eq__ → True
특수 메서드는 직접 호출하지 않아도 특정 상황에서 자동으로 호출됩니다.
예를 들어 print()를 쓰면 __str-__이 자동으로 호출되고 len()을 쓰면 __len__이 자동으로 호출되게 된다.
즉 인스턴스를 호출하여 조건에 맞게 사용하면 특수메서드가 자동적으로 사용되게 된다.