이전 내용
생성자(Constructor)
FourCal 클래스의 인스턴스 a에 setdata 메서드를 수행하지 않고 add 메서드를 수행하면
setdata 메서드를 수행해야 객체 a의 객체변수가 first와 second가 생성되는데, setdata 메서드가 없기 때문에 오류가 발생한다.
a = FourCal()
a.add()
AttributeError: 'FourCal' object has no attribute 'first'
이렇게 객체에 초깃값을 설정해야 할 필요가 있을 때는 생성자를 구현하는 것이 안전한 방법인데, 생성자란 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다.
파이선 메서드 이름으로 __init__ 를 사용하면 이 메서드는 생성자가 된다.
# 사칙 연산 클래스 만들기
class FourCal:
# 생성자 추가
def __init__(self, first, second):
self.first = first
self.second = second
# setdata 함수 지정
def setdata(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
__init__ 메서드는 setdata 메서드와 이름만 다르고 모든 게 동일하나, 메서드 이름을 __init__ 으로 했기 때문에 생성자로 인식되어 객체가 생성되는 시점에 자동으로 호출되는 차이가 있다.
a = FourCal()
TypeError: FourCal.__init__() missing 2 required positional arguments: 'first' and 'second'
a = FourCal() 을 수행할 때 생성사 __init__이 호출되어 위와 같은 오류가 발생했는데, 이는 생성자의 매개변수 first와 second에 해당되는 값이 전달되지 않았기 때문이다.
위 오류를 해결하려면 first와 second에 해당되는 값을 전달하여 객체를 생성하면 되며,값을 전달하면 __init__ 메서드에 매개변수에는 각각의 값이 대입된다.
매개변수 | 값 |
self | 생성되는 객체 |
first | 첫 번째 값 |
second | 두 번째 값 |
결론적으로, __init__ 메서드가 호출되면 setdata 메서드를 호출했을 때와 마찬가지로 first와 second라는 객체변수가 생성된다. 따라서, a.setdata(4, 2) 등의 코드를 입력하여 setdata 메서드를 호출하는 게 아닌,
a = FourCal(4, 2)로 객체변수를 생성하면 된다.
# 사칙 연산 클래스 만들기
class FourCal:
# 생성자 추가
def __init__(self, first, second):
self.first = first
self.second = second
# setdata 함수 지정
def setdata(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
# 기능 시연
a = FourCal(4, 2)
print('더하기:', a.add())
print('곱하기:', a.mul())
print('빼기:', a.sub())
print('나누기:', a.div())
클래스의 상속
- 상속(Inheritance): '물려받다' 라는 뜻으로, 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것이다.
상속을 하는 이유는, 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다. 특히, 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황이라면 상속을 사용해야 한다.
class 클래스 이름(상속할 클래스 이름)
[상속 개념을 사용하여 FourCal 클래스에 제곱 기능 추가하기]
1) FourCal 클래스 상속하기
FourCal 클래스를 상속하는 MoreFourCal 클래스를 만들어 제곱 기능을 추가한다.
# 클래스 상속
class MoreFourCal(FourCal):
pass
MoreFourCal 클래스는 FourCal 클래스를 상속했으므로, FourCal 클래스의 모든 기능을 사용할 수 있어야 한다.
# 클래스 상속
class MoreFourCal(FourCal):
pass
# 기능 시연
a = MoreFourCal(8, 2)
print('더하기:', a.add())
print('곱하기:', a.mul())
print('빼기:', a.sub())
print('나누기:', a.div())
2) MoreFourCal 클래스에 제곱 기능 추가하기
# 클래스 상속
class MoreFourCal(FourCal):
def pow(self):
result = self.first ** self.second
return result
# 기능 시연
a = MoreFourCal(8, 2)
print('더하기:', a.add())
print('곱하기:', a.mul())
print('빼기:', a.sub())
print('나누기:', a.div())
print('재곱:', a.pow())
메서드 오버라이딩
- 메서드 오버라이딩(Overriding, 덮어쓰기): 부모 클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것.
메서드를 오버라이딩하면 부모 클래스의 메서드 대신 오버라이딩한 메서드가 호출된다.
# 메서드 오버라이딩
a = FourCal(4, 0)
print('나누기:', a.div())
4를 0으로 나눌 경우 아래와 같은 ZeroDivisionError 가 발생하는데,
ZeroDivisionError: division by zero
0으로 나눌 때 오류가 아닌 0을 돌려주도록 만들고 싶다면
1) FourCal 클래스를 상속하는 SafeFourCal 클래스 만들기
# 메서드 오버라이딩
class SafeFourCal(FourCal):
def div(self):
if self.second == 0:
return 0
else:
return self.first / self.second
▶ 나누는 값이 0인 경우 숫자 0을 돌려주도록 수정
# 메서드 오버라이딩
class SafeFourCal(FourCal):
def div(self):
if self.second == 0:
return 0
else:
return self.first / self.second
# 기능 시연
a = SafeFourCal(4, 0)
b = SafeFourCal(8, 2)
print('나누기1:', a.div())
print('나누기2:', b.div())
SafeFourCal 클래스를 사용하면 FourCal 클래스와는 달리 ZeroDivisionError가 발생하지 않고 의도한 대로 0을 돌려주는 것을 확인할 수 있다.
클래스 변수
클래스 변수는 클래스 안에 함수를 선언하는 것과 마찬가지로 클래스 안에 변수를 선언하여 생성한다.
또한, 클래스 변수는 클래스로 만든 모든 객체에 공유된다는 특징이 있어 다른 객체들에 영향받지 않고 독립적으로 그 값을 유지하는 객체변수와는 차이가 있다.
# 클래스 변수
class Family:
lastname = "김"
print(Family.lastname)
클래스 변수는 위와 같이 클래스 이름. 클래스 변수로 사용할 수 있고,
아래와 같이 Family 클래스로 만든 객체를 통해서도 사용할 수 있다.
# 클래스 변수
class Family:
lastname = "김"
a = Family()
b = Family()
print(a.lastname)
print(b.lastname)
만약 Family 클래스의 lastname을 다른 문자열로 바꾸게 되면 클래스로 만든 객체의 값도 모두 변경된다.
# 클래스 변수
class Family:
lastname = "박"
a = Family()
b = Family()
print(a.lastname)
print(b.lastname)
[클래스 보완]
다음 내용
[참고]
점프 투 파이썬, 이지스퍼블리싱, 박응용
'[파이썬 Projects] > <파이썬 기초>' 카테고리의 다른 글
[파이썬] 파이썬 기초: 패키지 (1) | 2024.10.16 |
---|---|
[파이썬] 파이썬 기초: 모듈 (1) | 2024.10.15 |
[파이썬] 파이썬기초: 클래스 - 1 (1) | 2024.10.15 |
[파이썬] os(Operating System) 모듈이란? (0) | 2024.09.19 |
[파이썬] 로또 번호 생성 프로그램 만들기 (0) | 2024.07.03 |