이전 포스팅에서 클래스와 인스턴스에 대해서 알아보았습니다. 이번 포스팅에서는 클래스와 인스턴스 기초 문법에 대해 이야기해보겠습니다.

 

이번에는 숫자로 간단한 연산을 할 수 있는 계산기를 클래스로 구현해 보겠습니다. 데이터는 숫자이고 메소드(함수) 는 연산기능이라 할 수 있습니다.

 

한 가지 도움되는 팁을 드리자면, 다루는 데이터가 어떤 데이터인지, 그 데이터로 어떤 작업을 해야할 것인지 정리 후 코드를 짤지 생각을 한다면 클래스를 다룰 때 좀 더 쉽게 이해를 할 수 있을 것입니다.


1. 클래스 설계하기

코드를 짜기 전 이 코드가 어떤 목적으로 하는지, 어떻게 동작을 하는지 정해놓는지 확실하게 정해놓는것이 필수입니다.

 

계산기 클래스를 쓸 것이므로, 어떤 데이터를 다룰 것인지, 어떤 작업을 할 것인지 정해둡시다.

1.1 어떤 데이터를 다루는가?

보통 계산기는 정수 및 유리수를 사용하므로 간단하게 유리수를 다룬다고 정하겠습니다.

  • 데이터 : float 형

1.2 어떤 작업을 할 것인가?

간단하게 덧셈, 곱셈, 뺄셈, 나눗셈, 계산이력을 출력하는 기능 5개를 구현해보겠습니다. 따라서 구현할 메소드는 다음과 같습니다.

  • 메소드1: 덧셈(add) - 기존 데이터에 새로운 숫자를 더함
  • 메소드2: 곱셈(mult) - 기존 데이터에 새로운 숫자를 곱함
  • 메소드3: 뺼셈(sub) - 기존 데이터에 새로운 숫자를 뺌
  • 메소드4: 나눗셈(div) - 기존 데이터에 새로운 숫자를 나눔
  • 메소드5: 계산이력(record) - 이제까지 계산한 기록을 문자열로 반환(return)

2. 클래스 및 인스턴스 선언하기

 

클래스를 선언하는 방법은 다음과 같습니다.

# 계산기 클래스 선언
class Calculator(object):
    pass

# 괄호 내 object 생략 가능
class Calculator():
    pass

# 괄호 생략 가능
class Calculator:
    pass

 

인스턴스는 다음과 같이 생성할 수 있습니다. 인스턴스를 생성한다는 것은, 클래스에서 정한 방법대로 데이터를 관리하는 객체를 만든다는 것 입니다.

cal1 = Calculator()
cal2 = Calculator()
...

변수를 정의할때 클래스를 호출하는 것으로 쉽게 여러개의 인스턴스를 만들 수 있습니다.


3. 내부 변수 정의하기

 

변수와 함수를 한데 묶어서 관리하므로, 당연히 내부에서 사용되는 변수를 정의할 수 있습니다.

class Calculator(object):
    name = 'Simple Calculator'
    funtion = 'add, mult, sub, div, record'

 

내부 변수를 정의하면, 해당 클래스로 만들어진 인스턴스는 변수 값을 그대로 포함합니다.

cal1 = Calculator()

print(cal1.name)
-> Simple Calculator

4. 메소드 정의하기

 

변수와 함수를 한번에 묶어서 관리하기 때문에, 클래스는 선언 시 변수와 함수도 한번에 선언합니다. 이 때, 클래스 내부에서 사용되는 함수는 메소드(Method) 라는 이름을 가집니다.

 

메소드는 클래스 내부에서 다음과 같이 정의할 수 있습니다.

class Calculator(object):
    name = 'Simple Calculator'
    funtion = 'add, mult, sub, div, record'
	
    # 메소드(method) 정의
    def method_example(self):
        print("method example")
        return None

간단하게 method_example 이라는 메소드를 정의했습니다. 이 메소드는 실행 시 'method example' 이라는 문자열을 출력하고, None 값을 return 합니다.

 

인스턴스 생성 후, 클래스 내부 함수인 메소드는 다음과 같이 실행합니다.

cal1 = Calculator()

# 인스턴스 생성 후 메소드 실행
cal1.method_example()
-> method example 출력

5. 초기화 메소드와 인스턴스 속성 정의

 

클래스는 처음 정의 후 실행 시 초기화 메소드가 실행됩니다. 이 때 인스턴스가 어떤 변수들을 가지는지 정할 수 있으며, 이를 인스턴스 속성 또는 어트리뷰트(attribute) 라고 합니다.

 

초기화 함수를 정의해 보겠습니다.

class Calculator(object):
    name = 'Simple Calculator'
    funtion = 'add, mult, sub, div, record'

    # 초기화 메소드 __init__ 정의
    def __init__(self):
        pass

'__init__' 을 통해 초기화 함수를 정의할 수 있습니다.

 

초기화 메소드를 정의 할 시 self 옆에 필요 변수를 선언하고, 아래 'self.~' 으로 인스턴스 속성을 정의할 수 있습니다.

class Calculator(object):
    name = 'Simple Calculator'
    funtion = 'add, mult, sub, div, record'

    # 초기화 메소드 __init__ 정의 및 인스턴스 속성 self.number 정의
    def __init__(self, number):
        self.number = number

인스턴스 선언시 변수 number 를 self.number 로 처음 인스턴스 속성을 선언해 놓으면, 이후 필요한 메소드에도 공유되어 self.number 를 활용할 수 있습니다.

 

