본문 바로가기

Programing/Python

[Python 입문] 13. 파이썬 클래스 02

목차

  • 사칙연산 클래스 만들기 (메소드)

클래스 자세히 알기

 앞서 배운 클래스의 기초를 바탕으로 몇 가지 클래스를 만들어 보자. 이를 통해 클래스를 만들기 위한 구상부터 구조, 클래스 상속 등을 자세히 알아보자.

 

5.사칙연산 클래스 만들기

 아래와 같이 동작할 수 있는 사칙연산(더하기, 빼기, 나누기, 곱하기)을 쉽게 할 수 있는 클래스를 만들어 보자.

>>> a = FourCal()   <---- 객체 a 만들기
>>> a.setdata(4, 2)   <---- 4와 2라는 숫자를 a에 지정
>>> print(a.sum())   <---- 더하기
6
>>> print(a.sub())   <---- 빼기
2
>>> print(a.div())   <---- 나누기
2
>>> print(a.mul())   <---- 곱하기
8

 이렇게 작동하는 클래스를 만들기 위해서는 무작정 만드는 것이 아니라 클래스에 의해 만들어진 객체를 중심으로 어떤 식으로 동작하게 할 것인지 아래와 같이 미리 구상을 해보고, 생각했던 것들을 하나씩 해결하면서 완성해 나가야 한다.

 

5.1. 클래스 구조 만들기

 제일 먼저 할 일은 아래와 같이 a = FourCal()처럼 인스턴스를 만들 수 있게 하는 것이다. 

class FourCal():
    pass

 지금 FourCal 클래스는 어떠한 변수나 함수를 포함하지 않았지만 우리가 원하는 객체 a는 만들 수 있는 기능을 가지고 있다. (pass는 아무것도 수행하지 않는 문법이다. 임시로 코드를 작성할 때 자주 사용된다.)

a = FourCal()   <---- 객체 a 
print(type(a))   <---- 객체 a의 타입 확인
<class '__main__.FourCal'>

 위의 예시를 보면 a = ForCal()과 같이 a라는 객체를 만든 후 type(a)를 통해 a의 객체가 어떤 타입인지 확인해보면 FourCal 클래스의 인스턴스임을 알 수 있다. (type함수는 파이썬이 가지고 있는 내장 함수로 객체의 타입을 출력할 때 사용된다.)

 

5.2. 객체에 숫자 지정할 수 있게 만들기

 위에서 생성한 객체 a는 아직 아무런 기능을 하지 못한다. 이제 사칙연산(더하기, 빼기, 나누기, 곱하기)의 기능을 하는 객체를 만들어야 한다. 하지만 해당 기능을 갖춘 객체를 만들기 위해서 우선적으로 아래와 같이 객체 a에 사칙연산을 할 때 사용할 2개의 숫자를 지정할 수 있어야 된다.

a.setdata(4, 2)

 위 문장이 수행되기 위해서는 아래와 같이 pass라는 문장을 제거한 후 setdata라는 함수가 추가된 소스코드가 필요하다.

class FourCal():
    def setdata(self, first, second):   <---- 1. 메소드의 입력 인수
        self.first = first   <---- 2. 메소드의 수행문1
        self.second = second   <---- 2. 메소드의 수행문2

 

 클래스 함수를 다른 말로 메소드(Method)라고도 한다. 즉, setdata라는 함수는 FourCal 클래스의 메소드라 부른다. (다양한 특수 메소드가 존재하며 이런 특수 메소드에 관해서는 아래의 주소를 참고해서 시간이 될 때 따로 공부해보자...)

 

