CH 16 MyInteger Class

Read Me

MyIntegerClass

  • init()

    • MyInteger 객체의 초기화 값으로 사용하기 위한 입력 parameter를 하나 전달 받음
    • 입력 parameter가 주어지지 않으면 초기화 값으로 정수 0을 사용
    • 입력 parameter는 정수(int), 문자열(str), 실수(float) 및 MyInteger 객체를 입력 받을 수 있음
    • 입력 parameter가 정수가 아닌 문자열 혹은 실수 혹은 MyInteger 객체인 경우는 내부적으로 정수로 변환하여 초기화 값으로 사용함
    • 입력 parameter가 정수/실수/문자열 혹은 MyInteger 객체가 아닌 경우는 초기화 값을 정수 0으로 설정함
    • 이렇게 초기화된 값(이후 current value로 칭함)은 pressAdd()와 pressSub()를 통해서 업데이트 함
  • eq()

    • Python의 object 클래스의 기본 method를 개선
    • MyInterger 클래스 기반 객체를 정수/실수/문자열/MyInteger객체와 비교한 결과를 True/False 중 하나로 return 함
    • 실수와 비교하는 경우는, 실수 값을 정수 값으로 변환하여 비교
    • 문자열과 비교하는 경우는, 문자열을 정수 값으로 변환하여 비교
    • 정수/실수/문자열/MyInteger객체 외 타입의 값과 비교 시에는 False를 return 함
  • pressAdd()

    • 정수/실수/문자열/MyInteger객체 하나를 입력 parameter로 전달 받아 정수 값으로 변경한 후, MyInteger 객체의 current value에 해당 정수 값을 추가
    • Return 값으로 입력 parameter 만큼의 값을 더한 후의, MyInteger 객체의 current value를 return 함
  • pressSub()

    • 정수/실수/문자열/MyInteger객체 하나를 입력 parameter로 전달 받아 정수 값으로 변경한 후, MyInteger 객체의 current value에서 해당 정수 값을 뺌
    • Return 값으로 입력 parameter 만큼의 값을 뺀 후의, MyInteger 객체의 current value를 return 함
  • getCurrentVariable()

    • 동작 모드를 입력 parameter로 조정
    • 동작 모드를 조정하는 입력 parameter를 주지 않는 경우는, MyInteger 객체의 (10진법 기반 정수 타입인) current value를 return
    • 입력 parameter가 문자열 “hex”인 경우는, MyInteger 객체의 current value를 16진법으로 변환한 문자열을 return
    • 입력 parameter가 문자열 “oct”인 경우는, MyInteger 객체의 current value를 8진법으로 변환한 문자열을 return
    • 입력 parameter가 문자열 “bin”인 경우는, MyInteger 객체의 current value를 2진법으로 변환한 문자열을 return
    • 이때 16진법은 0x로 시작하고(0는 아라비아 숫자 0, x는 알파벳 소문자), 8진법은 0o(0는 아라비아 숫자 0, o는 알파벳 소문자)로, 그리고 2진법은 0b(0는 아라비아 숫자 0, b는 알파벳 소문자)로 시작
    • 예를 들어, 10진법으로 ‘100’은 16진법으로 ‘0x64’, 8진법으로 ‘0o144’, 이진법으로 ‘0b1100100’을 return함
  • resetCurrentVariable()

    • MyInteger 객체의 current value를 0으로 하고, 값 변경 이력을 삭제함
    • Return 값으로는, 초기화 한, MyInteger 객체의 current value를 return 함
  • rollbackCurrentVariable()

    • MyInteger 객체의 current value를 직전에 수행한 pressAdd() 혹은 pressSub() 동작 이전으로 복귀시킴
    • 즉, MyInteger 객체를 초기화 값 0으로 만든 후, pressAdd(1), pressAdd(2)를 연달아 수행한 경우에 대해서, MyInteger 객체의 current value는 3
    • 이때 rollbackCurrentVariable()를 수행한 후, MyInteger 객체의 current value를 확인하면, pressAdd(2) 이전의 상태로 MyInteger의 current value를 돌이켜서, MyInteger 객체의 current value를 1로 설정함
    • pressAdd() 혹은 pressSub() 동작을 수행한 횟수보다 많은 rollbackCurrentVariable()를 호출하는 경우는 MyInteger 객체의 current value를 처음의 초기화 값으로 유지함
    • Return 값으로는, rolling back 한, MyInteger 객체의 current value를 return 함

Code

solution

class MyInteger:
    def __init__(self, value=0):
        self.currentValue = []
        if(type(value) in [int, float, str, MyInteger]):
            self.currentValue.append(int(value))
        else:
            self.currentValue.append(0)

    def __eq__(self, other):
        if(len(self.currentValue) == len(other.currentValue)):
            for i in range(0, len(self.currentValue)):
                if int(self.currentValue[i]) != int(other.currentValue[i]):
                    return False    
        else:
            return False

    def pressAdd(self, addvalue):
        if (type(addvalue) in [int, float, str, MyInteger]):
            self.currentValue.insert(0, self.currentValue[0] + int(addvalue))
            return self.currentValue[0]

    def pressSub(self, subvalue):
        if (type(subvalue) in [int, float, str, MyInteger]):
            self.currentValue.insert(0, self.currentValue[0] - int(subvalue))
            return self.currentValue[0]

    def getCurrentVariable(self, motion=None):
        if (motion == None):
            return self.currentValue[0]
        elif (motion == "hex"):
            hexnum = hex(int(self.currentValue[0]))
            return hexnum
        elif (motion == "oct"):
            octnum = oct(int(self.currentValue[0]))
            return octnum
        elif (motion == "bin"):
            binnum = bin(int(self.currentValue[0]))
            return binnum
    
    def resetCurrentVariable(self):
        for i in range(0, len(self.currentValue)):
            self.currentValue[i] = 0
        return self.currentValue[0]

    def rollbackCurrentVariable(self):
        if(len(self.currentValue) > 0):
            del self.currentValue[0]
            return self.currentValue[0]
        else:
            self.resetCurrentVariable()
            return self.currentValue[0]

test

from MyInteger import *
if __name__ == '__main__':
    ### MyInteger Class ###
    print("MyInteger Class")
    print()

    # __init__ method 
    print("Concstructor method")
    myint1 = MyInteger()
    myint2 = MyInteger(3)
    print("myint1:", myint1.currentValue)
    print("myint2:", myint2.currentValue)
    print()

    # __eq__ method
    print("Equally Compare method")
    print(myint1 == myint2)
    print()

    # pressAdd method
    print("pressAdd method")
    print("After adding:", myint1.pressAdd(77))
    print(myint1.currentValue)
    print()

    # pressSub method
    print("pressSub method")
    print("After subtract:", myint1.pressSub(2))
    print(myint1.currentValue)
    print()

    # getCurrentVariable method
    print("getCurrentVariable method")
    print("Option is None:", myint1.getCurrentVariable())
    print("Option is hex:", myint1.getCurrentVariable("hex"))
    print("Option is oct:", myint1.getCurrentVariable("oct"))
    print("Option is bin:", myint1.getCurrentVariable("bin"))
    print()

    # resetCurrentVariable method
    print("resetCurrentVariable method")
    print(myint1.resetCurrentVariable())
    print(myint1.currentValue)
    print()

    # rollbackCurrentVariable method
    print("rollbackCurrentVariable method")
    myint1.currentValue[0] = 75
    myint1.currentValue[1] = 77
    print(myint1.rollbackCurrentVariable())
    print(myint1.currentValue)
    print()

좋은 웹페이지 즐겨찾기