[파이썬] 파이썬 기초: 클래스 - 2
이전 내용
[파이썬] 파이썬기초: 클래스 - 1
클래스(Class) 와 객체(object) 클래스: 똑같은 무언가를 계속 만들어 낼 수 있는 설계 도면객체: 클래스로 만든 피조물. 클래스로 만든 객체는 객체 마다 고유한 성격을 가진다. ◆ 파이썬 클래스의
puppy-foot-it.tistory.com
생성자(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)
[클래스 보완]
[파이썬] 파이썬 기초 - 클래스 보완
클래스 이전 내용 [파이썬] 파이썬기초: 클래스 - 1클래스(Class) 와 객체(object) 클래스: 똑같은 무언가를 계속 만들어 낼 수 있는 설계 도면객체: 클래스로 만든 피조물. 클래스로 만든 객체는 객
puppy-foot-it.tistory.com
다음 내용
[파이썬] 파이썬 기초: 모듈
모듈 - 모듈: 함수나 변수 또는 클래스를 모아 놓은 파일을 말하며, 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있다.모듈은 이미 만들어 놓은 모듈을
puppy-foot-it.tistory.com
[참고]
점프 투 파이썬, 이지스퍼블리싱, 박응용