[번역] 파이썬 매직 메소드 (Python's Magic Methods) | ziwon.github.io

A guide to Python’s magic methods를 번역한 문서입니다. 서론 이 가이드는 몇 달 간의 블로그 게시물의 정점입니다. 주제는 매직 메소드(magic methods) 입니다. 매직 메소드가 뭘까요? 이들은 객체지향 파이썬의 모든 것입니다. 클래스에 “마법"을 추가하기 위해 정의할 수 있는 특수한 메소드입니다. 항상 두 개의 밑줄로 둘러싸입니다. (예: __init__ 또는 __lt__) 또한 필요한 만큼 문서화되지 않았습니다. 파이썬

ziwon.github.io

1. setdata 메소드의 입력 인수

 위에서 작성한 소스코드를 보면 setdata 메소드는 입력 인수로 self, first, second로 총 3개의 입력값을 받는다. 하지만 일반적인 함수와 달리 메소드의 첫 번째 입력 인수는 self라는 특별한 의미를 갖는 변수다.

a = FourCal()
a.setdata(4, 2)

 위와 같이 a라는 객체를 만든 다음 a.setdata(4. 2)를 실행하면 FourCal 클래스의 setdata 메소드가 호출된다. setdata 메소드의 첫 번째 인수에는 자동으로 a라는 인스턴스가 입력된다. 즉, setdata의 입력 인수는 총 3개지만 a.setdata(4, 2)와 같이 2개의 입력값만 있어도 a라는 인스턴스가 setdata 함수의 첫 번째 입력을 받는 변수인 self에 아래와 같이 자동으로 대입된다.

self: 객체 a, first: 4, second: 2

 

2. setdata 메소드의 수행문

 setdata 함수에서 아래와 같이 수행할 2개의 문장이 있다. 그리고 a.setdata(4, 2)로 인해 first는 4, second는 2 라는 것을 알 수 있다.

self.first = first (4)
self.second = second (2)

# 위 두 문장의 풀이
a.first = 4
a.second = 2

 여기서 self.first와 self.second의 의미는 당연히 a.first와 a.second가 된다. 이 설명을 풀어서 쓰면 위의 마지막 부분과 같으며 정말인지 확인하기 위해 출력해본 결과는 아래와 같다.

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

 만약 a가 아닌 다른 객체의 first 변수에 다른 숫자를 대입하더라도 객체 a의 first값이 4인 것은 변함이 없다. 각 객체는 모두 고유의 저장 영역을 가지고 있기 때문이다.

 

5.3. 더하기 기능 만들기

 앞서 설정한 2개의 값을 사용해 더하는 기능을 아래와 같이 클래스에 sum이라는 메소드를 추가하고 결과값을 출력해보자.

class FourCal():
    def setdata(self, first, second):
        self.first = first
        self.second = second
    def sum(self):
        result = self.first + self.second
        return result
        
a = FourCal()
a.setdata(4, 2)
print(a.sum())
6

 위의 소스코드에 추가된 result = self.first + self.second는 result = 4 + 2와 같다는 것을 앞선 설명들을 통해 금방 이해할 수 있다.

 

5.4. 빼기, 나누기, 곱하기 기능 만들기

 위 내용을 기초로 빼기(sub), 나누기(div), 곱하기(mul) 기능을 아래와 같이 클래스에 추가해 보자.

class FourCal():
    def setdata(self, first, second):
        self.first = first
        self.second = second
    def sum(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
    def mul(self):
        result = self.first * self.second
        return result

 이렇게 완성된 클래스에 객체 a와 b를 추가해서 제대로 작동하는지 확인해 보자.

a = FourCal()
b = FourCal()
a.setdata(4, 2)
b.setdata(3, 7)

print(a.sum())
6
print(a.sub())
2
print(b.div())
0
print(b.mul())
21

  객체 a와 b를 각각 2개씩 사칙연산 클래스에 적용시켜 봤다. 두 개의 객체는 서로 다른 저장 공간을 가지고 있기 때문에 완전히 독립적으로 동작하는 것을 알 수 있다. 이러한 의미로 파이썬은 객체 지향 프로그래밍 언어라고 불린다.

 

 

내용 출처: 책 '점프 투 파이썬'의 내용