04장 연습문제 ~ 05~1 (p.179 ~ p.206)
오늘 공부한 클래스는 처음 접하는 개념이라서 이해를 하는데 전보다는 시간이 더 걸렸다.
클래스를 공부하기 전에 4장 연습문제를 풀었는데 한 문제씩 정답을 맞히니 기분이 좋았다.
이 기분을 양분으로 삼아서 더 열심히 해야겠다.
5장 : 파이썬 날개 달기
5장에서는 프로그래밍의 꽃이라 할 수 있는 클래스와 모듈, 예외 처리 및 파이썬 라이브러리에 대해서 배운다. 여기까지 끝내면 파이썬 프로그램을 작성하기 위해 알아야 할 대부분의 내용을 배우게 된다고 한다.
05-1 클래스
클래스는 프로그램 작성을 위해 꼭 필요한 건 아니지만, 적재적소에 사용하면 매우 편리한 요소이다.
# 클래스의 예
class Calculator:
def __init__(self):
self.result = 0
def add(self, num):
self.result += num
return self.result
cal1 = Calculator()
cal2 = Calculator()
* 클래스(class)란 똑같은 무언가를 계속해서 만들어 낼 수 있는 설계 도면(과자 틀)이고, 객체(object)란 클래스로 만든 피조물(과자)을 뜻한다.
클래스는 함수처럼 구조는 여러 로직들을 모아놓은 모양새지만 가장 큰 특징은 같은 클래스로 생성한 여러 가지 다른 이름의 객체(cal1, cal2)들은 서로 영향을 받지 않고 독립적인 값을 유지한다는 것이다.
* 클래스로 만든 객체를 인스턴스라고도 한다. 객체와의 차이는 'cal1 = Calculator()'에서 cal1은 객체이고 a객체는 Calculator의 인스턴스이다.
사칙연산 클래스 만들기
클래스는 무작정 만드는 것보다 클래스로 만든 객체를 중심으로 어떤 식으로 동작하게 할 것인지 미리 구상을 한 후에 생각한 것들을 하나씩 해결하면서 완성해 나가는 것이 좋다.(메서드 = 클래스 안에 구현된 함수)
사칙연산 클래스(FourCal) | |
setdata 메서드 | 두 숫자 입력 |
add 메서드 | 더하기 기능 |
mul 메서드 | 곱하기 기능 |
sub 메서드 | 빼기 기능 |
div 메서드 | 나누기 기능 |
# 사칙연산 클래스
class FourCal: # 클래스 구조
def setdata(self, first, second): # 객체에 숫자 지정
# a 객체를 만들면(a.setdata(4, 2)) 첫 번째 매개변수 self에는 setdata메서드를 호출한 객체 a가 자동으로 전달
self.first = first
self.second = second
def add(self): # 매개변수 = self, 반환값 = result
result = self.first + self.second # = result = a.first + a.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()
b = FourCal()
a.setdata(4, 2)
b.setdata(3, 8)
a.add()
>>> 6
a.mul()
>>> 8
a.sub()
>>> 2
a.div()
>>> 2
b.add()
>>> 11
b.mul()
>>> 24
b.sub()
>>> -5
b.div()
>>> 0.375
생성자(Constructor)
객체에 초깃값을 설정해야 할 필요가 있을 때는 setdata와 같은 메서드를 호출하여 초깃값을 설정하기보다는 생성자를 구현하는 것이 안전한 방법이다.
* 생성자(Constructor)란 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다. 파이썬 메서드 이름으로 __init__를 사용하면 생성자 생성
# FourCal 클래스에 생성자 사용
class FourCal:
def __init__(self, first, second): # 생성자로 인식
self.first = first
self.second = second
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) # 생성자로 인해 a.first = 4, a.second = 2 바로 대입
print(a.first)
>>> 4
print(a.second)
>>> 2
a.add()
>>> 6
a.div()
>>> 2.0
클래스의 상속
'재산을 상속받다'의 상속과 같은 의미로 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 한다.
class FourCal:
def __init__(self, first, second):
self.first = first
self.second = second
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
# 클래스의 상속
class MoreFourCal(FourCal): # class 클래스 이름(상속할 클래스 이름):
def pow(self):
result = self.first ** self.second # 제곱
return result
# FourCal 클래스를 상속했으므로 FourCal 클래스의 모든 기능 사용 가능
a = MoreFourCal(4, 2)
a.add()
>>> 6
a.mul()
>>> 8
a.sub()
>>> 2
a.div()
>>> 2
a.pow() # 제곱
>>> 16
# 메서드 오버라이딩(상속한 클래스에 있는 메서드를 동일한 이름으로 다시 만드는 것)
a = FourCal(4, 0)
a.div()
>>> ZeroDivisionError 오류 # 4를 0으로 나누려고 하기 때문에 오류 발생
class SafeFourCal(FourCal):
def div(self):
if self.second == 0:
return 0 # div 메서드에서 0으로 나누면 0 반환
else:
return self.first / self.second
a = SafeFourCal(4, 0)
a.div()
>>> 0
클래스 변수
# 클래스 변수
class Family:
lastname = "김"
print(Family.lastname)
>>> 김
a = Family()
b = Family()
print(a.lastname)
>>> 김
print(b.lastname)
>>> 김
Family.lastname = "박"
print(a.lastname)
>>> 박
print(b.lastname)
>>> 박
# 클래스 변수는 클래스로 만든 모든 객체에 공유됨
'Python (파이썬)' 카테고리의 다른 글
10 [Do it! 점프 투 파이썬] - 작심 10일 (0) | 2022.02.11 |
---|---|
09 [Do it! 점프 투 파이썬] - 작심 9일 (0) | 2022.02.10 |
07 [Do it! 점프 투 파이썬] - 작심 7일 (0) | 2022.02.07 |
06 [Do it! 점프 투 파이썬] - 작심 6일 (0) | 2022.02.05 |
05 [Do it! 점프 투 파이썬] - 작심 5일 (0) | 2022.01.29 |