본문 바로가기

파이썬/파이썬 개념

[Python] 사칙연산 클래스 만들기 (클래스, 생성자, 클래스의 상속, 메서드 오버라이딩) / 2021.08.10

* 참고 자료 : Do it! 점프 투 파이썬


* 배경 생각하기

1. 클래스를 어떻게 만들지 구상하기
(1) 더하기 기능 : add 메서드
(2) 빼기 기능 : sub 메서드
(3) 곱하기 기능 : mul 메서드
(4) 나누기 기능 : div 메서드
(5) 두 숫자 입력받기 : setdata 메서드

2. 어떻게 동작하는가 ?
사칙연산을 가능하게 하는 FourCal 클래스가 다음처럼 동작한다고 가정해보자.
(1) a = FourCal( ) : a라는 객체 만들기
(2) a.setdata(4, 2) : 숫자 4와 2를 a에 지정
(3) a.add()를 실행하면 6
a.sub()를 실행하면 2
a.mul()을 실행하면 8
a.div()를 실행하면 2
이런 식으로 동작하게 만드는 게 목표이다.

* 코드 생각하기

1. 클래스 구조 만들기
가장 먼저 할 일은 a = FourCal( )처럼 객체를 만들 수 있게 하는 것이다.
일단은 아무 기능이 없어도 되기 때문에

class FourCal:
pass

라고 만들어 준다.

2. 메서드 만들기
(1) setdata 메서드
사칙연산을 하기 위해서는 2개의 숫자를 매개변수로 받아야 한다.

1
2
3
    def setdata(self, first, second):
        self.first = first
        self.second = second
cs


* setdata 메서드의 매개변수가 3개인 이유?
setdata 메서드를 호출할 때 a.setdata(4, 2)처럼 호출하는데 이때 매개변수가 4, 2로 두 개이다. 그런데 setdata 메서드에는 self라는 매개변수도 있다. 이 매개변수는 무엇인가?
a.setdata(4, 2)를 호출하면 setdata의 첫 번째 매개변수 self에는 setdata메서드를 호출한 객체 a가 자동으로 전달된다.
그림으로 그려보면 다음과 같다.

파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다. 객체를 호출할 때 호출한 객체 자신이 전달되기 때문에 self를 사용한다. 물론 self 말고 다른 이름을 사용해도 상관없다!

(2) 사칙연산 기능 추가하기
FourCal 클래스에 사칙연산 메서드를 추가하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class FourCal:
    def setdata(self, first, second):
        self.first = first
        self.second = second
    def add(self):
        result = self.first + self.second
        return result
    def sub(self):
        result = self.first - self.second
        return result
    def mul(self):
        result = self.first * self.second
        return result
    def div(self):
        result = self.first / self.second
        return result
cs


여기까지가 우리가 목표로 한 사칙연산 클래스이다.

* 생성자 사용

1. 생성자(Constructor) 란?
생성자란 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다.
파이썬 메서드 이름으로 __init__를 사용하면 이 메서드는 생성자가 된다.
위 코드에서는 인스턴스 a에 setdata메서드를 수행하지 않고 add메서드를 수행하면 오류가 발생한다.
setdata메서드를 수행해야 객체 a의 변수 first와 second가 생성되기 때문이다.
이렇게 객체에 초깃값을 설정해야 할 필요가 있을 때는 생성자를 구현하는 것이 안전한 방법이다.

위 코드에 생성자를 추가해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 sub(self):
        result = self.first - self.second
        return result
    def mul(self):
        result = self.first * self.second
        return result
    def div(self):
        result = self.first / self.second
        return result
cs


2. 생성자 사용
__init__메서드는 setdata와 메서드와 이름만 다르고 모든 게 동일한다. 단 메서드 이름을 __init__으로 했기 때문에 생성자로 인식되어 객체가 생성되는 시점에 자동으로 호출되는 차이가 있다.
이제, first와 second에 해당되는 값을 전달하여 객체를 생성해야 한다.

a = FourCal(4, 2)

위와 같이 수행하면 __init__메서드의 매개변수에는 각각 first에는 4 second에는 2가 대입된다.

객체 변수의 값과 메서드 동작을 확인해보자.

a = FourCal(4,2)
print(a.first)
print(a.second)
print(a.add())
print(a.mul())


실행 결과 :

이상 없이 잘 동작하는 것을 확인할 수 있다.

* 클래스의 상속

1. 상속이란?
어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것이다.
상속 개념을 사용하여 우리가 만든 FourCal 클래스에 a의 b제곱을 구할 수 있는 기능을 추가해보자.

2. MoreFourCal 클래스
클래스를 상속하기 위해서는 다음과 같이 클래스 이름 뒤 괄호 안에 상속할 클래스 이름을 넣어주면 된다.

class 클래스 이름(상속할 클래스 이름)


pow( ) 메서드를 추가한 MoreFourCal 클래스

1
2
3
4
class MoreFourCal(FourCal):
    def pow(self):
        result = self.first ** self.second
        return result
cs

메서드 동작을 확인해 보자.

a = MoreFourCal(4, 2)
print(a.pow())


실행 결과 :

4의 제곱 16이 잘 나오는 것을 확인할 수 있다.

* 메서드 오버 라이딩

1. 오버 라이딩(Overriding) 이란?
클래스를 상속받으면 부모 클래스와 자식 클래스로 나뉘는데, 부모 클래스에 있는 메서드를 동일한 이름으로 다시 만드는 것을 말한다.
메서드 오버 라이딩하면 부모 클래스의 메서드 대신 오버 라이딩한 메서드가 호출된다.

FourCal클래스의 div메서드를 실행할 때 0으로 나누려고 하면 ZeroDivisionError라는 오류가 발생한다.
하지만 0으로 나눌 때 오류가 아닌 0을 리턴하도록 오버 라이딩을 이용하여 만들어보자.

2. SafeFourCal 클래스
먼저, FourCal클래스를 상속하는 SafeFourCal 클래스를 만들자.

1
2
3
4
5
6
class SafeFourCal(FourCal):
    def div(self):
        if self.second == 0:
            return 0
        else:
            return self.first / self.second
cs

그리고 다음과 같이 실행하면,

a = SafeFourCal(4, 0)
print(a.div())


실행 결과 :


에러가 아닌 0이 리턴되는 것을 확인할 수 있다.