ch05 파이썬 날개달기
01 클래스
클래스를 사용하면 독립적인 결괏값을 유지하면서도 같은 기능을 가진 객체들을 생성할 수 있다.
01-1 클래스와 객체
- 클래스란 똑같은 무엇인가를 계속 만들어낼 수 있는 설계도면이다.
- 객체란 클래스로 만든 피조물이다.
- 동일한 클래스로 만든 객체라도 각자 고유한 성격을 가지며 서로 영향을 주지 않는다.
*객체와 인스턴스
인스턴스는 객체와 클래스의 관계를 설명할 때 사용한다. 예시를 보자.
a = Cookie()에서 a는 객체이다.
a는 Coocie의 인스턴스이다.
01-2 사칙연산 클래스 만들기
클래스를 만들기 전에는 어떤 동작을 할 것인지 미리 구상하는 것이 좋다.
사칙연산에 필요한 숫자 두 개 입력받기: setdata 메서드
사칙연산 기능 구현하기: add, sub, mul, div 메서드
클래스 구조 만들기
하나하나씩 구현해보자. 실습은 파이썬 대화형 인터프리터에서 진행했다.
우선 pass를 사용해 FourCal 클래스를 만들었다. 그리고 객체 a를 만들어 타입을 알아보았다.
*pass문법은 아무것도 수행하지 않는 문법으로 임시 코드에 주로 사용한다.
객체에 숫자 지정하기
객체에 연산을 수행할 대상(숫자)을 알려주자.
- FourCal 클래스에서 pass문장을 삭제하고 setdata 함수를 만들었다.
- 클래스 안에 구현된 함수는 메서드(method)라고 한다.
- setdata 메서드의 첫 번째 매개변수 self에는 호출한 객체(a)가 전달된다.
위 코드처럼 a.setdata(4, 2)를 호출하면 a객체에 객체 변수 first와 second가 생성되고 값이 저장된다.
이번에는 b객체를 만들었다. 그 후 b와 a의 객체를 출력하고 id함수로 주소 값을 확인했다. 객체 변수는 다른 객체들의 영향을 받지 않고 독립적으로 값을 유지한다는 개념을 확인할 수 있었다.
더하기 기능 만들기
사칙연산의 기능을 구현해보자.
add 매서드를 추가한 후 객체 a를 만들었다. a.add()를 출력하니 더하기 결괏값이 나왔다. 코드를 살펴보자.
- add 매서드의 매개변수는 self이고 반환 값은 result이다.
- result 계산 부분의 self.first는 a.first(=4)로 해석된다.
곱하기·빼기·나누기 기능 만들기
*코드가 길어져 에디터를 사용했다.
#class: FourCal
class FourCal:
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()
a.setdata(4, 2)
print(a.add())
print(a.mul())
print(a.sub())
print(a.div())
add 매서드와 마찬가지로 sub, mul, div 메서드를 만들고 실행시켰다.
01-3 생성자
- 객체에 초깃값을 설정해야 할 때는 setdata 매서드를 호출하는 것보다 생성자를 구현하는 것이 안전하다.
- 생성자(Constructor)란 객체가 생성될 때 자동으로 호출되는 메서드이다.
- 생성자는 파이썬 메서드 이름으로 __init__를 사용한다(언더스코어(_) 두 개).
FourCal 클래스에 생성자를 추가해보자.
#class: FourCal
#constructor
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() #오류발생
a.setdata(4, 2)
print(a.add())
print(a.mul())
print(a.sub())
print(a.div())
- 같은 코드에 생성자 __init__메서드만 추가해서 실행시키니 에러가 발생했다.
- a = FourCal()을 수행할 때 생성자가 자동으로 호출되었기 때문이다.
- 위 오류를 해결하려면 객체변수에 해당하는 값을 전달하도록 코드를 수정하면 된다.
#class: 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)
print(a.add())
print(a.mul())
print(a.sub())
print(a.div())
코드를 수정하니 프로그램이 잘 실행되었다.
01-4 클래스와 상속
상속(Inheritance)란 '물려받다'는 뜻으로 클래스에도 이 개념을 적용할 수 있다.
클래스에서 상속을 사용하면 기능을 물려받을 수 있다.
앞서 만든 FourCal 클래스에 제곱(a^b)을 구할 수 있는 기능을 추가해보자.
#class: FourCal
#inheritance
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):
pass
a = MoreFourCal(4, 2)
print(a.add())
print(a.mul())
print(a.sub())
print(a.div())
우선 상속 기능을 확인하기 위해 pass 명령어를 사용해서 MoreFourCal 클래스를 만들었다. 클래스를 상속할 때에는 괄호 안에 상속할 클래스 이름을 넣어주면 된다.
class 클래스 이름(상속할 클래스 이름):
a 객체를 만들어 사칙연산을 실행하니 결괏값이 정상적으로 나왔다. 정상적으로 기능이 상속된 것을 확인했다.
#class: FourCal
#inheritance
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):
def pow(self):
result = self.first ** self.second
return result
a = MoreFourCal(4, 2)
print(a.pow())
pass 명령어를 지운 후 제곱 연산을 하는 pow 메서드를 만들어 프로그램을 실행시켰다. 이처럼 상속은 기존 클래스는 그대로 놔둔 채 클래스의 기능을 확장시킬 때 사용한다.
*기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황에서도 상속이 유용하게 쓰인다.
01-5 메서드 오버라이딩
#class: 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, 0)
print(a.div())
다시 FourCal 클래스로 돌아가 프로그램을 실행시켜보자. 이번에는 객체 a에 객체 변수로 4와 0을 주고 나눗셈 값을 출력하고자 했다.
하지만 프로그램을 실행시켜보니 'ZeroDivisionError: division by zero'에러가 발생했다. 4를 0으로 나누려고 했기 때문이다.
오류가 아닌 0을 출력하는 프로그램을 만들어보자.
#class: 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
class SafeFourCal(FourCal):
def div(self):
if self.second == 0:
return 0
else:
return self.first / self.second
a = SafeFourCal(4, 0)
print(a.div())
코드를 살펴보자
- FourCal 클래스를 상속한 SafeFourCal 클래스를 만들었다.
- FourCal 클래스에 있는 div 메서드를 동일한 이름으로 다시 작성했다.
- 이렇게 부모 클래스에 있는 메서드를 동일한 이름으로 다시 만드는 것을 매서드 오버 라이딩이라고 한다.
- 오버 라이딩(Overriding)은 '덮어쓰기'라는 의미이다.
프로그램을 실행시켜보니 값이 정상적으로 나왔다.
01-6 클래스 변수
객체 변수는 다른 객체들에 영향을 받지 않고 독립적으로 값을 유지한다고 배웠다. 이번에는 클래스 변수를 알아보자.
Family 클래스에 선언한 lastname이 클래스 변수다. 클래스 변수는 클래스 이름. 클래스 변수로 사용할 수 있다.
또는 객체를 통해서도 사용이 가능하다.
클래스 변수의 특징을 보자.
클래스 변수의 값을 변하면 클래스 객체의 변수 값도 모두 변경된다. 즉 클래스 변수는 클래스로 만든 모든 객체에 공유된다는 특징이 있다.
이 글은 책 『Do it! 점프 투 파이썬』을 읽은 후 작성한 글입니다.
'Programming > Python' 카테고리의 다른 글
Do it! 공부단 6일차 | ch05 파이썬 날개달기_패키지 (0) | 2021.03.22 |
---|---|
Do it! 공부단 6일차 | ch05 파이썬 날개달기_모듈 (0) | 2021.03.22 |
Do it! 공부단 4일차 | ch04 프로그램의 입력과 출력_사용자 입출력과 파일 (0) | 2021.03.10 |
Do it! 공부단 4일차 | ch04 프로그램의 입력과 출력_함수 (0) | 2021.03.10 |
Do it! 공부단 3일차 | ch03 제어문_while문과 for문 (2) | 2021.03.05 |