[Python] 클래스(Class) 2편 - 생성자(Constructor) __init__ / 상속(Inheritance) / 메서드 오버라이딩(Overriding), 덮어쓰기 / 클래스 변수 개념 이해하기
생성자(Constructor)
앞선 포스팅에서 FourCal()이라는 클래스를 만들었다.
https://eunjibest.tistory.com/43
setdata와 같은 메서드를 호출해서 초깃값을 설정을 했어야했는데,
이 방법 보다는 생성자(constructor)를 생성하는 것이 편리하고 , 안전하다.
생성자란 객체가 생성될 때 자동으로 호출되는 메서드를 말한다.
__init__를 사용하면 이 메서드는 자동으로 생성자가 된다.
class FourCal:
def __init__(self, first, second):
self.first = first
self.second = second
def add(self):
result = self.first + self.second
return result
def mul(self):
result = self.first * self.second
return result
def sub(self):
result = self.first - self.second
return result
def div(self):
result = self.first / self.second
return result
setdata 메서드를 __init__ 로 바꿔주었다.
메서드의 이름만 바뀌었을 뿐이지 모든게 동일하다.
하지만, 이제는 생성자로 인식이 되어서 객체가 생성되는 시점에 자동으로 호출이 된다는 차이점이 있다.
이제는
a.setdata(4,2)
b.setdata(3,8)
이 코드를 사용하지 않고 바로
a = FourCal(4,2)
b = FourCal(3,8)
이런식으로 클래스에 객체만 만들어주면 된다.
매개변수 | 값 |
self | 생성되는 객체 |
first | 4 |
second | 2 |
클래스의 상속 (Inheritance)
상속자들 할 때 상속 맞다.
물려받다 라는 뜻이다.
어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만든다.
FourCal 클래스에 제곱을 할 수 있는 기능을 추가해보자.
class 클래스 이름(상속할 클래스 이름):
문법이 너무 쉽다.
class MoreFourCal(Fourcal):
pass
MoreFourCal 클래스는 Fourcal 클래스를 상속했으므로
Fourcal 클래스의 모든 기능을 사용할 수 있다.
제곱을 계산하는 MoreFourCal 클래스의 메소드를 만들어
MoreFourCal 클래스 안에 넣어보자.
class MoreFourCal(Fourcal):
def pow(self):
result = self.first ** self.second
return result
self의 첫번째 변수와 두번째 변수를 거듭제곱하는 계산을
pew라는 함수에 지정해주었다.
>>> a = MoreFourCal(4,2)
>>> a.pow()
16
a객체에 4와 2를 설정하고 pow메서드를 호출하니
16이 나온 것을 볼 수 있다.
당연히 상속된 FourCal의
a.mul(), a.div() 등.. 리턴이 될 것이다.
메서드 오버라이딩(Overriding), 덮어쓰기
>>> a = MoreFourCal(4,0)
>>> a.div()
ZeroDivisionError: division by zero
4와 0을 나누면
ZeroDivisionError: division by zero라는 오류가 뜬다.
0으로 나눌 때, 오류가 아닌 0을 리턴하고 싶다면?
어떻게 해야할까?
class SafeFourCal(FourCal):
def div(self):
if self.second == 0:
return 0
else:
return self.first / self.second
이렇게 SafeFourCal이라는 클래스에 FourCal 클래스를 상속시키고
SafeFourCal 클래스는 FourCal 클래스 안에 있는 div 메서드를
동일한 이름으로 다시 작성했다.
이렇게 상속한 클래스에 있는 메서드를 동일한 이름으로 다시 만드는 것을
메서드 오버라이딩(Overriding, 덮어쓰기)라고 한다.
메서드를 오버라이딩하면 상속한 클래스의 메서드 대신
오버라이딩한 메서드가 호출된다.
잠시 오버라이딩한 div메서드를 살펴보자면,
self의 두번째 숫자가 0일 때 0을 리턴하고
그렇지 않으면 첫번째 숫자와 두번째 숫자를 나누는
함수이다.
클래스 변수
객체변수는 다른 객체들에게 영향을 받지 않고 독립적이라는 것을
저번 포스팅에서 계속 강조했다.
하지만 클래스 변수는 조금 다르다.
예를들어보자
class Family:
lastname = "이"
Fmaily라는 클래스 안에서 선언한 lastname이 클래스 변수이다.
메서드 사용하는 법과 비슷하다.
>>> print(Family.lastname)
김
클래스이름.클래스변수
Fmaily클래스로 만든 객체 a,b로도 클래스 변수를 활용할 수 있다.
>>> a = Family()
>>> b = Family()
>>> print(a.lastname)
이
>>> print(b.lastname)
이
Family.lastname = '박'
lastname을 '박'으로 바꾸어 보았다.
>>> a = Family()
>>> b = Family()
>>> print(a.lastname)
박
>>> print(b.lastname)
박
클래스 변수 값을 변경했더니, 클래스로 만든 객체의 lastname값도 모두 변경이 되었다는 것을 알 수 있다.
즉. 클래스 변수는 클래스로 만든 모든 객체에 공유가 된다.
독립이 아닌, 종속이 된다.
이 글은 '점프 투 파이썬' 책을 참고한 포스팅입니다.
댓글