초기화 함수 정의 시 필요 변수의 기본 값을 정해놓을 수도 있습니다.

class Calculator(object):
    name = 'Simple Calculator'
    funtion = 'add, mult, sub, div, record'

    # 초기화 메소드 __init__ 정의 및 인스턴스 속성 self.number 정의(기본값=0)
    def __init__(self, number=0):
        self.number = number

 

인스턴스 선언 시 다음과 같이 인스턴스 속성을 정의할 수 있습니다.

# 인스턴스 선언시 number=8 로 정의함
cal1 = Calculator(number=8)

print(cal1.number)
-> 8

6. 연산 메소드 구현하기

이제 차례대로 덧셈, 곱셈, 뺄셈, 나눗셈 메소드를 구현해 봅시다. 처음 입력된 숫자인 number 가 인스턴스 속성으로 공유되니, 이를 활용해하면 될 것 같습니다.

 

예를 들어, 덧셈의 경우 기존에 인스턴스에 있던 숫자와 새로운 숫자를 더하는 연산이므로, self.number + 새로운 숫자로 구현하면 될 것 같습니다.

class Calculator(object):
    name = 'Simple Calculator'
    funtion = 'add, mult, sub, div, record'

    # 초기화 메소드 __init__ 정의 및 인스턴스 속성 self.number 정의
    def __init__(self, number=0):
        self.number = number

    # 덧셈 메소드 
    def add(self, new_number):
        self.number += new_number

add 함수의 목적은 기존에 존재하는 인스턴스 속성인 self.number 를 조작하는 것이어서, 위와 같이 return 을 생략하였습니다.

 

인스턴스 선언 후 add 메소드를 사용해보겠습니다.

cal1 = Calculator(number=8)

# 메소드 add 사용
cal1.add(new_number=2)
print(cal1.number)
-> 10

 

나머지 연산도 마찬가지로 구현해 보겠습니다.

class Calculator(object):
    name = 'Simple Calculator'
    funtion = 'add, mult, sub, div, record'

    # 초기화 메소드 __init__ 정의 및 인스턴스 속성 self.number 정의
    def __init__(self, number=0):
        self.number = number

    # 덧셈 메소드 
    def add(self, new_number):
        self.number += new_number
    
    # 곱셈 메소드
    def mult(self, new_number):
        self.number *= new_number
	
    # 뺄셈 메소드
    def sub(self, new_number):
        self.number -= new_number
	
    # 나눗셈 메소드
    def div(self, new_number):
        self.number /= new_number

7. 계산이력 메소드 구현 및 기존 코드 수정

이제 계산 이력이 모인 메소드를 구현해 보겠습니다. 아마도 이전에 활용했던 인스턴스 속성을 활용하면 될 것 같습니다.

 

저는 문자열을 계속 더하는 식으로 인스턴스 속성을 구현해 보겠습니다. 그리고 인스턴스 속성을 return 하는 메소드를 만들겠습니다.

class Calculator(object):
    name = 'Simple Calculator'
    funtion = 'add, mult, sub, div, print_record'

    def __init__(self, number=0):
        self.number = number
        # 문자열 인스턴스 속성 self.recode 정의
        self.recode = str(number)

    def add(self, new_number):
        self.number += new_number
    
    def mult(self, new_number):
        self.number *= new_number

    def sub(self, new_number):
        self.number -= new_number

    def div(self, new_number):
        self.number /= new_number

    # 계산 이력 인스턴스 속성인 self.recode 를 return
    def return_recode(self):
        return self.recode

 

계산이력을 위한 인스턴스 속성 self.recode 를 정의했으니, 나머지 연산 메소드에 self.recode 를 이용하여 연산 기록을 하면 될 것 같습니다. 간단하게 문자열 덧셈을 활용하여 구현해보겠습니다.

추가적으로, return_recode 메소드도 현재 self.number 를 포함해서 문자열을 return 하게 수정했습니다.

 

class Calculator(object):
    name = 'Simple Calculator'
    funtion = 'add, mult, sub, div, print_record'

    def __init__(self, number=0):
        self.number = number
        self.recode = str(number)

    def add(self, new_number):
        self.number += new_number
        self.recode += f' +{new_number}'
    
    def mult(self, new_number):
        self.number *= new_number
        self.recode += f' *{new_number}'

    def sub(self, new_number):
        self.number -= new_number
        self.recode += f' -{new_number}'

    def div(self, new_number):
        self.number /= new_number
        self.recode += f' /{new_number}'

    # 계산 이력 및 현재 number 문자열 return
    def return_recode(self):
        return f'{self.recode} = {self.number}'

 

인스턴스 선언 후 메소드들을 사용해보면 다음과 같습니다.

cal1 = Calculator(3)

cal1.add(6)
cal1.sub(1)
cal1.mult(2)
cal1.div(4)

num_string = cal1.return_recode()
print(num_string)
-> 3 +6 -1 *2 /4 = 4.0

이렇게 클래스와 인스턴스의 기초 문법에 대해 알아보고 이를 활용하여 어떻게 클래스와 인스턴스를 정의하는지, 인스턴스 속성과 메소드를 어떻게 활용하는지 다루었습니다. 이번 포스팅으로 조금이나마 도움이 되었으면 합니다.

'Python' 카테고리의 다른 글

python ~ indexing  (0) 2023.07.18
Class 와 Instance  (0) 2023.07.12

BELATED ARTICLES

more